Fibonacci Spiral


37

Amacınız sayılarla bir Fibonacci spirali üretmektir .

Numune

Örnek Giriş / Çıkış

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 girişi

Giriş Giriş , STDIN veya fonksiyon argümanı ile alınabilir. Tek bir numara olacak

Çıkış Çıkış , STDOUT veya bir fonksiyonun dönüş değerinden olabilir. Tek bir dize olmalı.

Çizginin sonundaki fazladan boşluk bırakılamaz. Çıktı, rakamları, satır beslemelerini (yeni satırları) ve boşlukları içerebilir.

Oryantasyon önemli değil, bu rotasyonlar ve yansımalar anlamına gelir. Geçerli bir Fibonacci spiral modelini takip ettiği sürece.

Farklı rakamlarda rakam olan sayılar (örneğin 1 ve 13) birbirleriyle tam olarak hizalanmalıdır. Bir çizginin en başına bir boşluk eklenmesi gerekebilir, böylece her şey sıraya girebilir.

1   1                          1   1
100 100  should actually be  100 100

Burada bir örnek görebilirsiniz


Bu yani bayt cinsinden en kısa kod kazanır!


4
İlgili meydan okuma (ve çok havalı bir saat)
Sp3000, 18:15

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.Bu iki cümle olarak daha net olabilir gibi geliyor.
trichoplax

Her numaranın en sağındaki hanesinin hizalanmasını istediğiniz örneklerden görünüyor, ancak "basamağın sol tarafıyla hizalı" gibi sesler tam tersi gibi geliyor.
trichoplax

"Çevreleyen beyaz boşluğa izin verilmiyor" ifadesini netleştirebilir misiniz? Özellikle - hatlarda öncü veya iz bırakan boşluk kabul edilebilir mi?
MtnViewMark

Matlab çıktıyı varsayılan olarak stdout'a yazdırır. Otomatik olarak stdout'a yazdırılan sayısal tür çıktısının (string tür çıktının aksine) olması kabul edilebilir mi?
Luis Mendo

Yanıtlar:


15

APL, 23

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

Açıklama:

⍪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'da deneyin


1
Burada arama yaparsanız, daha önce birçok şüpheniz vardı. İşte örneğin @ Tobia'nın cevabı: * Dyalog APL, üst 128 byte değerine eşlenmiş APL sembollerine sahip eski bir karakter setini destekler. Bu nedenle, yalnızca ASCII karakterlerini ve APL sembollerini kullanan bir APL programı bayt == karakter olarak kabul edilebilir.
Moris Zucca,

Tamam o zaman, yorumumu geri çekeceğim.
gar

1
@MorisZucca Ancak, bazı karakterlerin (gibi veya ) bu karakter kümesinde eksik olduğunu ve bu kuralı uyandırmak istediğinizde kullanılamadığına dikkat edin.
FUZxxl,

1
Doğru, "key" ve "rank" daha yeni uygulamalardır ve aslında kullandığım Dyalog yorumlayıcısının Unicode sürümünde mevcuttur. Klasik versiyonda ⎕command eşdeğerini kullanmak zorundadır. Aynısı örneğin too (⎕OPT) için de geçerlidir. Bu yüzden genellikle Dyalog Classic versiyonunda yazabilirsem, karakter başına 1 bayt olduğunu söylemenin güvenli olduğunu düşünüyorum. Yanlışsam düzelt. Ve yorumunuz için teşekkürler.
Moris Zucca,

8

Matlab, 84 bayt

Bir fonksiyon kullanılır. Çıktı stdout'ta.

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)

Örnekler:

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

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

Bir Matlab'ın özelliklerinden yararlanılması haricinde yukarıdakiyle aynıdır, yani stdout'ta otomatik olarak işlev çıktısını (bir dize olarak) görüntüler. Bu, yukarıdaki yaklaşımda dizgeye dönüştürmeyi önler.

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

bazı Matlab çözümleri görmekten memnun
Hoki

@Hoki Teşekkürler! :-)
Luis Mendo

7

Python 2,121 bayt

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)

Rotasyonlardaki rahat kurallar bunu çok daha basit hale getirir.

Buranın yerine backticks kullanmadım, str(a)çünkü çok uzun süreye ulaşırsak gereğinden fazla lider alana izin verilip verilmediğinden emin değilim. Olsa da, biz olsak bile, akendini kullanmak daha da kısa olurdu.


7

