フィボナッチスパイラル


37

あなたの目標は、数字でフィボナッチスパイラルを生成することです。

サンプル

入力/出力の例

1 -> 1

2 -> 1 1

3 -> 1 1
     2 2
     2 2

6 -> 8 8 8 8 8 8 8 8 5 5 5 5 5
     8 8 8 8 8 8 8 8 5 5 5 5 5
     8 8 8 8 8 8 8 8 5 5 5 5 5
     8 8 8 8 8 8 8 8 5 5 5 5 5
     8 8 8 8 8 8 8 8 5 5 5 5 5
     8 8 8 8 8 8 8 8 1 1 3 3 3
     8 8 8 8 8 8 8 8 2 2 3 3 3
     8 8 8 8 8 8 8 8 2 2 3 3 3

9の入力

入力 入力は、STDINまたは関数引数を通じて取得できます。単一の番号になります

出力 出力は、STDOUTまたは関数の戻り値からのものです。単一の文字列でなければなりません。

行の最後の余分な空白は許可されません。出力には、数字、改行(改行)、およびスペースを含めることができます。

向きは重要ではありません。これは回転と反射を意味します。有効なフィボナッチスパイラルパターンに従う限り。

桁数の異なる数字(1と13など)は、互いに右揃えにする必要があります。すべてが揃うように、行の先頭にスペースを追加する必要がある場合があります。

1   1                          1   1
100 100  should actually be  100 100

ここに例を見ることができます


これはので、バイト単位の最短コードが勝ちです!


4
関連する課題(および非常にクールな時計)
Sp3000

Numbers with different amounts of digits (e.g. 1 and 13) should be aligned to the left side of the digit a space may need to be added to the very beginning of a line so everything can line up.これは、2つの文としてより明確に見えるかもしれません。
trichoplax

例からは、各数字の右端の数字を揃えたいが、「数字の左側に揃える」とは逆のように聞こえます。
-trichoplax

「空白を囲むことは許可されていません」を明確にできますか?特に、行の先頭または末尾の空白は許容されますか?
MtnViewMark

Matlabはデフォルトで標準出力に出力を印刷します。自動的に標準出力に出力される(文字列タイプの出力ではなく)数値タイプの出力を使用できますか?
ルイスメンドー

回答:


15

APL、23

{a,⍴⍨2⍴⊃⍴a←⌽⍉⍵}⍣(⎕-1)⍪1

説明:

⍪1               this creates a 1x1 matrix containing just 1
{..}⍣(⎕-1)     the power operator (⍣) repeats the function {} user input - 1 times
a,⍴⍨2⍴⊃⍴a←⌽⍉⍵   the function being iterated rotates the matrix and appends the next matrix to it.

tryapl.orgで試してください


1
ここで検索すると、多くの人が以前に疑問を持っていました。たとえば、@ Tobiaの答えは次のとおりです。* Dyalog APLは、上位128バイト値にマップされたAPLシンボルを持つレガシー文字セットをサポートします。したがって、ASCII文字とAPLシンボルのみを使用するAPLプログラムは、バイト==文字と見なすことができます。
モリスズッカ

それでは、コメントを撤回します。
ガー

1
@MorisZuccaただし、一部の文字(またはなど)はその文字セットから欠落しているため、そのルールを呼び出す場合は使用できません。
FUZxxl

1
確かに、「キー」と「ランク」は新しい実装であり、実際に使用しているDyalogインタープリターのUnicodeバージョンにのみ存在します。Classicバージョンでは、同等の⎕コマンドを使用する必要があります。たとえば、same(⎕OPT)にも同じことが当てはまります。したがって、通常、Dyalog Classicバージョンで記述できる場合、1文字につき1バイトと言っても安全だと思います。私が間違っている場合は修正してください。そしてコメントをありがとう。
モリスズッカ

8

Matlab、84バイト

関数が使用されます。出力は標準出力です。

function f(N)
s=0;t=1;y=1;for n=2:N
u=s+t;s=t;t=u;y=[rot90(y) t*ones(t)];end;disp(y)

例:

>> f(1)
     1
>> f(2)
     1     1
>> f(3)
     1     2     2
     1     2     2
>> f(6)
     5     5     5     5     5     8     8     8     8     8     8     8     8
     5     5     5     5     5     8     8     8     8     8     8     8     8
     5     5     5     5     5     8     8     8     8     8     8     8     8
     5     5     5     5     5     8     8     8     8     8     8     8     8
     5     5     5     5     5     8     8     8     8     8     8     8     8
     3     3     3     1     1     8     8     8     8     8     8     8     8
     3     3     3     2     2     8     8     8     8     8     8     8     8
     3     3     3     2     2     8     8     8     8     8     8     8     8
