Спіраль Фібоначчі


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.Це здається, що це може бути зрозумілішим, як два речення.
трихоплакс

З прикладів випливає, що ви хочете, щоб найменша права цифра кожного номера була вирівняна, але "вирівняна ліва частина цифри" звучить як протилежне.
трихоплакс

Чи можете ви уточнити "навколишній пробіл не дозволений"? Зокрема - чи прийнятні провідні чи відсталі пробіли на лініях?
MtnViewMark

За замовчуванням Matlab друкує вихід у stdout. Чи допустимо виведення числового типу (на відміну від виводу рядкового типу), яке автоматично надрукується в stdout?
Луїс Мендо

Відповіді:


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 підтримує застарілу схему, яка містить символи APL, відображені у верхніх 128-байтних значеннях. Тому програма APL, яка використовує лише символи ASCII та символи APL, може вважатися байтами == знаками.
Моріс Зукка

Гаразд, я відкину свій коментар.
гар

1
@MorisZucca Зауважте, що деякі символи (на кшталт або ) відсутні у цьому наборі символів, і їх не можна використовувати, коли ви хочете викликати це правило.
FUZxxl

1
Правда, "ключ" та "ранг" - це новіші реалізації та фактично існують лише у версії Unicode інтерпретатора Dyalog, який я використовую. Класична версія повинна використовувати еквівалент ma command. Це ж стосується, наприклад, ⍠ (⎕OPT). Тому я зазвичай думаю, що якщо я можу записати це у версії Dyalog Classic, можна з упевненістю сказати, що це 1 байт на графік. Виправте мене, якщо я помиляюся. І дякую за коментар.
Моріс Зукка

8

Матлаб, 84 байти

Використовується функція. Вихід є у 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)

Приклади:

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

Матлаб, 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, а саме вона автоматично відображає функцію виведення (у вигляді рядка) у stdout. Це дозволяє уникнути перетворення на рядок у вищевказаному підході.

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 :-)
Хокі

@Hoki Дякую! :-)
Луїс Мендо

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
Приємного гольфу! Ви можете зберегти деякі символи на лінії 4, перетворивши t==valueумови на 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}}
Крістіан Лупаску

6

Пітон - 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

Спосіб:

Функція обертає поточний квадрат і додає новий квадрат до поточного один 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

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

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

Можливо, ще є кілька хороших можливостей для гри в гольф.

Програма в основному складається з двох частин - генерування об'єднаної матриці та форматування її для виведення. Перший досить простий:

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

Починаючи з матриці 1x1, що містить 1, побудуйте вектор довжини T у T, де T - довжина стартової матриці на першому вимірі ( t#t:#x), і додайте його до кожного рядка вихідної матриці ( x,\:). Повернення і транспонування результату ( +|) обертає його на 90 градусів. Робимо це N-1 рази.

Форматування є досить незграбним, оскільки природний підхід K до друку матриці не вирівняє стовпці з числами так, як нам потрібно:

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

Основна ідея полягає в тому, щоб взяти максимальний елемент матриці ( |//x), перетворити його в рядок (одинарний $), взяти його довжину плюс один ( 1+#), а потім відформатувати елементи матриці до вирівняних рядків правого розміру такого розміру. Потім, щоб виправити, приєднайтеся до цих рядків ( ,/') і опустіть отриманий провідний пробіл ( 1_').


4

CJam, 48 байт

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

Спробуйте в Інтернеті

Основна частина створення схеми виглядає досить просто. Поверніть створений до цього часу прямокутник і додайте квадрат значень внизу.

Хоча код для підбивання результату виглядає жахливо. Я спробував купу комбінацій fта :операторів застосувати вкладку до вкладеного списку, але нічого не вийшло. Якщо хтось має кращі пропозиції, вони вітаються.

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

Де \nпредставляє буквальний символ нового рядка.

Прикро форматування займає великий шматок коду.

f- це допоміжна функція, яка робить заповнений масив. Він використовується в основному для створення заповнених квадратів, але також зручно збільшується вдвічі для створення базових випадків для рекурсії.

g- це головна робота. Він рекурсивно генерує останнє, але одне рішення, обертає його на 180 градусів, потім додає наступні два квадрати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.