Ruby, 243 242 236 233 222 170 130 bayt

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
Güzel golf! Bazı karakterleri, t==valuekoşulları dönüştürerek 4. satırda kaydedebilirsiniz t>value. Örneğin,(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 bayt

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

Kullanımı:

   (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

Yöntem:

İşlev, geçerli kareyi döndürür ve yeni kareyi geçerli olana bir input-1kez ekler . Kare boyutu ve eleman değerleri önceki dikdörtgenin boyutundan toplanır.

Kod açıklaması:

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

Burada çevrimiçi deneyin.


6

Haskell, 183 176 171 163 bayt

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

İşlev, fsayı alan ve tek bir dize döndüren işlevdir :

λ: 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 bayt

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

Şaşırtıcı bir şekilde, kodun yarısından fazlası matris oluşturmak yerine yazdırma / doldurmadır.

Bununla birlikte, matrisin oluşturulması gerçekten basittir, bir devrik ve tersten oluşur ve N'nin N kopyalarını içeren N satırları eklenir, burada N, mevcut satır sayısıdır.

7 için örnek çıktı:

  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 bayt

@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 bayt

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

Ve hareket halinde:

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

Golf oynamak için hala iyi fırsatlar olabilir.

Program temel olarak birleştirilmiş matrisi oluşturan ve çıktı için biçimlendiren iki bölümden oluşur. İlki oldukça basittir:

  {(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 içeren 1x1'lik bir matris ile başlayarak, T'nin T boyunun ilk boyunda () başlangıç ​​matrisinin uzunluğu olduğu T uzunluğunda bir vektör oluşturun t#t:#xve bunu orijinal matrisin ( x,\:) her satırına ekleyin . Sonucun ( +|) ters çevrilmesi ve aktarılması, 90 derece döndürür. Bunu N-1 kere yapıyoruz.

Biçimlendirme oldukça tıknazdır, çünkü K'nin bir matris basma konusundaki doğal yaklaşımı, sayı sütunlarını ihtiyaç duyduğumuz şekilde hizalamaz:

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

Temel fikir, matrisin ( |//x) en fazla elemanını almak, onu bir dizgeye (unary $) dönüştürmek , uzunluğunu artı bir ( 1+#) almak ve daha sonra matrisin elemanlarını bu boyutta doğru hizalanmış dizelere biçimlendirmek. Ardından toparlamak için, bu dizgilere ( ,/') katılın ve ortaya çıkan baştaki boşluğu ( 1_') bırakın .


4

CJam, 48 bayt

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

Çevrimiçi deneyin

Deseni oluşturmanın çekirdek kısmı oldukça basit görünüyor. Şimdiye kadar oluşturulan dikdörtgeni döndürün ve en altına bir değer karesi ekleyin.

Yine de sonucu doldurma kodu korkunç görünüyor. Dolguyu iç içe listeye uygulamak için birkaç kombinasyon fve :operatör denedim ama hiçbir şey işe yaramadı. Herhangi birisinin daha iyi bir önerisi varsa, memnuniyetle karşılıyoruz.

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.

Tüm satırları ters çevirerek yapılabilir Wf%. Ayrıca, dolgu malzemesi {Se[}ff%yerine bir şey yapabilir misiniz :U;{USe[}f%? (Olduğu gibi çalışmayabilir, şu anda düşünemiyorum.)
Esolanging Meyve

2

Pyth, 29 bayt

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

Gösteri.

APL'deki gibi yastığın serbest / kapalı olması ya da matris çıktısına izin verildiyse, bu 14 bayt olurdu:

u+C_GmmlGGGQ]Y

2

Ruby, 129 bayt

Diğer yakut grubunu bir demet cevapladım, ancak en son yaptığım değişiklik kabul edilmiyor ya da başka bir şey değil, işte burada:

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'ye Hoşgeldiniz! Golf iyileştirmeleri genellikle burada reddedilir (diğer önerileriniz göz önünde bulundurulması gereken kabul edilirse), çünkü yazarın incelemesi için yorumlarda bulunmaları gerekir. Bu politikanın arkasındaki gerekçeyle bu meta yayına bakın.
Martin Ender

Bilgi için teşekkürler, mantıklı. Yorum yapmak, başlangıçta yapacağım şeydi ancak yorum yapmak için yeterli itibar puanım olmadı, ancak gelecekte yapacaktım. Mutlu golf!
user2251284

1

ES6, 248 bayt

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

Nerede \nbir hazır satır karakteri temsil eder.

Can sıkıcı bir şekilde biçimlendirme, kodun çok büyük bir bölümünü kaplar.

fdolu bir dizi yapan yardımcı bir işlevdir. Doldurulmuş kareleri oluşturmak için çoğunlukla kullanılır, ancak aynı zamanda özyineleme için temel kasaları üretmek için iki katına çıkar.

gAna homurdanmadır. Tekrarlayan bir şekilde son fakat bir çözümü üretir, 180 derece döndürür, ardından sonraki iki kareyi ekler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.