Нарисуй мне (странный) юнит круг!

20

Вступление

Вы можете знать и любить свой обычный круг единиц. Но математики сумасшедшие, и поэтому они абстрагировали концепцию до любой точки, которая удовлетворяет x*x+y*y=1. Поскольку криптографы 1 тоже странные, они любят конечные поля, а иногда и конечные кольца (хотя у них нет большого выбора), поэтому давайте объединим это!

Соревнование

вход

Целое положительное число больше единицы в вашей любимой кодировке. Давайте назовем этот номер n.

Выход

Вы выведете «изображение» (которое состоит из n раз по n символов) единичного круга по модулю входного целого числа как ASCII-Art, используя «X» (латинские буквы верхнего регистра 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)

Если это поможет вам, вы также можете инвертировать направление любой из осей, но примеры предполагают такую ​​ориентацию.

Кто выигрывает?

Это поэтому выигрывает самый короткий код в байтах! Разрешены только стандартные методы ввода-вывода, а все стандартные лазейки запрещены.

Примеры

Вход: 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 Я предлагаю вам взглянуть на мой профиль, если вам интересно здесь.

SEJPM
источник
Выглядит намного лучше, если вы используете домен [0, n] на мой взгляд. Вот пример с вводом 42.
Р. Кап
Под «стандартным вводом / выводом» вы подразумеваете методы ввода / вывода по умолчанию или реальный STDIN / STDOUT? Я предполагаю первое, но я думаю, что кто-то ниже интерпретировал это как второе.
Орджан Йохансен
@ ØrjanJohansen действительно первый.
SEJPM
Разрешены ли предыдущие строки?
fergusq
@fergusq, поскольку они (радикально) изменят выходную фигуру видимым образом, нет.
SEJPM

Ответы:

6

Bash + GNU Utilities, 59

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

Ввод nдан как параметр командной строки. Ось Y инвертирована.

Попробуйте онлайн .

Цифровая травма
источник
4

Октава , 45 44 байта

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

Попробуйте онлайн!

flawr
источник
Это также работает: @(n)[(mod((x=(0:n-1).^2)+x',n)==1)*88,'']. В некоторых системах Octave рассматривает персонажа 0как пробел
Луис Мендо
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взяты из диапазона [0..n-1]. last$' ':['X'|mod(x*x+y*y)n==1]это более короткая форма if mod(x*x+y*y)n==1 then 'X' else ' '. Понимание списка оценивается как список строк, который превращается в одну строку, разделенную новой строкой unlines.

Laikoni
источник
3

Mathematica, 56 48 байтов

Изменить: Спасибо Грег Мартин и Мартин Эндер за сохранение 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,#}]&
ngenisis
источник
Забавное замечание: вам не нужна запятая после X:)
Грег Мартин
1
Я думаю, что вам лучше Arrayи Norm:Grid@Array[If[Mod[Norm@{##}^2,x]==1,X]&,{x=#,#},0]&
Мартин Эндер
2
Все еще обдумывая это ... самое #^2+#2^2короткое.
Мартин Эндер
@GregMartin Итак, если первый аргумент to If- ни Trueто False, ни другое , вам нужен четвертый аргумент, или он остается неоцененным, но If[False,_]возвращает Null. Weird.
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

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

Röda , 74 байта

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

Попробуйте онлайн!

Ungolfed:

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
источник
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 (измененный оператор печати)
officialaimm
источник
1
p(end=' 'if(i*i+j*j)%n-1else'X')для 95 байт
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")

Разрыв строки для удобства чтения.

Попробуйте онлайн!

Не самый короткий. Я думаю, что мне нужен какой-то сокращенный модуль. См. Ссылку «Попробуй онлайн» для более подробного объяснения, версии без игры и некоторых тестов. Для достижения наилучших результатов разверните окно вывода, чтобы увидеть больше.

Andrakis
источник
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
Megashroom
источник
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с <$>, верно?
k_g
Если только я неправильно истолковываю правила вопроса, я не думаю, что вам нужны все эти входы / выходы - для ввода / вывода для игры в гольф в PPCG предусмотрены специальные значения по умолчанию, позволяющие участвовать как можно большему количеству языков. Например, ваша основная функция может принимать целочисленный аргумент и возвращать строку.
Орджан Йохансен
@k_g да, спасибо
общее отображаемое имя
@ ØrjanJohansen должным образом отмечен :)
Общее отображаемое имя