Gambarkan aku lingkaran unit (aneh)!

20

pengantar

Anda mungkin tahu dan menyukai lingkaran unit normal Anda. Tetapi para matematik itu gila dan dengan demikian mereka mengabstraksikan konsep itu ke titik mana pun yang memuaskan x*x+y*y=1. Karena Cryptographers 1 juga aneh, mereka suka bidang terbatas dan terkadang cincin terbatas (tidak seperti mereka punya banyak pilihan), jadi mari kita gabungkan ini!

Tantangan

Memasukkan

Bilangan bulat positif lebih besar dari satu dalam penyandian favorit Anda. Sebut nomor ini n.

Keluaran

Anda akan menampilkan "gambar" (yang terdiri dari n kali n karakter) dari lingkaran unit modulo input integer sebagai ASCII-Art menggunakan "X" (huruf latin X) dan "" (spasi). Ruang tambahan dan baris baru diizinkan.

Keterangan lebih lanjut

Anda harus menjangkau sistem koordinat dari kiri bawah ke kanan atas. Setiap kali sebuah titik memenuhi persamaan lingkaran, tempatkan X di posisi, jika tidak tempatkan spasi.

Kondisi titik untuk dianggap sebagai bagian dari perbatasan lingkaran adalah:
mod(x*x+y*y,n)==1.

Berikut ilustrasi singkat sistem koordinat:

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

Jika ini membantu Anda, Anda juga dapat membalikkan arah sumbu mana pun, tetapi contoh-contohnya mengambil orientasi ini.

Yang menang?

Ini adalah sehingga kode terpendek dalam byte menang! Hanya metode I / O default yang diizinkan dan semua celah standar dilarang.

Contohnya

Input: 2

X 
 X

Input: 3

X  
X  
 XX

Input: 5

X    


X    
 X  X

Input: 7

X      
  X  X 


  X  X 
X      
 X    X

Input: 11

X          

     XX    

   X    X  
   X    X  

     XX    

X          
 X        X

Masukan: 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 Saya sarankan Anda melihat profil saya jika Anda bertanya-tanya di sini.

SEJPM
sumber
Terlihat jauh lebih baik jika Anda menggunakan domain [0, n] menurut saya. Berikut adalah contoh dengan input 42.
R. Kap
Dengan "standar I / O" maksud Anda metode I / O standar, atau maksud Anda STDIN / STDOUT yang sebenarnya? Saya berasumsi yang pertama, tapi saya pikir seseorang di bawah ini menafsirkannya sebagai yang terakhir.
Ørjan Johansen
@ ØrjanJohansen memang mantan.
SEJPM
Apakah baris baru sebelumnya diizinkan?
fergusq
@fergusq karena mereka akan (secara drastis) mengubah angka output dengan cara yang terlihat, tidak.
SEJPM

Jawaban:

6

Bash + GNU Utilities, 59

x={0..$[$1-1]}d*
eval echo $x$x+$1%1-0r^56*32+P|dc|fold -$1

Input ndiberikan sebagai parameter baris perintah. Sumbu-y terbalik.

Cobalah online .

Trauma Digital
sumber
4

Oktaf , 45 44 byte

