З Днем Фібоначчі!


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 закінчилося або майже закінчилося :( Це щойно перетворилося з коду-гольфу на найшвидший-код
кіт

1
@sysreq Це нормально, їм просто потрібно подорожувати до західного узбережжя (миттєво), і тоді вони можуть насолоджуватися днем ​​Фібоначчі протягом останніх 5 годин (7 на Гаваях): p
Пуховик

6
Цей виклик стане легендарним через 43 роки (23.11.58).
Арктур

9
Через 43 роки формат дати mm / dd / yy стане історією. Усі розумні істоти перейдуть на yyyy / mm / dd ... :-P

1
@sysreq Дуже рекомендується розміщувати відповіді з гольфу на багатослівних мовах. Звичайно, ти не конкуруєш з Pyth, але ти можеш конкурувати з іншими відповідями на тій же мові або мовами порівнянної багатослівності.
Мартін Ендер

Відповіді:


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

TeaScript, 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ɪʜᴀɴ за поради.


Ви повинні мати можливість використовувати цю rфункцію замість A(x)f(0), наприклад,r(x)m(#
Downgoat

@ Vɪʜᴀɴ Дякую Що Array.dupe()робити, здається, це не працює?
intrepidcoder

Array.dupe, ймовірно, був невірним іменем, він видаляє дублікати з масиву.
Пуховик

@ Vɪʜᴀɴ Ви повинні розмістити підсумок кожного методу в розділі імен властивостей із введеннями / вихідними аргументами. Також Array.repeat і String.reverse теж непогано.
intrepidcoder

1
@sysreq Я мав на увазі невольф, вибачте за плутанину.
intrepidcoder

3

Python 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 's, перемежованих з _' s для нижнього рядка.

Щоб роздрукувати малюнок стовпцями, починаючи знизу, нам потрібно обертати його, що означає перенесення та перевернення. На жаль, Python не має простого способу перемістити масив рядків нерівної довжини. Вбудовані zipобрізки до найкоротшого ряду. При цьому використовується map(None,_)хитрість, але після цього потрібно перетворити всі Noneпробіли.


2

Haskell, 182 176 байт

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 .

( fбезсоромно вкрадено з /programming/232861/fibach-code-golf )


Ви можете замінити flip replicate 'i'.(f!!)на \x->[1..f!!x]>>"i".
німі

Щиро дякую! Це перший раз, коли я насправді розумію монадійний гольф-підказку, хоча я ще не придумав цього. Немає жодного поняття, як fвсе ще працює ...
Лейф Віллерс

1

Матлаб, 172 152 байти

На жаль, Матлаб не має вбудованої функції Фібоначчі, а маніпуляція з рядком - трохи невміло.

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

Збережено 12 байт завдяки 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]

Безгольова версія.

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])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.