วาดวงกลมหน่วย (แปลก) ฉัน!


20

บทนำ

คุณอาจรู้จักและชื่นชอบวงรอบหน่วยปกติของคุณ แต่ mathematicans จะบ้าและทำให้พวกเขาได้ใจลอยแนวคิดไปยังจุดใด ๆ x*x+y*y=1ที่น่าพอใจ เพราะ Cryptographers 1ก็แปลกพวกเขาชอบฟิลด์ จำกัด และบางครั้งวงแหวน จำกัด (มันไม่เหมือนที่พวกเขามีทางเลือกมาก) ดังนั้นลองรวมกัน!

ความท้าทาย

อินพุต

จำนวนเต็มบวกมากกว่าหนึ่งในการเข้ารหัสที่คุณชื่นชอบ เรียกหมายเลขนี้กัน

เอาท์พุต

คุณจะเอาท์พุท "รูปภาพ" (ซึ่งประกอบด้วย n คูณ n ตัวอักษร) ของหน่วยวงกลมปรับเปลี่ยนจำนวนเต็มอินพุตเป็น ASCII-Art โดยใช้ "X" (ละตินตัวพิมพ์ใหญ่) และ "" (ช่องว่าง) อนุญาตให้เว้นวรรคต่อท้ายและขึ้นบรรทัดใหม่

รายละเอียดเพิ่มเติม

คุณต้องขยายระบบพิกัดจากล่างซ้ายไปขวาบน เมื่อใดก็ตามที่จุดเป็นไปตามสมการวงกลมให้วาง 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

Haskell , 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 เป็นรูปแบบที่สั้นลง รายการประเมินความเข้าใจในรายชื่อของสตริงที่จะกลายเป็น newline เดียวแยกออกจากกันโดยสตริง[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

Mathematica, 56 48 ไบต์

แก้ไข: ขอบคุณ Greg Martin และ Martin Ender สำหรับการบันทึก 8 ไบต์

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:)
เกร็กมาร์ติน

1
ฉันคิดว่าคุณน่าจะดีกว่าด้วยArrayและNorm:Grid@Array[If[Mod[Norm@{##}^2,x]==1,X]&,{x=#,#},0]&
Martin Ender

2
ยังคิดใหม่#^2+#2^2อยู่... สั้นที่สุด
Martin Ender

@GregMartin ดังนั้นถ้าอาร์กิวเมนต์แรกIfไม่เป็นTrueหรือFalseคุณต้องอาร์กิวเมนต์ที่สี่หรือมันยังคงอยู่ unevaluated แต่ผลตอบแทน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

เยลลี่ , 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

Python 3 ( 102 98 95 ไบต์)

แกน y กลับด้าน

n=int(input());r=range(n);p=print
for i in r:
 for j in r:p(end=' 'if(i*i+j*j)%n-1else'X')
 p()

ลองออนไลน์!

  • บันทึกแล้ว 4 ไบต์: ละเว้นตัวแปร c ใน c = '' if (i i + j j)% n-1else'X '
  • บันทึกแล้ว 3 ไบต์: ขอบคุณovs (คำสั่งพิมพ์ที่แก้ไขแล้ว)

1
p(end=' 'if(i*i+j*j)%n-1else'X')for 95 bytes
ovs

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")

Linebreak เพื่อให้อ่านง่าย

ลองออนไลน์!

ไม่สั้นที่สุด ฉันคิดว่าฉันต้องการโมดูลชวเลขบางประเภท ดูลิงก์ทดลองใช้ออนไลน์สำหรับคำอธิบายเพิ่มเติมรุ่นที่ไม่ได้บรรจุและการทดสอบบางอย่าง เพื่อผลลัพธ์ที่ดีที่สุดให้ขยายหน้าต่างเอาต์พุตเพื่อดูเพิ่มเติม



1

GNU APL , 41 ตัวอักษร, 59 ไบต์

อ่านจำนวนเต็มและแสดงวงกลม

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

Ungolfed

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

Haskell, 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ด้วย a <$>, ใช่ไหม?
k_g

ถ้าฉันไม่ตีความกฎคำถามผิดฉันไม่คิดว่าคุณต้องการทุกสิ่งที่ I / O - การเล่นกอล์ฟ I / O บน PPCG มีค่าเริ่มต้นพิเศษที่อนุญาตให้มีภาษาให้มากที่สุดเท่าที่จะเป็นไปได้ ตัวอย่างเช่นฟังก์ชันหลักของคุณสามารถรับอาร์กิวเมนต์จำนวนเต็มและส่งคืนสตริง
Ørjan Johansen

@k_g ใช่ขอบคุณ
ชื่อที่แสดงทั่วไป

@ ØrjanJohansenตั้งข้อสังเกตไว้อย่างถูกต้อง :)
ชื่อที่แสดงทั่วไป


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.