Намалюй мені (дивне) одиничне коло!


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 Я пропоную вам поглянути на мій профіль, якщо вам тут цікаво.


Набагато краще виглядає, якщо ви використовуєте домен [0, n] на мою думку. Ось приклад із введенням 42.
Р. Кап

Під "стандартним введенням-виведенням" ви маєте на увазі методи вводу / виводу за замовчуванням, або ви маєте на увазі фактичні 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 байт.

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таNormGrid@Array[If[Mod[Norm@{##}^2,x]==1,X]&,{x=#,#},0]&
Мартін Ендер

2
Все-таки його переосмислення ... #^2+#2^2найкоротше.
Мартін Ендер

@GregMartin Отож, якщо перший аргумент Ifдорівнює ні, Trueабо 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

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

Желе , 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')за 95 байт
ов

1

Літп , 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")

Рядок для читабельності.

Спробуйте в Інтернеті!

Не найкоротший. Я думаю, мені потрібен якийсь модуль скорочень. Дивіться посилання "Спробуйте в Інтернеті", щоб отримати додаткові пояснення, версію без вогків та деякі тести. Для найкращих результатів розгорніть вікно виводу, щоб побачити більше.



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

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 є спеціальні параметри за замовчуванням, щоб дозволити брати участь якомога більше мов. Наприклад, ваша основна функція може приймати цілий аргумент і повертати рядок.
Ørjan Johansen


@ ØrjanJohansen належним чином відмітив :)
Загальне відображуване ім'я


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.