행복한 피보나치의 날!


20

배경

오늘 (또는 어제)은 11/23 또는 피보나치 날입니다! 피보나치 케이크를 만드는 것보다 축하하는 더 좋은 방법은 무엇입니까?


3

    ii
i_i_ii_i_i 

8

              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
            i ii i            
            i ii i            
            i ii i            
            i ii i            
            i ii i            
          i i ii i i          
          i i ii i i          
          i i ii i i          
        i i i ii i i i        
        i i i ii i i i        
      i i i i ii i i i i      
    i i i i i ii i i i i i    
i_i_i_i_i_i_i_ii_i_i_i_i_i_i_i

도전

케이크를 아스키 아 아트 할 수 없기 때문에 케이크를 만드는 게 아니라 촛불 만

케이크를 만들려면 먼저 n 피보나치 숫자가 오름차순으로 정렬 되어야합니다 . 양초 ( i)의 높이는 현재 피보나치 수의 값으로 결정됩니다. 양초는 밑줄 ( _) 로 구분됩니다 .

케이크는 대칭이어야합니다. 따라서 양초를 뒤집고 연결해야합니다.

건설 예

Input: 6
First 6 Fibonacci Numbers: 1, 1, 2, 3, 5, 8
Candle heights:

          i
          i
          i
        i i
        i i
      i i i
    i i i i
i i i i i i
-----------
1 1 2 3 5 8

Output would be:
          ii
          ii
          ii
        i ii i
        i ii i
      i i ii i i
    i i i ii i i i
i_i_i_i_i_ii_i_i_i_i_i 

피보나치 수 참조

참고로, 처음 15 피보나치 수는 다음과 같습니다. 이 도전에서 당신은에서 시작 1합니다.

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610

9
11/23이 끝났거나 거의 끝났다는 사실을 미국 서해안에 알리는 것이 유감입니다. (이것은 코드-골프 에서 가장 빠른
cat

1
@sysreq 괜찮아요, 그들은 단지 서쪽 해안 (즉시) 여행을해야하고, 그들은 (하와이 7) 마지막으로 5 시간 동안 피보나치 일 체험 할 수 있도록 페이지
Downgoat

6
이 도전은 43 년 만에 전설이 될 것입니다 (11/23/58).
Arcturus

9
43 년 후 mm / dd / yy 날짜 형식이 기록이됩니다. 모든 지능 존재는 yyyy / mm / dd로 전환 될 것입니다 ...

1
@sysreq 장황한 언어로 골프 답변을 게시하는 것이 좋습니다. 물론 Pyth와 경쟁하지는 않지만 같은 언어 또는 비슷한 언어로 다른 답변과 경쟁 할 수 있습니다.
Martin Ender

답변:


2

Pyth, 31 바이트

jaPJ_.ts_BuaaGks>4GtQ]\idXeJ" _

온라인으로 사용해보십시오 : 데모

설명:

jaPJ_.ts_BuaaGks>4GtQ]\idXeJ" _   implicit: Q = input number
          u        tQ]\i          reduce the list [1, ..., Q-2], start with G=["i"]
            aGk                      append the empty string to G
           a   s>4G                  append the sum of the last 4 strings in G to G
                                  this gives ["i", "", "i", "", "ii", "", "iii",..]
       s_B                        extend the list with the reversed list
     .t                  d        pad to a rectangle with spaces and transposes
   J_                             reverse the order and assign to J
  PJ                              remove the last string of J
 a                                and append
                         XeJ" _   the last string of J with spaces replaced by "_"
j                                 print each string on a separate line

6

J, 58 바이트