>> f(7)
     8     8     8     8     8     8     8     8    13    13    13    13    13    13    13    13    13    13    13    13    13
     8     8     8     8     8     8     8     8    13    13    13    13    13    13    13    13    13    13    13    13    13
     8     8     8     8     8     8     8     8    13    13    13    13    13    13    13    13    13    13    13    13    13
     8     8     8     8     8     8     8     8    13    13    13    13    13    13    13    13    13    13    13    13    13
     8     8     8     8     8     8     8     8    13    13    13    13    13    13    13    13    13    13    13    13    13
     8     8     8     8     8     8     8     8    13    13    13    13    13    13    13    13    13    13    13    13    13
     8     8     8     8     8     8     8     8    13    13    13    13    13    13    13    13    13    13    13    13    13
     8     8     8     8     8     8     8     8    13    13    13    13    13    13    13    13    13    13    13    13    13
     5     5     5     5     5     1     2     2    13    13    13    13    13    13    13    13    13    13    13    13    13
     5     5     5     5     5     1     2     2    13    13    13    13    13    13    13    13    13    13    13    13    13
     5     5     5     5     5     3     3     3    13    13    13    13    13    13    13    13    13    13    13    13    13
     5     5     5     5     5     3     3     3    13    13    13    13    13    13    13    13    13    13    13    13    13
     5     5     5     5     5     3     3     3    13    13    13    13    13    13    13    13    13    13    13    13    13

Matlab、78バイト

function y=f(N)
s=0;t=1;y=1;for n=2:N
u=s+t;s=t;t=u;y=[rot90(y) t*ones(t)];end

Matlabの機能が活用されていることを除いて、上記と同じです。つまり、関数出力を(文字列として)標準出力に自動的に表示します。これにより、上記のアプローチでの文字列への変換が回避されます。

f(6)
ans =
     5     5     5     5     5     8     8     8     8     8     8     8     8
     5     5     5     5     5     8     8     8     8     8     8     8     8
     5     5     5     5     5     8     8     8     8     8     8     8     8
     5     5     5     5     5     8     8     8     8     8     8     8     8
     5     5     5     5     5     8     8     8     8     8     8     8     8
     3     3     3     1     1     8     8     8     8     8     8     8     8
     3     3     3     2     2     8     8     8     8     8     8     8     8
     3     3     3     2     2     8     8     8     8     8     8     8     8

いくつかのMatlabのソリューション:-)見て喜ん
ホキ

@ほきありがとうございます!:-)
ルイスメンドー

7

Python 2、121バイト

a,b=0,1;L=[]
exec"a,b=b,a+b;L=zip(*L[::-1])+[[a]*a]*a;"*input()
for r in L:print" ".join("%*d"%(len(str(a)),x)for x in r)

ローテーションの緩和されたルールにより、これは非常に簡単になります。

str(a)長いものに到達した場合、必要以上の先行スペースが許可されているかどうかわからないので、ここの代わりにバックティックを使用していません。とはいえ、私たちがいたとしても、aそれ自体を使用することはとにかく短くなります。


7

ルビー、243の 242 236 233 222 170 130バイト

s,l,r=0,1,[]
gets.to_i.times{s+=l
l=s-l
s.times{r<<[s]*s}
r=r.transpose.reverse}
r.map{|w|puts w.map{|c|"%#{s.to_s.size}s"%c}*" "}

1
素敵なゴルフ!t==value条件をに変換することにより、4行目にいくつかの文字を保存できますt>value。たとえば、(t=x%4)>2?s.times{r<<[s]*s}:t>1?s.times{r.map!{|w|w.unshift s}}:t>0?s.times{r.unshift [s]*s}:r.map!{|w|w+=[s]*s}}
Cristian Lupascu

6

Pythonの- 189 179 174

n=int(input())
f=[1,1]
while len(f)<n:f+=[f[-1]+f[-2]]
o=[[]]
for i in f:o=(list(zip(*o)))[::-1]+[[i]*i]*i
for x in o:print(' '.join(str(y).rjust(len(str(f[-1])))for y in x))

6

J、36バイト

1&(($~,~)@(1{$@]),.|:@|.@])&(,.1)@<:

使用法:

   (1&(($~,~)@(1{$@]),.|:@|.@])&(,.1)@<:) 6
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 1 1 3 3 3
8 8 8 8 8 8 8 8 2 2 3 3 3
8 8 8 8 8 8 8 8 2 2 3 3 3

