Narysuj (dziwne) koło jednostki!

20

Wprowadzenie

Możesz znać i kochać swoje normalne koło jednostek. Ale matematycy są szaleni i dlatego wyodrębnili tę koncepcję do dowolnego punktu, który spełnia x*x+y*y=1. Ponieważ kryptografowie 1 są również dziwni, uwielbiają skończone pola, a czasem skończone pierścienie (to nie jest tak, że mają duży wybór), więc połączmy to!

Wyzwanie

Wejście

Dodatnia liczba całkowita większa niż jedna w twoim ulubionym kodowaniu. Nazwijmy ten numer n.

Wynik

Wyprowadzisz „obraz” (składający się z n razy n znaków) modułu koła modulo liczbę całkowitą wejściową jako ASCII-Art, używając „X” (łaciński X wielkich liter) i „” (spacja). Końcowe spacje i znaki nowej linii są dozwolone.

Więcej szczegółów

Musisz objąć układ współrzędnych od dolnego lewego do górnego prawego. Ilekroć punkt spełnia równanie okręgu, umieść X w tej pozycji, w przeciwnym razie umieść spację.

Warunkiem punktu należy uznać za część granicy okręgu jest:
mod(x*x+y*y,n)==1.

Oto krótka ilustracja układu współrzędnych:

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

Jeśli ci to pomoże, możesz także odwrócić kierunek dowolnej osi, ale przykłady zakładają taką orientację.

Kto wygrywa?

To jest więc wygrywa najkrótszy kod w bajcie! Dozwolone są tylko domyślne metody We / Wy, a wszystkie standardowe luki są zabronione.

Przykłady

Wejście: 2

X 
 X

Wejście: 3

X  
X  
 XX

Wejście: 5

X    


X    
 X  X

Wejście: 7

X      
  X  X 


  X  X 
X      
 X    X

Wejście: 11

X          

     XX    

   X    X  
   X    X  

     XX    

X          
 X        X

Wejście: 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 Proponuję spojrzeć na mój profil, jeśli się tutaj zastanawiasz.

SEJPM
źródło
Moim zdaniem wygląda znacznie lepiej, jeśli używasz domeny [0, n]. Oto przykład z wprowadzeniem 42.
R. Kap.
Przez „standardowe we / wy” masz na myśli domyślne metody we / wy, czy masz na myśli rzeczywiste STDIN / STDOUT? Zakładam, że to pierwsze, ale myślę, że ktoś poniżej zinterpretował to jako drugie.
Ørjan Johansen
@ ØrjanJohansen rzeczywiście ten pierwszy.
SEJPM,
Czy dozwolone są wcześniejsze znaki nowej linii?
fergusq
@fergusq, ponieważ (drastycznie) zmieniłyby dane wyjściowe w widoczny sposób, nie.
SEJPM

Odpowiedzi:

6

Bash + GNU Utilities, 59

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

Dane wejściowe npodane jako parametr wiersza polecenia. Oś Y jest odwrócona.

Wypróbuj online .

Cyfrowa trauma
źródło
4

Oktawa , 45 44 bajtów

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

Wypróbuj online!

