피보나치 나선


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.이것은 두 문장으로 더 분명한 것처럼 들립니다.
trichoplax

각 숫자의 가장 오른쪽 자릿수가 정렬 되길 원하는 예에서 보았지만 "숫자 왼쪽에 정렬 됨"은 반대처럼 들립니다.
trichoplax

"주변 공백은 허용되지 않습니다"를 명확히 할 수 있습니까? 특히-행의 선행 또는 후행 공백이 허용됩니까?
MtnViewMark

Matlab은 기본적으로 출력을 표준 출력으로 인쇄합니다. stdout에 자동으로 인쇄되는 숫자 유형 출력 (문자열 유형 출력과 달리)을 사용할 수 있습니까?
Luis Mendo

답변:


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 바이트 값에 매핑 된 레거시 문자 집합을 지원합니다. 따라서 ASCII 문자와 APL 기호 만 사용하는 APL 프로그램은 바이트 == 문자로 간주 될 수 있습니다.
Moris Zucca

그럼 내 의견을 철회하겠습니다.
gar

1
@MorisZucca 그렇지만, ( 또는 같은 ) 일부 문자 가 해당 문자 세트에서 누락되어 해당 규칙을 불러 오려면 사용할 수 없습니다.
FUZxxl

1
사실 "key"와 "rank"는 새로운 구현이며 실제로 사용하는 Dyalog 인터프리터의 유니 코드 버전에서만 존재합니다. Classic 버전은 ⎕ 명령과 동등한 기능을 사용해야합니다. 예를 들어 ⍠ (⎕OPT)도 마찬가지입니다. 따라서 일반적으로 Dyalog Classic 버전으로 작성할 수 있다면 문자 당 1 바이트라고 말하는 것이 안전하다고 생각합니다. 틀린 점 있으면 지적 해주세요. 그리고 의견을 주셔서 감사합니다.
Moris Zucca

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의 기능을 활용한다는 점을 제외하고는 위와 동일합니다. 즉, 자동으로 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

감사합니다! :-)
Luis Mendo

7

파이썬 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
좋은 골프! t==value조건을 로 변환하여 4 행에 일부 문자를 저장할 수 있습니다 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}}
Cristian Lupascu

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

하스켈 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

펄, 289777757 바이트

@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 바이트

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

1을 포함하는 1x1 행렬로 시작하여 T의 T- 길이 벡터를 구축합니다. 여기서 T는 첫 번째 차원에서 시작 행렬의 길이 ( t#t:#x)이고이를 원래 행렬의 각 행에 연결합니다 ( x,\:). 결과를 반대로 바꾸면 ( +|) 90도 회전합니다. 우리는이 N-1 번을합니다.

행렬을 인쇄하는 K의 자연스러운 접근 방식은 숫자 열을 필요한 방식으로 정렬하지 않기 때문에 서식이 매우 까다 롭습니다.

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

기본 아이디어는 행렬의 최대 요소 |//x( $)를 가져 와서 문자열 (단항 ) 로 변환 하고 길이에 1을 더한 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%있습니까? (그대로 작동하지 않을 수 있습니다, 지금 그것을 생각할 수 없습니다.)
Esolanging Fruit

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도 회전 한 다음 다음 두 정사각형을 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.