Spirale di Fibonacci


37

Il tuo obiettivo è generare una spirale di Fibonacci con numeri.

Campione

Esempio di 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

Ingresso di 9

Input L'ingresso può essere acquisito tramite STDIN o argomento della funzione. Sarà un singolo numero

Uscita L'uscita può provenire da STDOUT o dal valore di ritorno di una funzione. Dovrebbe essere una singola stringa.

Non sono ammessi spazi extra alla fine della riga. L'output può contenere cifre, avanzamenti riga (newline) e spazi.

L'orientamento non ha importanza, questo significa rotazioni e riflessioni. Finché segue un modello a spirale di Fibonacci valido.

I numeri con diverse quantità di cifre (ad esempio 1 e 13) devono essere allineati a destra l'uno con l'altro. Potrebbe essere necessario aggiungere uno spazio all'inizio di una riga in modo che tutto possa allinearsi.

1   1                          1   1
100 100  should actually be  100 100

Puoi vedere un esempio qui


Questo è quindi vince il codice più breve in byte!


4
Sfida correlata (e un orologio molto interessante)
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.Sembra che potrebbe essere più chiaro di due frasi.
trichoplax,

Sembra dagli esempi che si desidera allineare la cifra più a destra di ciascun numero, ma "allineato alla parte sinistra della cifra" suona come il contrario.
trichoplax,

Puoi chiarire che "gli spazi bianchi circostanti non sono ammessi"? In particolare, lo spazio bianco iniziale o finale sulle linee è accettabile?
MtnViewMark,

Matlab stampa l'output su stdout per impostazione predefinita. È accettabile avere un output di tipo numerico (al contrario dell'output di tipo stringa) che viene automaticamente stampato su stdout?
Luis Mendo,

Risposte:


15

APL, 23

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

Spiegazione:

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

Provalo su tryapl.org


1
Se cerchi qui, molti avevano i tuoi dubbi prima. Ecco ad esempio la risposta di @Tobia: * Dyalog APL supporta un set di caratteri legacy che ha i simboli APL associati ai valori superiori di 128 byte. Pertanto, un programma APL che utilizza solo caratteri ASCII e simboli APL può essere considerato come byte == caratteri.
Moris Zucca,

Va bene allora, ritrarrò il mio commento.
Gar

1
@MorisZucca Si noti, tuttavia, che alcuni caratteri (come o ) mancano da quel set di caratteri e non possono essere utilizzati quando si desidera evocare quella regola.
FUZxxl,

1
Vero, "chiave" e "rango" sono implementazioni più recenti ed esistono infatti solo nella versione Unicode dell'interprete Dyalog che uso. La versione classica deve usare l'equivalente del comando ⎕. Lo stesso vale anche per ⍠ (⎕OPT). Quindi di solito penso che se posso scriverlo nella versione Dyalog Classic, è sicuro dire che è 1 byte per carattere. Correggimi se sbaglio. E grazie per il commento.
Moris Zucca,

8

Matlab, 84 byte

Viene utilizzata una funzione. L'output è in 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)

Esempi:

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

Come sopra, tranne che viene sfruttata la funzionalità di Matlab, ovvero visualizza automaticamente l'output della funzione (come stringa) in stdout. Questo evita la conversione in stringa nell'approccio sopra.

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

felice di vedere alcune soluzioni Matlab :-)
Hoki,

@Hoki Grazie! :-)
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)

Le regole rilassate sulle rotazioni lo rendono molto più semplice.

Non ho usato i backtick al posto di str(a)qui perché non sono sicuro che ci siano consentiti più spazi iniziali del necessario, se mai raggiungeremo i long. Anche se, anche se lo fossimo, l'uso astesso sarebbe comunque più breve.


7

Rubino, 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}*" "}

