Bonne journée Fibonacci!

20

Contexte

Aujourd'hui (ou hier) est (ou était) le 23/11 ou le jour de Fibonacci! Quelle meilleure façon de célébrer que de faire un gâteau fibonacci?


Exemples

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

Défi

Tu ne fais pas vraiment un gâteau, juste les bougies parce que je ne peux pas faire un gâteau

Pour faire le gâteau, vous devez d'abord obtenir les premiers n nombres de fibonacci triés par ordre croissant. La ihauteur de la bougie ( ) est déterminée par la valeur du nombre actuel de fibonacci. Les bougies sont séparées par un trait de soulignement ( _).

Le gâteau doit être symétrique. Les bougies doivent donc être retournées et concaténées.

Exemple de construction

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 

Numéros de référence de Fibonacci

Pour référence, voici les 15 premiers nombres de fibonacci. Dans ce défi, vous allez commencer 1.

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610
Downgoat
la source
9
Je regrette d'informer la côte ouest des États-Unis que pour la plupart du monde, le 23/11 est terminé ou presque :( Cela vient de passer du code-golf au code le plus rapide
cat
1
@sysreq Ça va, ils ont juste besoin de se rendre sur la côte ouest (instantanément), puis ils peuvent profiter de la journée de Fibonacci pour les 5 dernières heures (7 pour hawaii): p
Downgoat
6
Ce défi va être légendaire dans 43 ans (23/11/58).
Arcturus
9
Dans 43 ans, le format de date mm / jj / aa sera de l'histoire ancienne. Tous les êtres intelligents seront passés à aaaa / mm / jj ... :-P
1
@sysreq La publication de réponses golfées dans des langues verbeuses est très encouragée. Bien sûr, vous n'êtes pas en concurrence avec Pyth, mais vous pouvez rivaliser avec d'autres réponses dans la même langue ou dans des langues de verbosité comparable.
Martin Ender

Réponses:

2

Pyth, 31 octets

jaPJ_.ts_BuaaGks>4GtQ]\idXeJ" _

Essayez-le en ligne: Démonstration

Explication:

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
la source
6

J, 58 octets

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

Utilisations (%-.-*:)t.pour la génération de Fibonacci. L'explication pourrait venir un peu plus tard.

Usage:

   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

Essayez-le en ligne ici.

randomra
la source
5

CJam, 41 39 octets

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

Cela imprime une bonne quantité d'espace blanc de premier plan. Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

"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
la source
3

TeaScript, 93 84 76 + 1 = 77 octets

+1 octet pour "Les entrées sont des nombres?" case à cocher

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§

Version non golfée:

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

Merci à @ Vɪʜᴀɴ pour les conseils.

intrépide
la source
Vous devriez pouvoir utiliser la rfonction au lieu de A(x)f(0), par exempler(x)m(#
Downgoat
@ Vɪʜᴀɴ Merci. Que fait Array.dupe()-il, cela ne semble pas fonctionner?
intrepidcoder
Array.dupe était probablement un mauvais nom, il supprime les doublons d'un tableau.
Downgoat
@ Vɪʜᴀɴ Vous devez mettre un résumé de chaque méthode dans la section des noms de propriété avec les arguments d'entrée / sortie. En outre, Array.repeat et String.reverse seraient également intéressants.
intrepidcoder
1
@sysreq Je voulais dire non golfé, désolé pour la confusion.
intrepidcoder
3

Python 2, 117 octets

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)

L'idée est simple: générer l'image dans des colonnes allant de bas en haut, de gauche à droite, avec la moitié droite inversée de la gauche. Les colonnes sont générées en itérant la récurrence de Fibonacci, sur des chaînes de i', entrecoupées de _' pour la ligne du bas.

Pour imprimer l'image avec des colonnes en partant du bas, nous devons la faire pivoter, ce qui signifie transposer et inverser. Malheureusement, Python n'a pas de moyen simple de transposer un tableau de lignes de longueur inégale. Le intégré ziptronque à la ligne la plus courte. Cela utilise l' map(None,_)astuce, mais doit ensuite convertir tous les Noneespaces.

xnor
la source
2

Haskell, 182 176 octets

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]

Appelle c.

( fVolé sans vergogne sur /programming/232861/fibonacci-code-golf )

Leif Willerts
la source
Vous pouvez remplacer flip replicate 'i'.(f!!)par \x->[1..f!!x]>>"i".
nimi
Grand merci! C'est la première fois que je comprends un truc de golf monadique, même si je n'en ai pas encore trouvé moi-même. Aucune idée de comment ça fmarche encore ...
Leif Willerts
1

Matlab, 172 152 octets

Malheureusement, Matlab n'a pas de fonction Fibonacci intégrée et la manipulation des chaînes est un peu compliquée.

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

Avec des sauts de ligne:

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
la source
1

Rubis, 151 146 142 137 137 132 octets

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

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

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

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

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

Non golfé:

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

Usage:

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

Production:

              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
la source
1

Python 2, 213

Enregistré 12 octets grâce à 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]

Version non golfée.

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
la source