¿Has aprendido tu fib-abc?

31

No me gustan los números, pero me gusta la secuencia de Fibonacci. Estoy seguro de que podríamos resolver algo.

Por favor, lea un entero n de STDIN y la salida de la n ésimo número de Fibonacci en base 26 ( abcdefghijklmnopqrstuvwxyzen lugar de 0123456789) la salida estándar.

El primer número Fibonacci es 0. La segunda es 1. El n ésimo número de Fibonacci es la suma de la n -2ª y n -1ª números de Fibonacci.

Primeros 32 números fib-abc:

fib(0) = a
fib(1) = b
fib(2) = b
fib(3) = c
fib(4) = d
fib(5) = f
fib(6) = i
fib(7) = n
fib(8) = v
fib(9) = bi
fib(10) = cd
fib(11) = dl
fib(12) = fo
fib(13) = iz
fib(14) = on
fib(15) = xm
fib(16) = blz
fib(17) = cjl
fib(18) = dvk
fib(19) = gev
fib(20) = kaf
fib(21) = qfa
fib(22) = baff
fib(23) = bqkf
fib(24) = cqpk
fib(25) = egzp
fib(26) = gxoz
fib(27) = leoo
fib(28) = scdn
fib(29) = bdgsb
fib(30) = bvivo
fib(31) = cypnp

Este es el código de golf, por lo que gana el código más corto en bytes.

Filip Haglund
fuente
3
@ l0b0 todavía lo llamaría base 26 porque la elección de los caracteres para representar los dígitos es completamente arbitraria y los dígitos hexadecimales comunes son solo una convención.
Martin Ender
2
Todavía es base26. Los caracteres que usa son arbitrarios, y aquí usamos az (en orden alfabético).
Filip Haglund
Correcto, es una notación de base 26 diferente de la convencional, pero sigue siendo una notación de base 26.
Lightness compite con Monica el
55
¿Por qué usarlos números desagradables para la entrada?
Ugoren
Sugerencia de nombre: Fibona-bc
Matthew Roh

Respuestas:

12

CJam, 18 bytes

UXri{_@+}*;26b'af+

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

UX    e# Push 0 and 1.
ri{   e# Read an integer and execute the loop that many times.
  _   e#   Push a copy the topmost integer.
  @   e#   Rotate the bottom-most integer on top of the stack.
  +   e#   Pop the two topmost integers and push their sum.
}*    e#
;     e# Discard the topmost integer from the stack.
26b   e# Convert the remaining integer to base 26.
'af+  e# Add the character 'a' to each base-26 digit.
Dennis
fuente
8

TeaScript , 34 bytes 37 51 54

TeaScript es JavaScript para jugar al golf. También trae características de ES2015 al navegador promedio.

F(x)b(26)l(#C(lc()+(l<'a'?49:10)))

Pruébalo en línea

Explicación

          // x is the input
F(x)      // Fibonacci from input
.b(26)    // To Base-26 string but with 0-9, a-p
          // instead of a-z, to fix this...
.l(#      // Loops through each char
   C(          // Charcode from...
       l.c()+  // Charcode from char
       (l<'a'? // If number
           49  // Add 49 to char code
          :10  // Else add 10
       )
   )
)

* Esta respuesta no es competitiva

Downgoat
fuente
1
¡Bonita versión de golf de JS! Diseñé mi propia versión hace aproximadamente un mes, pero aún no he comenzado un intérprete. Sin una entrada implícita o incorporada de Fibonacci, este mismo programa tendría 48 bytes de longitud. Sin embargo , si tuviera que crear una entrada incorporada y agregarla implícita, sería 34. Quizás debería comenzar a trabajar en un intérprete. ;)
ETHproductions
Ooh, eso está mucho mejor. Uno de los trucos en mi idioma que se puede aplicar aquí es poner todas las variables en mayúsculas (incluidas Matemáticas, Fecha, etc.) y todos los métodos en minúsculas, lo que elimina la necesidad de puntos. Es sólo una sugerencia; Puede que no sea la mejor idea para este idioma, pero te dejaré decidir. (Me encanta el nombre, por cierto)
ETHproductions
Idea interesante de @ETHproductions. Veré si puedo implementarlo en algunos casos, pero a partir de ahora, estoy implementando la mayoría de las características a través de un método simple de búsqueda y reemplazo, lo que dificulta la implementación de la semántica más compleja.
Downgoat
6

Mathematica, 67 61 bytes

Print[""<>Alphabet[][[Fibonacci@Input[]~IntegerDigits~26+1]]]

Calcula f(1000000)en aproximadamente 51 milisegundos.

