(奇妙な)単位円を描いてください!


20

前書き

通常の単位円を知っていて、愛しているかもしれません。しかし、数学者は狂っているので、彼らはコンセプトを満足するところまで抽象化しましたx*x+y*y=1。Cryptographers 1も奇妙であるため、彼ら有限の場と時々有限のリングを愛します(しかし、彼らは多くの選択肢があるわけではありません)。

チャレンジ

入力

お気に入りのエンコードで1より大きい正の整数。この番号をnと呼びましょう。

出力

"X"(大文字のラテンX)と ""(スペース)を使用して、入力整数を法としてASCII-Artとしてモジュレーションする単位円の "picture"(n x n文字で構成される)を出力します。末尾のスペースと改行を使用できます。

詳細

座標系を左下から右上にスパンする必要があります。ポイントが円の方程式を満たしている場合は常に、その位置に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.ガプス

「標準I / O」とは、デフォルトのI / Oメソッドを意味しますか、それとも実際のSTDIN / STDOUTを意味しますか?前者を想定していますが、下の誰かが後者と解釈したと思います。
Ørjanヨハンセン

@Ø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が範囲から引き出されます[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バイト

編集:8バイトを保存してくれたGreg MartinとMartin Enderに感謝します。

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どちらもされていないTrueFalse、あなたは四番目の引数を必要とするか、それは未評価のままですが、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 = '' if(i i + j j)%n-1else'X 'の変数cが省略されました
  • 3バイトの節約:ovs(変更されたprintステートメント)の おかげ

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

読みやすいように改行。

オンラインでお試しください!

最短ではありません。私はある種の速記モジュールが必要だと思います。詳細な説明、未使用のバージョン、およびいくつかのテストについては、「オンラインで試す」リンクを参照してください。最良の結果を得るには、出力ウィンドウを展開してさらに表示します。



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

質問のルールを誤解していない限り、すべてのI / Oが必要だとは思わない-PPCGでのゴルフI / Oには、できるだけ多くの言語が参加できる特別なデフォルトがあります。たとえば、メイン関数は整数の引数を取り、文字列を返すことができます。
Ørjanヨハンセン

@k_gはい、ありがとう
一般的な表示名

@ØrjanJohansenが正式に言及しました:)
一般的な表示名


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.