Chúc mừng ngày Fibonacci!


20

Lý lịch

Hôm nay (hoặc Hôm qua) là (hoặc là) 11/23 hoặc ngày Fibonacci! Còn cách nào tốt hơn để ăn mừng hơn là làm một chiếc bánh của Wikipedia?


Ví dụ

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

Thử thách

Bạn không thực sự làm bánh, chỉ là nến vì tôi không thể làm bánh

Để làm cho bánh trước tiên bạn phải có được là người đầu tiên n số fibonacci được sắp xếp tăng dần. iChiều cao của nến ( ) được xác định theo giá trị của số Wikipedia hiện tại. Các nến được phân tách bằng dấu gạch dưới ( _).

Bánh nên đối xứng. Vì vậy, nến nên được lật và nối.

Ví dụ xây dựng

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 

Số Fib tham chiếu

Để tham khảo, đây là 15 số đầu tiên của Wikipedia. Trong thử thách này, bạn sẽ bắt đầu tại 1.

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

9
Tôi rất tiếc phải thông báo cho Bờ Tây Hoa Kỳ rằng đối với hầu hết mọi người trên thế giới, ngày 23/11 đã kết thúc hoặc gần hết :( Điều này vừa chuyển từ môn đánh gôn sang mã nhanh nhất
chú mèo

1
@sysreq Không sao, họ chỉ cần đi đến bờ biển phía tây (ngay lập tức), và sau đó họ có thể tận hưởng ngày Fibonacci trong 5 giờ qua (7 đối với hawaii): p
Downgoat

6
Thử thách này sẽ trở thành huyền thoại sau 43 năm nữa (23/11/58).
Arcturus

9
Trong 43 năm, định dạng ngày mm / dd / yy sẽ là lịch sử. Tất cả chúng sinh thông minh sẽ chuyển sang yyyy / mm / dd ... :-P

1
@sysreq Đăng câu trả lời golf trong các ngôn ngữ dài dòng được khuyến khích rất nhiều. Tất nhiên, bạn không cạnh tranh với Pyth, nhưng bạn có thể cạnh tranh với các câu trả lời khác trong cùng ngôn ngữ hoặc bằng các ngôn ngữ có độ dài tương đương.
Martin Ender

Câu trả lời:


2

Bình thường, 31 byte

jaPJ_.ts_BuaaGks>4GtQ]\idXeJ" _

Dùng thử trực tuyến: Trình diễn

Giải trình:

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 byte

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

Sử dụng (%-.-*:)t.cho thế hệ Fibonacci. Giải thích có thể đến một chút sau.

Sử dụng:

   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

Hãy thử trực tuyến tại đây.


5

CJam, 41 39 byte

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

Điều này in một số lượng khá lớn của khoảng trắng hàng đầu. Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

"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

TeaScript, 93 84 76 + 1 = 77 byte

+1 byte cho "Đầu vào là số?" hộp kiểm

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§

Phiên bản bị đánh cắp:

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

Cảm ơn @ Vɪʜᴀɴ vì những lời khuyên.


Bạn sẽ có thể sử dụng rchức năng thay vì A(x)f(0), ví dụ:r(x)m(#
Hạ cấp

@ Vɪʜᴀɴ Cảm ơn. Làm gì Array.dupe(), nó dường như không hoạt động?
intrepidcoder

Array.dupe có lẽ là một tên xấu, nó loại bỏ các bản sao khỏi một mảng.
Hạ cấp

@ Vɪʜᴀɴ Bạn nên đặt một bản tóm tắt của từng phương thức trong phần tên thuộc tính với các đối số đầu vào / đầu ra. Ngoài ra, Array.repeat và String.reverse cũng sẽ rất tuyệt.
intrepidcoder

1
@sysreq Ý tôi là vô lương tâm, xin lỗi vì sự nhầm lẫn.
intrepidcoder

3

Python 2, 117 byte

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)

Ý tưởng rất đơn giản: tạo hình ảnh trong các cột từ dưới lên trên, từ trái sang phải, với gương được nhân đôi một nửa ngược lại bên trái. Các cột được tạo bằng cách lặp lại quá trình lặp lại Fibonacci, trên các chuỗi của i, xen kẽ với _'s cho hàng dưới cùng.

Để in hình ảnh với các cột bắt đầu từ phía dưới, chúng ta cần xoay nó, có nghĩa là hoán vị và đảo ngược. Thật không may, Python không có cách đơn giản để hoán chuyển một mảng các hàng có độ dài không bằng nhau. Các zipcắt ngắn tích hợp đến hàng ngắn nhất. Điều này sử dụng map(None,_)thủ thuật, nhưng phải chuyển đổi tất cả Nonesang không gian sau đó.


2

Haskell, 182 176 byte

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]

Gọi c.

( fbị đánh cắp một cách đáng xấu hổ từ /programming/232861/fiborie-code-golf )


Bạn có thể thay thế flip replicate 'i'.(f!!)bằng \x->[1..f!!x]>>"i".
nimi

Cảm ơn rất nhiều! Đây là lần đầu tiên tôi thực sự hiểu một mẹo chơi golf đơn điệu, mặc dù tôi chưa tự mình nghĩ ra. Không có manh mối nào về cách thức fhoạt động vẫn ...
Leif Willerts

1

Matlab, 172 152 byte

Thật không may, Matlab không có bản dựng trong hàm Fibonacci và Thao tác chuỗi là hơi khó.

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

Với ngắt dòng:

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

Ruby, 151 146 142 137 132 byte

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

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

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

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

->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 ' ', '_'}}

Ung dung:

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

Sử dụng:

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

Đầu ra:

              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

Con trăn 2, 213

Đã lưu 12 byte nhờ DSM.

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]

Phiên bản bị đánh cắp.

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])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.