Selamat Hari Fibonacci!

20

Latar Belakang

Hari ini (atau Kemarin) adalah (atau dulu) 11/23 atau hari Fibonacci! Apa cara yang lebih baik untuk merayakan selain membuat kue fibonacci?


Contohnya

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

Tantangan

Anda tidak benar-benar membuat kue, hanya lilin karena saya tidak bisa ascii-art kue

Untuk membuat kue Anda harus terlebih dahulu mendapatkan n nomor fibonacci pertama yang diurutkan naik. Tinggi candle ( i) ditentukan oleh nilai dari nomor fibonacci saat ini. Lilin dipisahkan oleh garis bawah ( _).

Kue harus simetris. Jadi lilin kemudian harus dibalik dan disatukan.

Contoh Konstruksi

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 

Referensi Angka Fibonacci

Untuk referensi, berikut adalah 15 angka fibonacci pertama. Dalam tantangan ini, Anda akan mulai 1.

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610
Downgoat
sumber
9
Saya menyesal memberi tahu Pantai Barat Amerika Serikat bahwa untuk sebagian besar dunia, 11/23 sudah berakhir atau hampir berakhir :( Ini baru saja berubah dari kode-golf ke kode tercepat
cat
1
@sysreq Tidak apa-apa, mereka hanya perlu melakukan perjalanan ke pantai barat (langsung), dan kemudian mereka dapat menikmati hari Fibonacci selama 5 jam terakhir (7 untuk hawaii): p
Downgoat
6
Tantangan ini akan menjadi legendaris dalam 43 tahun (23/11/58).
Arcturus
9
Dalam 43 tahun, format tanggal hh / bb / tt akan menjadi riwayat. Semua makhluk cerdas akan beralih ke yyyy / mm / dd ... :-P
1
@sysreq Posting jawaban golf dalam bahasa verbose sangat dianjurkan. Tentu saja, Anda tidak bersaing dengan Pyth, tetapi Anda dapat bersaing dengan jawaban lain dalam bahasa yang sama atau dalam bahasa dengan verbositas yang sebanding.
Martin Ender

Jawaban:

2

Pyth, 31 byte

jaPJ_.ts_BuaaGks>4GtQ]\idXeJ" _

Cobalah online: Demonstrasi

Penjelasan:

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
Jakube
sumber
6

J, 58 byte

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

Penggunaan (%-.-*:)t.untuk generasi Fibonacci. Penjelasan mungkin datang sedikit kemudian.

Pemakaian:

   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

Cobalah online di sini.

randomra
sumber
5

CJam, 41 39 byte

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

Ini mencetak cukup banyak ruang putih terkemuka. Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

"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.
Dennis
sumber
3

TeaScript, 93 84 76 + 1 = 77 byte

+1 byte untuk "Input adalah angka?" kotak centang

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§

Versi tidak disatukan:

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

Terima kasih kepada @ Vɪʜᴀɴ untuk tipsnya.

intrepidcoder
sumber
Anda harus dapat menggunakan rfungsi alih-alih A(x)f(0), misalnyar(x)m(#
Downgoat
@ V Terima kasih. Apa yang Array.dupe()dilakukan, sepertinya tidak berhasil?
intrepidcoder
Array.dupe mungkin nama yang buruk, menghapus duplikat dari array.
Downgoat
@ Vɪʜᴀɴ Anda harus meletakkan ringkasan setiap metode di bagian nama properti dengan argumen input / output. Juga, Array.repeat dan String.reverse akan menyenangkan juga.
intrepidcoder
1
@sysreq yang saya maksud tidak diserang, maaf atas kebingungannya.
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)

Idenya sederhana: menghasilkan gambar dalam kolom ke bawah ke atas, kiri ke kanan, dengan setengah kanan cermin terbalik dari kiri. Kolom-kolom dihasilkan dengan mengulangi pengulangan Fibonacci, pada string i's, diselingi dengan _' s untuk baris bawah.

Untuk mencetak gambar dengan kolom mulai dari bawah, kita perlu memutarnya, yang berarti transposing dan pembalikan. Sayangnya, Python tidak memiliki cara sederhana untuk mengubah urutan deretan panjang yang tidak sama. Built-in zipterpotong ke baris terpendek. Ini menggunakan map(None,_)trik, tetapi harus mengubah semua Nonemenjadi spasi sesudahnya.

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

Panggil c.

( fTanpa malu-malu dicuri dari /programming/232861/fibonacci-code-golf )

Leif Willerts
sumber
Anda bisa menggantinya flip replicate 'i'.(f!!)dengan \x->[1..f!!x]>>"i".
nimi
Terima kasih banyak! Ini adalah pertama kalinya saya benar-benar mengerti tip golf monadik, meskipun saya sendiri belum memunculkannya. Tidak ada petunjuk bagaimana cara fkerjanya ...
Leif Willerts
1

Matlab, 172 152 byte

Sayangnya, Matlab tidak memiliki fungsi Fibonacci dan Manipulasi string sedikit rumit.

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

Dengan jeda baris:

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)]
Jonas
sumber
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 ' ', '_'}}

Tidak Terkumpul:

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

Pemakaian:

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

Keluaran:

              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
Vasu Adari
sumber
1

Python 2, 213

Disimpan 12 byte berkat 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]

Versi tidak disatukan.

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])
Morgan Thrapp
sumber