나에게 (이상한) 단위 원을 그려라!


20

소개

정상적인 단위 서클을 알고 사랑할 수 있습니다. 그러나 수학자들은 미쳤 기 때문에 개념을 만족시키는 모든 지점으로 추상화했다 x*x+y*y=1. 암호 학자 때문에 1 도 이상, 그들은 사랑 유한 필드와 때때로 그래서이 결합하자, 유한 링 (그들은 선택의 여지하지만이처럼이 아닌)!

도전

입력

선호하는 인코딩에서 1보다 큰 양의 정수. 이 번호를 n이라고합시다.

산출

"X"(대문자 라틴 X) 및 ""(공백)을 사용하여 단위 정수의 "picture"(n 곱하기 n 문자로 구성된 n)를 입력 정수를 ASCII-Art로 출력합니다. 후행 공백과 개행이 허용됩니다.

자세한 내용은

왼쪽 하단에서 오른쪽 상단으로 좌표계를 확장해야합니다. 점이 원 방정식을 충족 할 때마다 위치에 X를 배치하고 그렇지 않으면 공백을 배치합니다.

원 경계의 일부로 간주되는 포인트의 조건은 다음과 같습니다
mod(x*x+y*y,n)==1.

다음은 좌표계에 대한 간단한 설명입니다.

(0,4)(1,4)(2,4)(3,4)(4,4)
(0,3)(1,3)(2,3)(3,3)(4,3)
(0,2)(1,2)(2,2)(3,2)(4,2)
(0,1)(1,1)(2,1)(3,1)(4,1)
(0,0)(1,0)(2,0)(3,0)(4,0)

도움이된다면 축의 방향을 뒤집을 수도 있지만 예제에서는이 방향을 가정합니다.

누가 이겼어?

이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다! 기본 I / O 방법 만 허용 되며 모든 표준 허점이 금지됩니다.

입력 : 2

X 
 X

입력 : 3

X  
X  
 XX

입력 : 5

X    


X    
 X  X

입력 : 7

X      
  X  X 


  X  X 
X      
 X    X

입력 : 11

X          

     XX    

   X    X  
   X    X  

     XX    

X          
 X        X

입력 : 42

X                                         
         X                       X        


            X                 X           
       X                           X      
      X                             X     
                     X                    
  X             X         X             X 


     X             X   X             X    
X                                         
               X           X              
              X             X             
         X                       X        


            X                 X           
                     X                    
        X           X X           X       
                     X                    
            X                 X           


         X                       X        
              X             X             
               X           X              
X                                         
     X             X   X             X    


  X             X         X             X 
                     X                    
      X                             X     
       X                           X      
            X                 X           


         X                       X        
X                                         
 X           X               X           X

1 궁금한 점이 있으면 내 프로필을 살펴 보는 것이 좋습니다.


내 의견으로는 도메인 [0, n]을 사용하면 훨씬 좋아 보인다. 다음 은 입력 42의 예입니다.
R. Kap

"표준 I / O"는 기본 I / O 방법을 의미합니까, 아니면 실제 STDIN / STDOUT을 의미합니까? 나는 전자를 가정하고 있지만 아래의 누군가가 그것을 후자로 해석했다고 생각합니다.
Ørjan Johansen

@ ØrjanJohansen은 실제로 전자입니다.
SEJPM

선행 개행이 허용됩니까?
fergusq

@fergusq는 출력 방식을 눈에 띄게 변경합니다.
SEJPM

답변:




3

하스켈 , 68 바이트

f n|r<-[0..n-1]=unlines[[last$' ':['X'|mod(x*x+y*y)n==1]|y<-r]|x<-r]

온라인으로 사용해보십시오! y 축이 뒤집 힙니다. 사용법 : f 42줄 바꿈으로 구분 된 문자열을 반환합니다.

이 두 중첩 된 지능형리스트입니다 x및이 y범위에서 그려집니다 [0..n-1]. last$' ':['X'|mod(x*x+y*y)n==1]의 짧은 형식입니다 if mod(x*x+y*y)n==1 then 'X' else ' '. 리스트 이해는로 줄 바꿈으로 구분 된 단일 문자열로 바뀌는 문자열리스트로 평가됩니다 unlines.


3

매스 매 티카, 56 48 바이트

편집 : 8 바이트를 절약 한 Greg Martin과 Martin Ender에게 감사드립니다.

