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

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

Вы можете увидеть пример здесь


Это поэтому выигрывает самый короткий код в байтах!

Downgoat
источник
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 печатает вывод на стандартный вывод по умолчанию. Допустимо ли иметь вывод числового типа (в отличие от вывода строкового типа), который автоматически выводится на стандартный вывод?
Луис Мендо

Ответы:

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, который я использую. Классическая версия должна использовать эквивалент команды. То же самое относится и к ⍠ (⎕OPT), например. Поэтому я обычно думаю, что если я могу написать это в версии Dyalog Classic, можно с уверенностью сказать, что это 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само по себе было бы короче в любом случае.

Sp3000
источник
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))
faubi
источник
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

Попробуйте это онлайн здесь.

randomra
источник
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

Функция is 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
MtnViewMark
источник
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
orlp
источник
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_').

Johne
источник
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%для заполнения? (Это может не сработать, как есть, я не могу обдумать это прямо сейчас.)
Esolanging Fruit
2

Pyth, 29 байт

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

Демонстрация.

Если бы заполнение было бесплатным / неявным, как в APL, или был разрешен вывод матрицы, это было бы 14 байтов:

u+C_GmmlGGGQ]Y
isaacg
источник
2

Рубин, 129 байт

Я отредактировал другой ответ ruby, но мои последние изменения не принимаются или что-то в этом роде, поэтому вот оно:

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}*' '}
user2251284
источник
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 градусов, а затем добавляет следующие два квадрата.

Нил
источник