1
Bel golf! Puoi salvare alcuni caratteri sulla riga 4, convertendo le t==valuecondizioni in t>value. Ad esempio,(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 byte

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

Uso:

   (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

Metodo:

La funzione ruota il quadrato corrente e aggiunge il nuovo quadrato all'attuale una input-1volta. Le dimensioni quadrate e i valori degli elementi sono raccolti dalle dimensioni del rettangolo precedente.

Spiegazione del codice:

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

Provalo online qui.


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

La funzione è f, che accetta un numero e restituisce una singola stringa:

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

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

Sorprendentemente, più della metà del codice è in stampa / riempimento, piuttosto che generare la matrice.

La generazione della matrice è davvero semplice, consiste in una trasposizione e un'inversione e l'aggiunta di N righe contenenti N copie di N, dove N è il numero corrente di righe.

Esempio di output per 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, 289277257 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}

4

K, 48 byte

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

E in azione:

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

Potrebbero essere ancora alcune buone opportunità per il golf.

Il programma consiste essenzialmente di due parti: generare la matrice concatenata e formattarla per l'output. Il primo è abbastanza semplice:

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

Cominciando con una matrice 1x1 contenente 1, costruisci un vettore T di lunghezza T dove T è la lunghezza della matrice iniziale sulla prima dimensione ( t#t:#x) e collegala a ciascuna riga della matrice originale ( x,\:). Invertire e trasporre il risultato ( +|) lo ruota di 90 gradi. Lo facciamo N-1 volte.

La formattazione è piuttosto voluminosa, perché l'approccio naturale di K alla stampa di una matrice non allinea le colonne numeriche nel modo in cui abbiamo bisogno:

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

L'idea di base è prendere l'elemento massimo della matrice ( |//x), convertirlo in una stringa (unaria $), prendere la sua lunghezza più uno ( 1+#) e quindi formattare gli elementi della matrice in stringhe allineate a destra di quella dimensione. Quindi per riordinare, unire quelle stringhe ( ,/') e rilasciare lo spazio iniziale risultante ( 1_').


4

CJam, 48 byte

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

Provalo online

La parte fondamentale della generazione del modello sembra ragionevolmente semplice. Ruota il rettangolo creato finora e aggiungi un quadrato di valori nella parte inferiore.

Il codice per riempire il risultato sembra orribile, però. Ho provato un sacco di combinazioni di fe :operatori per applicare il riempimento all'elenco nidificato, ma nulla ha funzionato. Se qualcuno ha suggerimenti migliori, sono i benvenuti.

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.

È possibile invertire tutte le righe con Wf%. Inoltre, saresti in grado di fare qualcosa di simile {Se[}ff%anziché :U;{USe[}f%per l'imbottitura? (Potrebbe non funzionare così com'è, al momento non ci riesco.)
Esolanging Fruit

2

Pyth, 29 byte

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

Dimostrazione.

Se il padding fosse libero / implicito, come in APL, o fosse consentito l'output della matrice, questo sarebbe di 14 byte:

u+C_GmmlGGGQ]Y

2

Rubino, 129 byte

Ho modificato un altro rubino rispondendo a un mucchio, ma il mio ultimo cambiamento non è stato accettato o qualcosa del genere, quindi eccolo qui:

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
Benvenuti in PPCG! I miglioramenti del golf di solito sono respinti qui (se sono stati accettati altri suggerimenti che devono essere stati una svista), perché dovrebbero essere pubblicati nei commenti che l'autore può rivedere. Vedi questo meta post per il ragionamento alla base di questa politica.
Martin Ender,

Grazie per le informazioni, ha un senso. Commentare è quello che avrei fatto inizialmente ma non avevo abbastanza punti reputazione da commentare, ma lo farò in futuro. Buon 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`)

Dove \nrappresenta un carattere letterale newline.

La formattazione occupa fastidiosamente una grande parte del codice.

fè una funzione di supporto che crea un array pieno. Viene utilizzato principalmente per creare i quadrati riempiti ma raddoppia anche facilmente per produrre i casi di base per la ricorsione.

gè il gruntwork principale. Genera in modo ricorsivo l'ultima ma una soluzione, la ruota di 180 gradi, quindi aggiunge i due quadrati successivi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.