Fibonacci Spiral

37

Tujuan Anda adalah untuk menghasilkan spiral Fibonacci dengan angka.

Mencicipi

Contoh Input / Output

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

Masukan 9

Input Input dapat diambil melalui argumen fungsi atau STDIN. Itu akan menjadi satu nomor

Keluaran Keluaran dapat dari STDOUT atau nilai pengembalian fungsi. Itu harus berupa string tunggal.

Ruang kosong ekstra di bagian paling akhir baris tidak diperbolehkan. Output dapat berisi digit, umpan baris (baris baru), dan spasi.

Orientasi tidak masalah, ini berarti rotasi dan refleksi. Selama itu mengikuti pola spiral Fibonacci yang valid.

Angka dengan jumlah digit yang berbeda (mis. 1 dan 13) harus sejajar satu sama lain. Sebuah ruang mungkin perlu ditambahkan ke bagian paling awal dari sebuah garis sehingga semuanya dapat berbaris.

1   1                          1   1
100 100  should actually be  100 100

Anda dapat melihat contohnya di sini


Ini adalah sehingga kode terpendek dalam byte menang!

Downgoat
sumber
4
Tantangan terkait (dan jam yang sangat keren)
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.Ini terdengar seperti mungkin lebih jelas sebagai dua kalimat.
trichoplax
Terlihat dari contoh bahwa Anda ingin angka paling kanan dari setiap angka disejajarkan, tetapi "disejajarkan dengan sisi kiri digit" terdengar seperti sebaliknya.
trichoplax
Bisakah Anda mengklarifikasi "ruang putih di sekitarnya tidak diizinkan"? Secara khusus - apakah memimpin atau mengikuti spasi di jalur dapat diterima?
MtnViewMark
Matlab mencetak output ke stdout secara default. Apakah bisa menerima keluaran tipe numerik (sebagai lawan keluaran tipe string) yang secara otomatis dicetak ke stdout?
Luis Mendo

Jawaban:

15

APL, 23

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

Penjelasan:

⍪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.

Cobalah di tryapl.org

Moris Zucca
sumber
1
Jika Anda mencari di sini, banyak yang ragu sebelumnya. Berikut ini adalah contoh jawaban @Tobia: * Dyalog APL mendukung charset legacy yang memiliki simbol APL yang dipetakan ke nilai 128 byte atas. Oleh karena itu program APL yang hanya menggunakan karakter ASCII dan simbol APL dapat dianggap sebagai byte == karakter.
Moris Zucca
Baiklah kalau begitu, saya akan menarik kembali komentar saya.
gar
1
@MorisZucca Namun perhatikan, bahwa beberapa karakter (suka atau ) hilang dari rangkaian karakter itu dan tidak dapat digunakan ketika Anda ingin membangkitkan aturan itu.
FUZxxl
1
Benar, "kunci" dan "peringkat" adalah implementasi yang lebih baru dan hanya ada dalam versi Unicode dari interpreter Dyalog yang saya gunakan. Versi Classic harus menggunakan perintah equivalentcommand. Hal yang sama berlaku untuk ⍠ (⎕OPT) juga misalnya. Jadi saya biasanya berpikir bahwa jika saya bisa menulisnya dalam versi Dyalog Classic, aman untuk mengatakan itu 1 byte per char. Koreksi saya jika saya salah. Dan terima kasih atas komentarnya.
Moris Zucca
8

Matlab, 84 byte

Fungsi digunakan. Output ada di stdout.

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)

Contoh:

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

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

Sama seperti di atas kecuali fitur Matlab dieksploitasi, yaitu, ia secara otomatis menampilkan fungsi keluaran (sebagai string) di stdout. Ini menghindari konversi ke string dalam pendekatan di atas.

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
Luis Mendo
sumber
senang melihat beberapa solusi Matlab :-)
Hoki
@Hoki Terima kasih! :-)
Luis Mendo
7

Python 2, 121 byte

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)

Aturan santai pada rotasi membuat ini jauh lebih sederhana.

Saya belum pernah menggunakan backticks sebagai ganti di str(a)sini karena saya tidak yakin apakah kita diperbolehkan lebih banyak ruang terdepan daripada yang diperlukan, jika kita pernah mencapai yang lama. Meskipun, bahkan jika kita melakukannya, menggunakan aitu sendiri akan lebih pendek.

Sp3000
sumber
7

Ruby, 243 242 236 233 222 170 130 byte

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}*" "}
addison
sumber
1
Golf yang bagus! Anda dapat menyimpan beberapa karakter di saluran 4, dengan mengonversi t==valuekondisi menjadi t>value. Misalnya,(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))
faubi
sumber
6

J, 36 byte

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