@(n)[(mod((x=(0:n-1).^2)+x',n)==1)*56+32,'']

Cobalah online!

cacat
sumber
Ini juga bekerja: @(n)[(mod((x=(0:n-1).^2)+x',n)==1)*88,'']. Dalam sistem tertentu Oktaf memperlakukan karakter 0sebagai ruang
Luis Mendo
3

Haskell , 68 byte

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

Cobalah online! Sumbu y dibalik. Penggunaan: f 42mengembalikan string yang dibatasi baris baru.

Ini adalah pemahaman daftar bersarang di mana keduanya xdan ydiambil dari jangkauan [0..n-1]. last$' ':['X'|mod(x*x+y*y)n==1]adalah bentuk yang lebih pendek dari if mod(x*x+y*y)n==1 then 'X' else ' '. Pemahaman daftar mengevaluasi ke daftar string yang diubah menjadi string yang dipisahkan oleh baris baru oleh unlines.

Laikoni
sumber
3

Mathematica, 56 48 byte

Sunting: Terima kasih kepada Greg Martin dan Martin Ender karena telah menghemat 8 byte.

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

Solusi asli:

Grid@Table[If[Tr[{i-1,j-1}^2]~Mod~#==1,X,],{i,#},{j,#}]&
ngenisis
sumber
Komentar lucu: Anda tidak perlu koma setelah X:)
Greg Martin
1
Saya pikir Anda lebih baik dengan Arraydan Norm:Grid@Array[If[Mod[Norm@{##}^2,x]==1,X]&,{x=#,#},0]&
Martin Ender
2
Masih terlalu memikirkannya ... #^2+#2^2adalah yang terpendek.
Martin Ender
@GregMartin Jadi jika argumen pertama Ifbukan Trueatau False, Anda memerlukan argumen keempat atau tetap tidak dievaluasi, tetapi If[False,_]kembali Null. Aneh.
ngenisis
@ MartinEnder Saya awalnya mencoba Arraytetapi tidak berpikir untuk mengatur argumen ke variabel.
ngenisis
2

CJam , 23 byte

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

Cobalah online!

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.
Martin Ender
sumber
2

JavaScript (ES6), 81 byte

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>

Sumbu Y adalah kebalikan dari OP.

Neil
sumber
2

Röda , 74 byte

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

Cobalah online!

Tidak Terkumpul:

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
}
fergusq
sumber
2

Python 3 , 87 83 byte

lambda n:"\n".join("".join(" X"[(y*y+x*x)%n==1]for x in range(n))for y in range(n))

Cobalah online!

Sumbu-y terbalik

ovs
sumber
2

Jelly , 14 13 byte

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

Sumbu x terbalik.

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
1

dc , 79 byte

?dsRsQ[88P]sl[32P]sH[0sM[lM2^lR2^+lQ%d1=l1!=HlM1+dsMlQ>c]dscx10PlR1-dsR0<S]dsSx

The y-axis terbalik sedangkan thex sumbu tidak.

Cobalah online!

R. Kap
sumber
1

MATL , 13 byte

:qU&+G\1=88*c

Asal ada di kiri atas. Jadi hasilnya terbalik dibandingkan dengan contoh-contoh dalam tantangan.

Coba di MATL online!

Penjelasan

:      % 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
Luis Mendo
sumber
1

Python 3 , ( 102 98 95 byte)

sumbu y terbalik

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

Cobalah online!

  • disimpan 4 byte: dihilangkan variabel c dalam c = '' if (i i + j j)% n-1else'X '
  • disimpan 3 byte: Berkat ovs (pernyataan cetak yang dimodifikasi)
officialaimm
sumber
1
p(end=' 'if(i*i+j*j)%n-1else'X')untuk 95 byte
ov
1

Lithp , 125 byte

#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 untuk keterbacaan.

Cobalah online!

Bukan yang terpendek. Saya pikir saya perlu semacam modul tulisan cepat. Lihat tautan Try it Online untuk penjelasan lebih lanjut, versi yang tidak disatukan, dan beberapa tes. Untuk hasil terbaik, perluas jendela keluaran untuk melihat lebih banyak.

Andrakis
sumber
1

Python 3 , 82 byte

f=lambda n,k=0:k<n>f(n,k+1)!=print(''.join(' X'[(k*k+j*j)%n==1]for j in range(n)))

Cobalah online!

Dennis
sumber
1

GNU APL , 41 karakter, 59 byte

Membaca bilangan bulat dan menampilkan lingkaran.

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

Tidak disatukan

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
Ruang Megash
sumber
0

Haskell, 115 byte

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

Sumbu y terbalik.

Cobalah online!

Semua kurung itu agak mengganggu saya ...

Penjelasan

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
Nama Tampilan Umum
sumber
Anda dapat mengganti yang terakhir mapdengan <$>, kan?
k_g
Kecuali saya salah mengartikan aturan pertanyaan, saya tidak berpikir Anda membutuhkan semua I / O itu - I / O golf di PPCG memiliki standar khusus untuk memungkinkan sebanyak mungkin bahasa untuk berpartisipasi. Misalnya, fungsi utama Anda dapat mengambil argumen integer dan mengembalikan string.
Ørjan Johansen
@k_g ya terima kasih
Nama Tampilan Umum
@ ØrjanJohansen sepatutnya dicatat :)
Generic Display Name
0

GolfScript , 34 byte

~:c,{.*}%:a{:b;a{b+c%1=' x'=}%}%n*

Cobalah online!

Saya benar-benar tidak suka menggunakan variabel ...

Biarawati Bocor
sumber