Mutlu Fibonacci Günü!


20

Arka fon

Bugün (ya da Dün) 11/23 ya da Fibonacci günü! Bir kutlama pastası yapmaktan daha iyi bir yol var mı?


Örnekler

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

Meydan okuma

Gerçekten pasta yapmıyorsun, sadece mumlar çünkü pasta sanatını yapamam

Pastayı yapmak için önce artan ilk sıralanmış n fibonacci sayılarını almalısınız . Mumun ( i) yüksekliği, mevcut fibonacci sayısının değeri ile belirlenir. Mumlar bir alt çizgi ( _) ile ayrılır .

Kek simetrik olmalıdır. Bu yüzden mumlar döndürülmeli ve birleştirilmelidir.

Örnek Yapı

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 

Referans Fibonacci Numaraları

Referans olarak, ilk 15 fibonacci numarası. Bu meydan okumada, başlayacaksınız 1.

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

9
Dünyanın çoğu için, 23/11 bitti veya bitmek üzere :( Bu sadece dan döndü ben ABD'nin Batı Yakası üzülerek kod golf için en hızlı kod
cat

1
@sysreq Sorun değil, sadece batı kıyısına seyahat etmeleri gerekiyor (anında) ve sonra son 5 saat boyunca (hawaii için 7) Fibonacci gününün tadını çıkarabilirler: p
Downgoat

6
Bu mücadele 43 yılda efsanevi olacak (11/23/58).
Arcturus

9
43 yıl içinde aa / gg / yy tarih formatı geçmiş olacaktır. Tüm zeki varlıklar yyyy / aa /

1
@sysreq Golfçü cevapları ayrıntılı dillerde yayınlamak çok teşvik edilir. Tabii ki, Pyth ile rekabet etmiyorsunuz, ancak aynı dilde veya karşılaştırılabilir ayrıntı düzeyindeki dillerde diğer cevaplarla rekabet edebilirsiniz.
Martin Ender

Yanıtlar:


2

Pyth, 31 bayt

jaPJ_.ts_BuaaGks>4GtQ]\idXeJ" _

Çevrimiçi deneyin: Gösteri

Açıklama:

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 bayt

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

(%-.-*:)t.Fibonacci üretimi için kullanır . Açıklama biraz sonra gelebilir.

Kullanımı:

   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

Burada çevrimiçi deneyin.


5

CJam, 41 39 bayt

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

Bu, önemli miktarda önde gelen boşluk yazdırır. CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

"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 bayt

"Girdiler sayı mı?" İçin +1 bayt Onay kutusu

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§

Ungolfed sürümü:

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

İpuçları için @ Vɪʜᴀɴ 'ye teşekkürler .


Bunun ryerine işlevi kullanabilmeniz gerekir A(x)f(0), örneğinr(x)m(#
Downgoat

@ Vɪʜᴀɴ Teşekkürler. Ne Array.dupe()işe yarıyor, işe yaramıyor gibi görünüyor mu?
intrepidcoder

Array.dupe muhtemelen kötü bir addı, yinelenenleri bir diziden kaldırır.
Downgoat

@ Vɪʜᴀɴ Girdi / çıktı bağımsız değişkenlerini içeren özellik adları bölümüne her yöntemin bir özetini koymalısınız. Ayrıca, Array.repeat ve String.reverse da iyi olurdu.
intrepidcoder

1
@sysreq Ben çözülmeyi kastetmiştim, karışıklık için üzgünüm.
intrepidcoder

3

Python 2, 117 bayt

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)

Fikir basittir: resmi soldan sağa, soldan sağa doğru, aynalı sağın solunun tersi olacak şekilde sütunlar halinde oluşturun. Sütunlar, Fibonacci nüksünün, i's dizgileri üzerinde _alt sıra için' ile serpiştirilmesiyle tekrarlanmasıyla üretilir .

Resmi alttan başlayarak sütunlarla yazdırmak için, döndürmemiz gerekir, bu da transpozisyon ve ters çevirme anlamına gelir. Ne yazık ki, Python'un eşit olmayan uzunlukta bir dizi sırasını aktarmanın basit bir yolu yoktur. Yerleşik zipkısa satıra kesikler. Bu map(None,_)hile kullanır , ancak daha Nonesonra tüm boşluklara dönüştürmek zorunda.


2

Haskell, 182176 bayt

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]

Arayın c.

( futanmadan /programming/232861/fibonacci-code-golf adresinden çalındı )


Sen değiştirebilirsiniz flip replicate 'i'.(f!!)tarafından \x->[1..f!!x]>>"i".
nimi

Çok teşekkürler! Henüz kendim gelmemiş olmama rağmen, bu ilk kez monadik bir golf ipucu anlıyorum. fHala nasıl çalıştığı hakkında bir ipucu yok ...
Leif Willerts

1

Matlab, 172152 bayt

Ne yazık ki, Matlab Fibonacci fonksiyonunda bir yapıya sahip değildir ve dize Manipülasyon biraz zordur.

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

Satır kesmeleri ile:

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

Yakut, 151 146 142 137 132 bayt

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

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

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

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

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

Ungolfed:

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

Kullanımı:

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

Çıktı:

              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

Python 2, 213

DSM sayesinde 12 bayt tasarruf etti.

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]

Ungolfed sürümü.

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])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.