3 :''' i_''{~|.|:(,|.)(#&1,2#~0&=)"*}.,0,.(%-.-*:)t.1+i.y'

(%-.-*:)t.피보나치 생성에 사용 합니다. 나중에 설명이 올 수 있습니다.

용법:

   f=.3 :''' i_''{~|.|:(,|.)(#&1,2#~0&=)"*}.,0,.(%-.-*:)t.1+i.y'
   f 5
        ii        
        ii        
      i ii i      
    i i ii i i    
i_i_i_i_ii_i_i_i_i

여기에서 온라인으로 사용해보십시오.


5

CJam, 41 39 바이트

"i""_"1$ri({1$1$4$+}*]),f{Se[}W<_W%+zN*

이것은 상당한 양의 선행 공백을 인쇄합니다. CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

"i""_"1$ e# Push "i", "_", and a copy of "i".
ri(      e# Read an integer from STDIN and subtract 1.
{        e# Do that many times:
  1$     e#   Copy the last underscore.
  1$4$+  e#   Copy the last strings of i's and concatenate them.
}*       e#
]),      e# Wrap the results in an array, pop the last string, and get its length.
f{       e# For each remaining string, push the string and the length; then:
  Se[    e#   Pad the string to that length by prepending spaces.
}
W<       e# Remove the last string (underscore).
         e# We have now generated the columns of the left half of the output.
_W%+     e# Append a reversed copy (columns of right half).
z        e# Transpose rows with columns.
N*       e# Separate the rows by linefeeds.

3

티 스크립트, 93 84 76 + 1 = 77 바이트

"입력은 숫자입니까?"에 +1 바이트 확인란

r×ß(p.R((w=F(x©-F(i¬©+"i"R(F(i¬±)t¡ß(j=i<w-1?" ":"_",(A=l¿i>0?j+l:l)µ)+Av©j§

언 골프 버전 :

r(x)m(#(p.R((w=F(x))-F(i+1))+"i"R(F(i+1))))t()m(#(j=i<w-1?" ":"_",(A=ls``.m(#i>0?j+l:l)j``)+Av))j`
`

팁을위한 @ Vɪʜᴀɴ 에게 감사합니다 .


예를 들어rA(x)f(0)r(x)m(#
Downgoat

@ Vɪʜᴀɴ 감사합니다. 무엇을 않는 Array.dupe()수행이 작동하지 않는 것?
intrepidcoder

Array.dupe는 잘못된 이름 일 수 있으며 배열에서 중복을 제거합니다.
Downgoat

@ Vɪʜᴀɴ 입력 / 출력 인수와 함께 속성 이름 섹션에 각 메소드의 요약을 넣어야합니다. 또한 Array.repeat 및 String.reverse도 좋습니다.
intrepidcoder

1
@sysreq 나는 풀리지 않았다는 것을 의미했다. 혼란을 드려 죄송하다.
intrepidcoder

3

파이썬 2, 117 바이트

a=b='i'
l=a,
exec"l+='_',b,;a,b=b,b+a;"*~-input()
for r in map(None,*l+l[::-1])[::-1]:print''.join(x or' 'for x in r)

아이디어는 간단합니다. 왼쪽에서 오른쪽으로 반전 된 왼쪽에서 오른쪽으로 왼쪽에서 오른쪽으로 열로 그림을 생성하십시오. 열은 맨 아래 행의 i와 함께 산재 된 문자열에서 피보나치 반복을 반복하여 생성됩니다 _.

아래에서 시작하여 열이있는 그림을 인쇄하려면 그림을 회전해야하므로 조옮김과 반전이 필요합니다. 불행히도 파이썬은 길이가 다른 행의 배열을 바꾸는 간단한 방법이 없습니다. 내장 zip이 가장 짧은 행으로 잘립니다. 이것은 map(None,_)트릭을 사용 하지만 None나중에 모든 공간을 공백 으로 변환해야합니다 .


2

하스켈, 182176 바이트

import Data.List
f=0:scanl(+)1f
b n c s|length s<n=b n c(c:s)|0<1=s
m s=s++reverse s
c n=mapM_ putStrLn$transpose$m$map(b(f!!n)' ')$intersperse"_"$map(\x->[1..f!!x]>>"i")[1..n]

요구 c .

( /programming/232861/fibonacci-code-golff 에서 부끄러운 도난 )


당신은 대체 할 수 있습니다 flip replicate 'i'.(f!!)\x->[1..f!!x]>>"i".
nimi

감사합니다! 내가 아직 그 자신을 생각해 내지 않더라도 이것은 실제로 골프 골프 팁을 이해하는 것은 처음입니다. 어떻게 f작동 하는지에 대한 단서가 없습니다 ...
Leif Willerts

1

Matlab, 172152 바이트

불행히도 Matlab은 피보나치 함수를 빌드하지 않았으며 문자열 조작은 약간 어리 석습니다.

function t(n);f=@(n)getfield([0 1;1 1]^n,{3});m=char(flipud(bsxfun(@(a,b)(a<=f(b/2)&mod(b,2)==0)*'i',(1:f(n))',2:2*n)));m(end,2:2:end)='_';[m fliplr(m)]

줄 바꿈으로 :

function t(n);
f=@(n)getfield([0 1;1 1]^n,{3});
m=char(flipud(bsxfun(@(a,b)(a<=f(b/2)&mod(b,2)==0)*'i',(1:f(n))',2:2*n)));
m(end,2:2:end)='_';
[m fliplr(m)]

1

루비 151 146 142 137 132 바이트

->n{s=1,1;3.upto(n){s<<s[-1]+s[-2]};s.map!{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map!{|a|v=a*'_ '[a.count(?i)<=>n];puts v+v.reverse}}

137 바이트

->n{s=1,1;3.upto(n){s<<s[-1]+s[-2]};o=s.map{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map{|a|v=a*' ';v+v.reverse};o[-1]=o[-1].tr' ',?_;puts o}

142 바이트

->n{s=1,1;(3..n).map{s<<s[-1]+s[-2]};puts s.map{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map{|a|v=a*' ';v+v.reverse}.tap{|c|c[-1]=c[-1].tr' ',?_}}

146 바이트

->n{s=1,1;(3..n).map{s<<s[-1]+s[-2]};puts s.map{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map{|a|v=a.join' ';v+v.reverse}.tap{|c|c[-1]=c[-1].tr' ',?_}}

151 바이트

->n{s=1,1;(3..n).map{s<<s[-1]+s[-2]};puts s.map{|i|[' ']*(s[-1]-i)+['i']*i}.transpose.map{|a|v=a.join ' ';v+v.reverse}.tap{|c|c[-1]=c[-1].tr ' ', '_'}}

언 골프 드 :

-> n {
  s = 1,1
  3.upto(n) {
    s << s[-1] + s[-2]
  }
  s.map! { |i|
    [' '] * (s[-1]-i) + [?i] * i
  }.
  transpose.
  map! { |a|
    v = a * '_ '[a.count(?i)<=>n]
    puts v + v.reverse
  }
}

용법:

->n{s=1,1;3.upto(n){s<<s[-1]+s[-2]};s.map!{|i|[' ']*(s[-1]-i)+[?i]*i}.transpose.map!{|a|v=a*'_ '[a.count(?i)<=>n];puts v+v.reverse}}[8]

산출:

              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
              ii              
            i ii i            
            i ii i            
            i ii i            
            i ii i            
            i ii i            
          i i ii i i          
          i i ii i i          
          i i ii i i          
        i i i ii i i i        
        i i i ii i i i        
      i i i i ii i i i i      
    i i i i i ii i i i i i    
i_i_i_i_i_i_i_ii_i_i_i_i_i_i_i

1

파이썬 2, 213

DSM 덕분에 12 바이트를 절약했습니다.

def f(r):
 a=b=1
 while r:yield a;a,b=b,a+b;r-=1
n=list(f(input()))
n.remove(1)
h=max(n)-1
r=1
while h:
 l='  '*(len(n)+1)+('i '*r)[:-1];print(l+l[::-1]);h-=1
 if h in n:r+=1;n.pop()
l='i_'*r+'i_i'
print l+l[::-1]

언 골프 버전.

max_height = input()
def fib(r):
    a=b=1
    while r:
        yield a
        a,b = b, a + b
        r-=1

numbers = [x for x in fib(max_height) if x>1]
highest = max(numbers) -1
rows = 1
while highest:
    line =' '*((len(numbers)+1)*2) + ' '.join('i'*rows)
    print(line + line[::-1])
    highest -= 1
    if highest in numbers:
        rows += 1
        numbers.pop()

line = '_'.join('i'*(rows+2))
print(line + line[::-1])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.