Grid@Array[If[Mod[#^2+#2^2,x]==1,X]&,{x=#,#},0]&

독창적 인 솔루션 :

Grid@Table[If[Tr[{i-1,j-1}^2]~Mod~#==1,X,],{i,#},{j,#}]&

재미있는 말 : X:) 뒤에 쉼표가 필요하지 않습니다
Greg Martin

1
난 당신이 더 나은와 떨어져 있다고 생각 Array하고 Norm:Grid@Array[If[Mod[Norm@{##}^2,x]==1,X]&,{x=#,#},0]&
마틴 청산

2
아직도 그것을 너무 생각하고 ... #^2+#2^2가장 짧습니다.
Martin Ender

@GregMartin 따라서 첫 번째 인수 IfTrueor이거나 둘 다 아닌 False경우 네 번째 인수가 필요하거나 평가되지 않은 상태로 있지만를 If[False,_]반환합니다 Null. 기묘한.
ngenisis

@MartinEnder 처음에 시도 Array했지만 인수를 변수로 설정 하려고 생각하지 않았습니다.
ngenisis

2

CJam , 23 바이트

ri:X,2f#_ff{+X%(S'X?}N*

온라인으로 사용해보십시오!

ri:X    e# Read input, convert to integer, store in X.
,       e# Turn into range [0 1 ... X-1].
2f#     e# Square each value in the range.
_ff{    e# 2D map over all pairs from that list.
  +     e#   Add the two values in the current pair.
  X%    e#   Take the sum modulo X.
  (     e#   Decrement, so that x^2+y^2==1 becomes 0 (falsy) and everything
        e#   else becomes truthy.
  S'X?  e#   Select space of 'X' accordingly.
}
N*      e# Join rows with linefeeds.

2

자바 스크립트 (ES6), 81 바이트

f=
n=>[...Array(n)].map((_,x,a)=>a.map((_,y)=>(x*x+y*y)%n-1?` `:`X`).join``).join`
`
<input type=number oninput=o.textContent=f(+this.value)><pre id=o>

Y 축은 OP의 반대입니다.


2

로다 , 74 바이트

f n{seq n-1,0|{|y|seq 0,n-1|{|x|["X"]if[(x^2+y^2)%n=1]else[" "]}_;["
"]}_}

온라인으로 사용해보십시오!

언 골프 드 :

function f(n) {
    seq(n-1, 0) | for y do
        seq(0, n-1) | for x do
            if [ (x^2 + y^2) % n = 1 ] do
                push("X")
            else
                push(" ")
            done
        done
        print("")
    done
}


2

젤리 , 14 13 바이트

R²+þ`%=1ị⁾X Y

x 축이 반전됩니다.

온라인으로 사용해보십시오!

작동 원리

R²+þ`%=1ị⁾X Y  Main link. Argument: n

R              Range; yield [1, ..., n].
 ²             Square; yield [1², ..., n²].
  +þ`          Self table addition; compute x+y for all x and y in [1², ..., n²],
               grouping by the values of y.
     %         Take all sums modulo n.
      =1       Compare them with 1, yielding 1 or 0.
        ị⁾X    Index into "X ".
            Y  Separate by linefeeds.


1

MATL , 13 바이트

:qU&+G\1=88*c

원점이 왼쪽 상단에 있습니다. 따라서 도전 과제의 예와 비교하여 출력이 거꾸로 뒤집 힙니다.

에서보십시오 MATL 온라인 !

설명

:      % Input n implicitly. Push [1 2 ... n]
q      % Subtract one (element-wise)
U      % Square (element-wise)
&+     % Matrix of pairwise sums
G      % Push n
\      % Modulo
1=     % Equal to 1? (element-wise)
88*    % Multiply by 88 (ASCII code of 'X')
c      % Convert to char. Char 0 will be displayed as a space
       % Display implicitly


1

Lithp , 125 바이트

#N::((join(map(seq(- N 1)0)(scope #Y::((join(map(seq 0(- N 1))(scope #X::
((?(== 1(@(+(* X X)(* Y Y))N))"X" " "))))""))))"\n")

가독성을위한 줄 바꿈.

온라인으로 사용해보십시오!

최단이 아닙니다. 나는 일종의 속기 모듈이 필요하다고 생각합니다. 자세한 설명, ungolfed 버전 및 일부 테스트는 온라인 사용해보기 링크를 참조하십시오. 최상의 결과를 얻으려면 출력 창을 확장하여 자세한 내용을보십시오.



1

GNU APL , 41 자, 59 바이트

정수를 읽고 원을 표시합니다.

N←⎕◊⌽{(⍵+1)⊃' ' 'X'}¨{1=(N|(+/⍵*2))}¨⍳N N

언 골프

N←⎕
⌽                           ⍝ flip the X axis so 0,0 is bottom left
{
    (⍵+1) ⊃ ' ' 'X'         ⍝ substitute space for 0, X for 1
} ¨ {
    1=(N|(+/⍵*2))           ⍝ mod(x*x+y*y, 1)==1
} ¨ ⍳N N                    ⍝ generate an NxN grid of coordinates

0

하스켈, 115 바이트

n#(a,b)|mod(a*a+b*b)n==1='X'|1>0=' '
m n=map(n#)<$>zipWith(zipWith(,))(replicate n[0..n-1])(replicate n<$>[0..n-1])

y 축이 반전됩니다.

온라인으로 사용해보십시오!

그 모든 괄호는 나를 귀찮게합니다 ...

설명

n#(a,b)|mod(a*a+b*b)n==1='X'|1>0=' '
n#(a,b)                                 --Operator #, takes a number n and a tuple (a,b)
       |mod(a*a+b*b)n==1                --Test if the mod equals 1
                        ='X'            --If so, return 'X'
                            |1>0=' '    --Otherwise, return ' '

m n=map(n#)<$>zipWith(zipWith(,))(replicate n[0..n-1])(replicate n<$>[0..n-1])
m n=                                                                           --Make a new function m with argument n
                                 (replicate n[0..n-1])                         --Make a list of [[0,1,2,3..n-1],[0,1,2,3..n-1],(n times)]
                                                      (replicate n<$>[0..n-1]) --Make a list of [[0,0,0(n times)],[1,1,1(n times)]..[n-1,n-1,n-1(n times)]
              zipWith(zipWith(,))                                              --Combine them into a list of list of tuples
    map(n#)<$>                                                                 --Apply the # operator to every tuple in the list with the argument n

마지막 map을으로 바꿀 수 <$>있습니까?
k_g

질문 규칙을 잘못 해석하지 않는 한 PPCG의 I / O- 골프 I / O에 최대한 많은 언어를 참여시킬 수있는 특별한 기본값 이 있다고 생각하지는 않습니다 . 예를 들어 주 함수는 정수 인수를 사용하여 문자열을 반환 할 수 있습니다.
Ørjan Johansen

@k_g yes 감사합니다
일반 표시 이름

@ ØrjanJohansen 정식으로 지적 :)
일반 표시 이름


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.