LegionMammal978
fuente
¡Ah, no vi que ya había una respuesta de Mathematica! El mío solía IntegerStringformatear los dígitos:IntegerString[Fibonacci@#~IntegerDigits~26+10,36]<>""&
Lo borré; usando Input[]y Print[]para una comparación justa, mi solución tendría 66 bytes de longitud. Pero Alphabet[]es una característica de 10.1, así que pensé en dejarla como comentario.
@ user5254 que utilizó por primera vez FromLetterNumberantes de ver que internamente usa Alphabetcon Party usada que, a excepción de una lista de índices.
LegionMammal978
5

Simplex v.0.6 , 35 bytes

A veces suspiro y pienso: "¿Vale la pena enviarlo? No gana, así que ¿por qué molestarse?" En respuesta, pienso: "Diablos. Fue divertido. Además, esto es realmente una fantasía imaginaria de todos modos. No está nada mal".

5_*Ij1~SRpRi@T[Uj&ERp]pSR5_Vj26@pWo
5_                                  ~~ sqrt(5)
  *                                 ~~ copy to next byte, move right
   I                                ~~ increment [sqrt(5),sqrt(5)+1]
    j1                              ~~ insert a new cell and set it to one 
                                    ~~ [sqrt(5),1,sqrt(5)+1]
      ~                             ~~ switch the previous with the current byte
                                    ~~ [1,sqrt(5),sqrt(5)+1]
       S                            ~~ perform subtraction [1-sqrt(5),0,sqrt(5)+1]
        Rp                          ~~ remove next cell [1-sqrt(5),sqrt(5)+1]
          Ri@                       ~~ take numeric input (n) into register
             T[      ]              ~~ applies the following to every cell
               U                    ~~ halves the current cell
                j&                  ~~ dumps and restores the value to the register
                  ERp               ~~ raises cell to the nth power, remove cell made
                      p             ~~ remove last cell
                       S            ~~ subtract the two values
                        R5_         ~~ goes right and sets sqrt(5)
                           V        ~~ divides the prev. two cells
                            j       ~~ inserts new cell
                             26@    ~~ puts 26 into the register
                                p   ~~ removes cell
                                 Wo ~~ converts the current to base 26 and outputs as number
Conor O'Brien
fuente
Ah, y, aparte, el Wcomando interpreta la base 26 como el alfabeto en minúsculas, la base 52 como el alfabeto en mayúsculas y minúsculas, y la base 64 es esencialmente la btoafunción JavaScripts .
Conor O'Brien
4

Pyth, 17 bytes

s@LGjhu,eGsGQU2lG

Pruébalo en línea.

orlp
fuente
Impresionante, puedo verificar que esto funcione
Hack-R
3

Minkolang 0.9 , 40 bytes

10n[0c+r]$x'26'r(d0c%1G0c:d$)xrx("a"+O).

Pruébalo aquí.

Explicación

10n[0c+r]                                   Calculates f(n) where n is taken from input
         $x'26'r                            Dumps the addend I don't need and pushes a 26
                (d0c%1G0c:d$)               Base-encodes f(n) in base 26
                             xrx            Dumps the 0, reverses, dumps the 26
                                ("a"+O).    Outputs the letters
El'endia Starman
fuente
¡Muy agradable! ¡Funciona muy bien para grandes entradas!
Filip Haglund
3

Python 2.7, 82 bytes

a=0
b=1
s=''
exec"a,b=b,a+b;"*input()
while a:s=chr(a%26+97)+s;a/=26
print s or'a'
xsot
fuente
1

Haskell, 114 caracteres.

Es inesperadamente largo. Cualquier ayuda bienvenida. Anteriormente encontré un error para fib (0)

f=scanl(+)0$1:f
k 0=[]
k x=k(x`div`26)++[toEnum$97+x`mod`26]
l 0=0
l x=k x
main=interact$l.(f!!).read.head.lines

fes una lista infinita de fibonacci. toEnumes igual que chr, excepto que el primero no necesita importar Data.Char

Akangka
fuente
0

Ruby, 67 bytes

a,b=0,1
gets.to_i.times{a,b=b,a+b}
puts a.to_s(26).tr"0-9a-p","a-z"
daniero
fuente
0

Matlab, 133 bytes

n=input('');if n<2,y=n;else
f=0;g=1;for k=2:n
h=f+g;f=g;g=h;end
y=fix(mod(g./26.^(fix(log(g)/log(26)):-1:0),26));end
disp(char(y+97))
Luis Mendo
fuente
0

Ruby, 125 bytes

No voy a ganar en el corto plazo, pero fue divertido y mi primer código de golf: ')

def f(n);n<3?(n>0?1:0):f(n-1)+f(n-2);end
def a(s);s.bytes.map{|n|n<58?n+49:n+10}.pack("C*");end
puts a(f(gets.to_i).to_s(26))

La primera línea es una función para calcular fibonacci, la segunda se convierte de la codificación de base 26 incorporada de Ruby (0-9 luego ap) a la codificación az, la tercera obtiene una línea de STDIN y la ejecuta a través de ambas.

gntskn
fuente
-1

Python 2, 112 bytes

n=input()
if n<1:print'a';exit()
a,f=0,1
while n>1:a,f,n=f,a+f,n-1
r=''
while f:r,f=chr(f%26+97)+r,f//26
print r

Pruébalo en línea .

Mego
fuente
Esto parece estar ligeramente apagado para valores grandes; primer desbordamiento en 71. Aquí está para fib (1337): diffchecker.com/bwjpg7bb donde la respuesta correcta termina con "win".
Filip Haglund
44
@FilipHaglund Probablemente sin sentido de punto flotante. Volveré a la fórmula iterativa.
Mego