方法:

この関数は、現在の正方形を回転させ、新しい正方形を現在の正方形に1 input-1回追加します。正方形のサイズと要素の値は、前の長方形のサイズから収集されます。

コードの説明:

1&(           loop
    ($~,~)      new square with size and elements
    @(1{$@])    with the size of the second dimension of the current rectangle
    ,.          attached to
    |:@|.@]     rotated current rectangle
)&(,.1)       starting the loop with matrix 1
@<:           looping input-1 times

こちらからオンラインでお試しください。


6

ハスケル、183の 176 171 163バイト

import Data.List
s t=map((t>>[l t])++)t
e 1=[[1]];e n=s.reverse.transpose$e$n-1
f=g.e
g m=unlines$map(>>=((show$l m)#).show)m
a#b|l a<l b=b;a#b=a#(' ':b)
l=length

関数はf、数値を受け取り、単一の文字列を返します。

λ: putStr $ f 8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21  5  5  5  5  5  8  8  8  8  8  8  8  8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21  5  5  5  5  5  8  8  8  8  8  8  8  8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21  5  5  5  5  5  8  8  8  8  8  8  8  8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21  5  5  5  5  5  8  8  8  8  8  8  8  8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21  5  5  5  5  5  8  8  8  8  8  8  8  8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21  3  3  3  1  1  8  8  8  8  8  8  8  8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21  3  3  3  2  2  8  8  8  8  8  8  8  8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21  3  3  3  2  2  8  8  8  8  8  8  8  8
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13
 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 13 13 13 13 13 13 13

5

Pyth、34バイト

jbmsm.[hl`lhZ`k\ d=Zu+_CGmmlGGGQ]]

驚いたことに、コードの半分以上は、マトリックスを生成するのではなく、印刷/パディングです。

マトリックスの生成は非常に簡単ですが、転置と反転で構成され、NのN個のコピーを含むN行を追加します(Nは現在の行数です)。

7の出力例:

  5  5  5  5  5  8  8  8  8  8  8  8  8
  5  5  5  5  5  8  8  8  8  8  8  8  8
  5  5  5  5  5  8  8  8  8  8  8  8  8
  5  5  5  5  5  8  8  8  8  8  8  8  8
  5  5  5  5  5  8  8  8  8  8  8  8  8
  3  3  3  1  1  8  8  8  8  8  8  8  8
  3  3  3  2  2  8  8  8  8  8  8  8  8
  3  3  3  2  2  8  8  8  8  8  8  8  8
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13
 13 13 13 13 13 13 13 13 13 13 13 13 13

4

Perl、289 277 257バイト

@f=(0,1);push@f,$f[-1]+$f[-2]while(@f<=$ARGV[0]);$d=1+length$f[-1];shift@f;map{$v=$f[$_];$t=sprintf("%${d}d",$v)x$v;$_%4||map{unshift@s,$t}1..$v;$_%4==3&&map{$_.=$t}@s;$_%4==2&&map{push@s,$t}1..$v;$_%4==1&&map{$_=$t.$_}@s;}0..$#f;$\=$/;for(@s){s/^ //;print}

4

K、48バイト

{{`0:1_',/'(1+#$|//x)$x}(x-1){+|x,\:t#t:#x}/,,1}

そして実際に:

  {{`0:1_',/'(1+#$|//x)$x}(x-1){+|x,\:t#t:#x}/,,1}7
 8  8  8  8  8  8  8  8  5  5  5  5  5
 8  8  8  8  8  8  8  8  5  5  5  5  5
 8  8  8  8  8  8  8  8  5  5  5  5  5
 8  8  8  8  8  8  8  8  5  5  5  5  5
 8  8  8  8  8  8  8  8  5  5  5  5  5
 8  8  8  8  8  8  8  8  1  1  3  3  3
 8  8  8  8  8  8  8  8  2  2  3  3  3
 8  8  8  8  8  8  8  8  2  2  3  3  3
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13
13 13 13 13 13 13 13 13 13 13 13 13 13

ゴルフの良い機会になるかもしれません。

プログラムは基本的に2つの部分で構成されています。連結マトリックスを生成し、出力用にフォーマットします。前者は非常に簡単です。

  {(x-1){+|x,\:t#t:#x}/,,1}5
(3 3 3 2 2
 3 3 3 2 2
 3 3 3 1 1
 5 5 5 5 5
 5 5 5 5 5
 5 5 5 5 5
 5 5 5 5 5
 5 5 5 5 5)

1を含む1x1行列から始めて、TのT長ベクトルを構築します。ここで、Tは最初の次元の開始行列の長さ(t#t:#x)で、元の行列の各行に添付しx,\:ます()。結果を反転および転置(+|)すると、90度回転します。これをN-1回行います。

マトリックスを印刷するKの自然なアプローチでは、必要な方法で数値列を揃えることができないため、書式設定は非常に不格好です。

{`0:1_',/'(1+#$|//x)$x}

基本的な考え方は、マトリックスの最大要素(|//x)を取得し、それを文字列(単項)に変換し、$その長さに1を加え(1+#)、マトリックスの要素をそのサイズの右揃えの文字列にフォーマットすることです。次に、これらの文字列を整理し(,/')、結果の先行スペースを削除します(1_')。


4

CJam、48バイト

1saali({z{W%}%_0=,__sa*a*+}*_W=W=,):U;{USe[}f%N*

オンラインで試す

パターンを生成する中核部分は、かなり簡単に思えます。これまでに作成した四角形を回転させ、下部に値の正方形を追加します。

ただし、結果をパディングするコードはひどく見えます。ネストされたリストにパディングを適用するためにfand :演算子の組み合わせを試しましたが、何も機能しませんでした。誰かより良い提案があれば、彼らは大歓迎です。

1s    First value. Using string for values so that we can pad them in the end.
aa    Wrap it twice. Data on stack will be a list of lists (list of lines).
li    Get input.
(     Decrement, since we seeded the list at n=1.
{     Loop over n.
  z     Transpose...
  {W%}% ... and reverse all lines, resulting in a 90 degree rotation.
  _0=,  Get length of line, which is the size of square we need to add.
  __    Create two copies of size.
  sa    Convert one size to string, and wrap it in array.
  *     Replicate it size times. This is one line.
  a     Wrap the line...
  *     ... and replicate it size times. The square of new values is done.
  +     Add the list of lines to the previous list of lines.
}*    End of loop over n.
_W=W= Get last value produced.
,)    Take its length, and increment it. This is the output field width.
:U;   Store the field width in variable, and pop it. This is ugly.
{     Start of block applied to all values.
  U     Field width stored in variable.
  S     Space.
  e[    Pad left.
}f%   End of block applied to all values.
N*    Join lines with newline.

すべての行を反転するには、を使用しWf%ます。また、パディング{Se[}ff%ではなく何かをできるよう:U;{USe[}f%になりますか?(それはそのままでは動作しない可能性があります、私は今それを考えることはできません。)
エソランジングフルーツ

2

Pyth、29バイト

Vu+C_GmmlGGGQ\]Yjdm.\[l`lN`d\ N

デモンストレーション。

APLのようにパディングがフリー/暗黙的である場合、またはマトリックス出力が許可されている場合、これは14バイトになります。

u+C_GmmlGGGQ]Y

2

ルビー、129バイト

私は他のルビーの回答をまとめて編集しましたが、最近の変更は受け入れられていないか何かですので、ここにあります:

s,r=0,[[1]]
gets.to_i.times{s+=r[0][0]
r=(r+[[s]*s]*s).transpose.reverse}
r.map{|w|puts w.map{|c|"%#{r[0][s].to_s.size}s"%c}*' '}

1
PPCGへようこそ!ゴルフの改善は、通常、この辺りでは拒否されます(他の提案が受け入れられた場合、見落としがあったに違いありません)。これは、作者がレビューするためにコメントに投稿されることになっているためです。このポリシーの背後にある理由については、このメタ投稿を参照してください。
マーティンエンダー

情報をありがとう、理にかなっています。コメントすることは私が最初にしたことでしたが、コメントするのに十分な評判ポイントはありませんでしたが、将来はするでしょう。ハッピーゴルフ!
user2251284

1

ES6、248バイト

n=>(f=(n,o=n)=>Array(n).fill(o),g=n=>n<3?[f(n,1)]:(a=g(n-2)).reverse().concat(f(l=a[0].length,f(l))).map((e,i,a)=>f(a.length).concat(e.reverse())),a=g(n),s=' '.repeat(l=` ${a[0][0]}`.length),a.map(a=>a.map((e,i)=>(s+e).slice(!i-1)).join``).join`\n`)

where \nは、リテラルの改行文字を表します。

面倒なことに、フォーマットはコードの大部分を占めます。

f塗りつぶされた配列を作成するヘルパー関数です。主に塗りつぶされた正方形を作成するために使用されますが、再帰の基本ケースを生成するために便利に倍増します。

g主なうなり声です。最後の1つの解を再帰的に生成し、180度回転して、次の2つの正方形を追加します。

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