Pemakaian:

   (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

Metode:

Fungsi memutar kuadrat saat ini dan menambahkan kuadrat baru ke saat ini satu input-1kali. Ukuran kotak dan nilai elemen dikumpulkan dari ukuran persegi panjang sebelumnya.

Penjelasan kode:

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

Cobalah online di sini.

randomra
sumber
6

Haskell, 183 176 171 163 byte

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

Fungsinya adalah f, yang mengambil angka dan mengembalikan satu string:

λ: 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
MtnViewMark
sumber
5

Pyth, 34 byte

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

Anehnya, lebih dari separuh kode adalah pencetakan / padding, daripada menghasilkan matriks.

Generasi dari matriks sangat sederhana namun terdiri dari transpos dan pembalikan, dan menambahkan garis N yang berisi salinan N dari N, di mana N adalah jumlah garis saat ini.

Contoh output untuk 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
orlp
sumber
4

Perl, 289 277 257 byte

@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}
Ruth Franklin
sumber
4

K, 48 byte

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

Dan beraksi:

  {{`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

Mungkin masih ada beberapa peluang bagus untuk bermain golf.

Program ini pada dasarnya terdiri dari dua bagian - menghasilkan matriks gabungan dan memformatnya untuk keluaran. Yang pertama cukup sederhana:

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

Dimulai dengan matriks 1x1 yang berisi 1, buat vektor T-length dari T di mana T adalah panjang dari matriks awal pada dimensi pertama ( t#t:#x) dan tempelkan ke setiap baris dari matriks asli ( x,\:). Membalik dan memindahkan hasilnya ( +|) memutarnya 90 derajat. Kami melakukan ini N-1 kali.

Memformat cukup kikuk, karena pendekatan alami K untuk mencetak matriks tidak akan menyelaraskan kolom angka seperti yang kita butuhkan:

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

Ide dasarnya adalah untuk mengambil elemen maksimum dari matriks ( |//x), mengubahnya menjadi string (unary $), mengambil panjangnya ditambah satu ( 1+#) dan kemudian memformat elemen-elemen dari matriks untuk menyelaraskan string ukuran itu. Kemudian untuk merapikan, gabungkan string-string itu ( ,/') dan letakkan spasi yang dihasilkan ( 1_').

JohnE
sumber
4

CJam, 48 byte

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

Cobalah online

Bagian inti dari menghasilkan pola tampaknya cukup mudah. Putar persegi panjang yang dibuat sejauh ini, dan tambahkan kuadrat nilai di bagian bawah.

Kode untuk padding hasilnya terlihat buruk. Saya mencoba banyak kombinasif dan :operator untuk menerapkan padding ke daftar bersarang, tetapi tidak ada yang berhasil. Jika ada yang punya saran yang lebih baik, mereka dipersilahkan.

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.
Reto Koradi
sumber
Membalik semua lini bisa dilakukan Wf%. Juga, apakah Anda dapat melakukan sesuatu seperti {Se[}ff%daripada :U;{USe[}f%untuk bantalan? (Itu mungkin tidak berfungsi sebagaimana
mestinya
2

Pyth, 29 byte

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

Demonstrasi.

Jika padding gratis / implisit, seperti di APL, atau output matriks diizinkan, ini akan menjadi 14 byte:

u+C_GmmlGGGQ]Y
isaacg
sumber
2

Ruby, 129 byte

Saya mengedit jawaban ruby ​​lainnya, tetapi perubahan saya yang terbaru tidak diterima atau semacamnya, jadi ini dia:

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}*' '}
pengguna2251284
sumber
1
Selamat datang di PPCG! Perbaikan golf biasanya ditolak di sekitar sini (jika saran Anda yang lain diterima yang pasti merupakan kekeliruan), karena itu seharusnya diposting dalam komentar untuk ditinjau oleh penulis. Lihat meta pos ini untuk alasan di balik kebijakan ini.
Martin Ender
Terima kasih atas informasinya, masuk akal. Mengomentari adalah apa yang seharusnya saya lakukan pada awalnya tetapi saya tidak memiliki poin reputasi yang cukup untuk berkomentar, tetapi akan dilakukan di masa depan. Selamat bermain golf!
user2251284
1

ES6, 248 byte

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

Dimana \n mewakili karakter baris baru literal.

Mengganggu format membutuhkan potongan besar kode.

fadalah fungsi pembantu yang membuat array yang diisi. Ini digunakan sebagian besar untuk membuat kotak diisi tetapi juga dengan mudah menggandakan untuk menghasilkan kasing dasar untuk rekursi.

gadalah kerja keras utama. Secara rekursif menghasilkan solusi terakhir tapi satu, memutarnya 180 derajat, lalu menambahkan dua kotak berikutnya.

Neil
sumber