Você aprendeu seu fib-abc?

31

Não gosto de números, mas gosto da sequência de Fibonacci. Tenho certeza de que poderíamos resolver algo.

Por favor, leia um número inteiro n de STDIN e envie o n- ésimo número de Fibonacci na base 26 (em abcdefghijklmnopqrstuvwxyzvez de 0123456789) para STDOUT.

O primeiro número de Fibonacci é 0. O segundo é um 1. O n th número de Fibonacci é a soma de a n -2º e n -1st números de Fibonacci.

Primeiros 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 é o código golf, pelo que o código mais curto em bytes vence!

Filip Haglund
fonte
3
@ l0b0 você ainda chamaria de base 26 porque a escolha dos caracteres para representar os dígitos é totalmente arbitrária e os dígitos hexadecimais comuns são apenas uma convenção.
Martin Ender
2
Ainda é base26. Quais caracteres você usa são arbitrários, e aqui usamos az (em ordem alfabética).
Filip Haglund
Certo, é uma notação de base 26 diferente da convencional, mas ainda é uma notação de base 26.
Lightness Races com Monica
5
Por que usá-los números desagradáveis ​​para a entrada?
Ugoren
Sugestão de nome: Fibona-bc
Matthew Roh

Respostas:

12

CJam, 18 bytes

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

Experimente online no intérprete CJam .

Como 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
fonte
8

TeaScript , 34 bytes 37 51 54

TeaScript é JavaScript para jogar golfe. Ele também traz os recursos do ES2015 para o navegador médio.

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

Experimente online

Explicação

          // 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 resposta não é concorrente

Downgoat
fonte
1
Versão golf-y agradável de JS! Eu projetei minha própria versão há cerca de um mês, mas ainda não iniciei um intérprete. Sem uma entrada implícita ou embutida de Fibonacci, esse mesmo programa teria 48 bytes de comprimento. No entanto , se eu fosse criar uma entrada interna e adicionar entradas implícitas, seria 34. Talvez eu devesse começar a trabalhar em um intérprete. ;)
ETHproductions
Ooh, isso é muito melhor. Um dos truques no meu idioma que podem ser aplicados aqui é deixar todas as variáveis ​​em maiúsculas (incluindo matemática, data etc.) e todos os métodos em minúsculas, o que elimina a necessidade de períodos. Isto é apenas uma sugestão; pode não ser a melhor ideia para esse idioma, mas deixarei você decidir. (Ame o nome, aliás.)
ETHproductions
@ETHproductions ideia interessante. Vou ver se posso implementá-lo em alguns casos, mas, a partir de agora, estou implementando a maioria dos recursos por meio de um método simples de substituição e substituição, dificultando a implementação da semântica mais complexa.
Downgoat 25/10/2015
6

Mathematica, 67 61 bytes

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

Calcula f(1000000)em cerca de 51 milissegundos.

LegionMammal978
fonte
Ah, não vi que já havia uma resposta do Mathematica! O meu costumava IntegerStringformatar os dígitos:IntegerString[Fibonacci@#~IntegerDigits~26+10,36]<>""&
Eu deletei; usando Input[]e Print[]para uma comparação justa, minha solução teria 66 bytes de comprimento. Mas Alphabet[]é um recurso 10.1, então pensei em deixá-lo como um comentário.
@ user5254 I usado pela primeira vez FromLetterNumberantes de ver que ele usado internamente Alphabetcom Parte usado que, exceto com uma lista de índices.
LegionMammal978
5

Simplex v.0.6 , 35 bytes

Às vezes, suspiro e penso: "Vale a pena enviar? Isso não ganha, então por que se preocupar?" Em resposta, eu penso: "Caramba. Foi divertido. Além disso, isso é realmente uma merda de fantasia, de qualquer maneira. Não é tão ruim."

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
fonte
Ah, e, como um aparte, o Wcomando interpreta a base 26 como o alfabeto em minúsculas, a base 52 como o alfabeto em maiúsculas e minúsculas e a base 64 é essencialmente a btoafunção JavaScripts .
Conor O'Brien
4

Pitão, 17 bytes

s@LGjhu,eGsGQU2lG

Experimente online.

orlp
fonte
Impressionante, eu posso verificar que isso funciona
Hack-R
3

Tamanho 0.9 , 40 bytes

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

Experimente aqui.

Explicação

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
fonte
Muito bom! Funciona muito bem 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
fonte
1

Haskell, 114 caracteres.

É inesperadamente longo. Qualquer ajuda bem-vinda. Anteriormente encontrado um bug 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

fé uma lista infinita de fibonacci. toEnumé o mesmo chr, exceto que o ex não precisa importar o Data.Char.

Akangka
fonte
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
fonte
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
fonte
0

Ruby, 125 bytes

Não vou ganhar tão cedo, mas foi divertido e meu primeiro código de golfe: ')

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

A primeira linha é uma função para calcular fibonacci, a segunda se converte da codificação base 26 integrada do Ruby (0-9 e ap) em codificação az, a terceira obtém uma linha de STDIN e a executa em ambas.

gntskn
fonte
-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

Experimente online .

Mego
fonte
Isso parece estar um pouco desligado para valores grandes; primeiro estouro em 71. Aqui está o fib (1337): diffchecker.com/bwjpg7bb, onde a resposta correta termina com "win".
Filip Haglund
4
@FilipHaglund Provavelmente sem sentido de ponto flutuante. Voltarei à fórmula iterativa.
Mego