wada
źródło
Działa to również: @(n)[(mod((x=(0:n-1).^2)+x',n)==1)*88,'']. W niektórych systemach Octave traktuje postać 0jak spację
Luis Mendo
3

Haskell , 68 bajtów

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

Wypróbuj online! Oś Y jest odwrócona. Użycie: f 42zwraca ciąg rozdzielany znakiem nowej linii.

Jest to lista zagnieżdżona zrozumienie gdzie zarówno xi ysą rysowane z zakresu [0..n-1]. last$' ':['X'|mod(x*x+y*y)n==1]jest krótszą formą if mod(x*x+y*y)n==1 then 'X' else ' '. Zrozumienie listy przekształca się w listę ciągów, która jest przekształcana w pojedynczy ciąg oddzielony znakiem nowej linii unlines.

Laikoni
źródło
3

Mathematica, 56 48 bajtów

Edycja: Podziękowania dla Grega Martina i Martina Endera za oszczędność 8 bajtów.

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

Oryginalne rozwiązanie:

Grid@Table[If[Tr[{i-1,j-1}^2]~Mod~#==1,X,],{i,#},{j,#}]&
ngenisis
źródło
Zabawna uwaga: przecinek nie jest potrzebny po X:)
Greg Martin
1
Myślę, że jesteś lepszy mecz Arrayi Norm:Grid@Array[If[Mod[Norm@{##}^2,x]==1,X]&,{x=#,#},0]&
Martin Ender
2
Nadal się nad tym zastanawiam ... #^2+#2^2jest najkrótszy.
Martin Ender,
@GregMartin Więc jeśli pierwszym argumentem Ifjest ani, Truealbo Falsepotrzebujesz czwartego argumentu, albo pozostaje on bezwartościowy, ale If[False,_]zwraca Null. Dziwne.
ngenisis,
@MartinEnder Początkowo próbowałem, Arrayale nie pomyślałem o ustawieniu argumentu na zmienną.
ngenisis,
2

CJam , 23 bajty

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

Wypróbuj 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
źródło
2

JavaScript (ES6), 81 bajtów

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>

Oś Y jest odwrotnością OP.

Neil
źródło
2

Röda , 74 bajty

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

Wypróbuj online!

Nie golfowany:

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
źródło
2

Python 3 , 87 83 bajtów

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

Wypróbuj online!

Oś Y jest odwrócona

ovs
źródło
2

Galaretka , 14 13 bajtów

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

Oś X jest odwrócona.

Wypróbuj online!

Jak to działa

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
źródło
1

dc , 79 bajtów

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

y-Działający jest odwrócony natomiast x-działający nie jest.

Wypróbuj online!

R. Kap
źródło
1

MATL , 13 bajtów

:qU&+G\1=88*c

Pochodzenie znajduje się w lewym górnym rogu. Tak więc wynik jest odwrócony do góry nogami w porównaniu do przykładów w wyzwaniu.

Wypróbuj w MATL online!

Wyjaśnienie

:      % 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
źródło
1

Python 3 , ( 102 98 95 bajtów)

oś y odwrócona

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

Wypróbuj online!

  • zapisane 4 bajty: pominięta zmienna c in c = '' if (i i + j j)% n-1else'X '
  • zapisane 3 bajty: Dzięki ovs (zmodyfikowana instrukcja drukowania)
Officialaimm
źródło
1
p(end=' 'if(i*i+j*j)%n-1else'X')dla 95 bajtów
ovs
1

Lithp , 125 bajtów

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

Podział linii dla czytelności.

Wypróbuj online!

Nie najkrótszy. Myślę, że potrzebuję jakiegoś skróconego modułu. Zobacz link Wypróbuj online, aby uzyskać dodatkowe wyjaśnienia, wersję bez golfa i niektóre testy. Aby uzyskać najlepsze wyniki, rozwiń okno wyjściowe, aby zobaczyć więcej.

Andrakis
źródło
1

Python 3 , 82 bajty

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

Wypróbuj online!

Dennis
źródło
1

GNU APL , 41 znaków, 59 bajtów

Odczytuje liczbę całkowitą i wyświetla okrąg.

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

Nie golfił

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
Megashroom
źródło
0

Haskell, 115 bajtów

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

Oś Y jest odwrócona.

Wypróbuj online!

Te wszystkie nawiasy mnie denerwują ...

Wyjaśnienie

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
Ogólna nazwa wyświetlana
źródło
Możesz zamienić ostatni mapna <$>, prawda?
k_g
Chyba że źle interpretuję reguły pytań, nie sądzę, że potrzebujesz wszystkiego, co I / O - we / wy gry w golfa na PPCG ma specjalne ustawienia domyślne, aby umożliwić uczestnictwo w jak największej liczbie języków. Na przykład twoja główna funkcja może przyjąć argument liczby całkowitej i zwrócić ciąg znaków.
Ørjan Johansen
@k_g tak, dziękuję
ogólna nazwa wyświetlana
@ ØrjanJohansen należycie odnotowano :)
Ogólna nazwa wyświetlana
0

GolfScript , 34 bajty

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

Wypróbuj online!

Naprawdę nie lubię używać zmiennych ...

Leaky Nun
źródło