Czy nauczyłeś się swojego Fib-Abc?

31

Nie lubię liczb, ale lubię sekwencję Fibonacciego. Jestem pewien, że moglibyśmy coś wymyślić.

Przeczytaj jedną liczbę całkowitą n ze STDIN i wyślij n- tą liczbę Fibonacciego z bazy 26 ( abcdefghijklmnopqrstuvwxyzzamiast 0123456789) do STDOUT.

Pierwsza liczba Fibonacciego wynosi 0. Druga to 1. Liczba n- ta Fibonacciego jest sumą liczb n- 2 i n-1 liczb Fibonacciego.

Pierwsze 32 numery 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

To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!

Filip Haglund
źródło
3
@ l0b0 nadal nazwałbyś go base 26, ponieważ wybór znaków do reprezentowania cyfr jest całkowicie dowolny, a wspólne cyfry szesnastkowe są tylko konwencją.
Martin Ender
2
To wciąż baza26. Używane przez Ciebie znaki są dowolne, a tutaj używamy az (w kolejności alfabetycznej).
Filip Haglund
Zgadza się, to inna notacja base-26 od konwencjonalnej, ale nadal jest to notacja base-26.
Lekkość ściga się z Monicą
5
Po co używać tych nieprzyjemnych liczb do wprowadzania?
ugoren,
Sugestia nazwy: Fibona-bc
Matthew Roh

Odpowiedzi:

12

CJam, 18 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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
źródło
8

TeaScript , 34 bajty 37 51 54

TeaScript to JavaScript do gry w golfa. Przynosi także funkcje ES2015 do przeciętnej przeglądarki.

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

Wypróbuj online

Wyjaśnienie

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

* Ta odpowiedź nie jest konkurencyjna

Downgoat
źródło
1
Ładna wersja JS w golfa! Zaprojektowałem własną wersję około miesiąc temu, ale jeszcze nie zacząłem tłumaczyć. Bez wbudowanego lub niejawnego wejścia Fibonacciego ten sam program miałby długość 48 bajtów. Jednak , gdybym miał stworzyć wbudowany i dodać wejście niejawny, że to będzie 34. Może powinienem zacząć pracę na tłumacza. ;)
ETHprodukcje
Ooh, to o wiele lepsze. Jedną z sztuczek w moim języku, która może się tutaj zastosować, jest robienie wszystkich zmiennych wielkimi literami (w tym matematyki, daty itp.) I wszystkich metod małymi literami, co eliminuje potrzebę kropek. To tylko sugestia; to może nie być najlepszy pomysł na ten język, ale pozwolę ci zdecydować. (Uwielbiam tę nazwę, BTW.)
ETHprodukcje
@ETHproductions ciekawy pomysł. Zobaczę, czy uda mi się to zaimplementować w niektórych przypadkach, ale na razie implementuję większość funkcji za pomocą prostej metody znajdź-zamień, co utrudnia wdrożenie bardziej złożonej semantyki.
Downgoat,
6

Mathematica, 67 61 bajtów

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

Oblicza się f(1000000)w około 51 milisekundach.

LegionMammal978
źródło
Ach, nie widziałem, że była już odpowiedź Mathematica! Mój używany IntegerStringdo formatowania cyfr:IntegerString[Fibonacci@#~IntegerDigits~26+10,36]<>""&
Usunąłem to; używając Input[]i Print[]dla uczciwego porównania moje rozwiązanie miałoby 66 bajtów długości. Ale Alphabet[]jest to funkcja 10.1, więc pomyślałem, że zostawię to jako komentarz.
@ user5254 raz pierwszy użyty FromLetterNumberprzed widząc, że wewnętrznie stosowane Alphabetz Parti używane, które, z wyjątkiem listy indeksów.
LegionMammal978
5

Simplex v.0.6 , 35 bajtów

Czasami wzdycham i myślę: „Czy to w ogóle warto poddać się? Nie wygrywa, więc po co zawracać sobie głowę?” W odpowiedzi myślę: „Do licha. Było fajnie. Poza tym, to i tak naprawdę wymyślone gówno ***. Niezbyt odrapane”.

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
źródło
Aha, na marginesie, Wpolecenie interpretuje bazę 26 jako małe litery, bazę 52 jako duże i małe litery, a baza 64 jest zasadniczo btoafunkcją JavaScript .
Conor O'Brien
4

Pyth, 17 bajtów

s@LGjhu,eGsGQU2lG

Wypróbuj online.

orlp
źródło
Wspaniale, mogę sprawdzić, czy to działa
Hack-R
3

Minkolang 0,9 , 40 bajtów

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

Wypróbuj tutaj.

Wyjaśnienie

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
źródło
Bardzo miłe! Działa świetnie przy dużych nakładach!
Filip Haglund
3

Python 2.7, 82 bajty

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
źródło
1

Haskell, 114 znaków.

Jest nieoczekiwanie długi. Każda pomoc mile widziana. Wcześniej znaleziono błąd dla 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

fto nieskończona lista Fibonacciego. toEnumjest to samo z tym chr, że poprzedni nie musi importować Data.Char.

Akangka
źródło
0

Rubinowy, 67 bajtów

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
źródło
0

Matlab, 133 bajty

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
źródło
0

Rubin, 125 bajtów

Niedługo nie wygram, ale było fajnie i mój pierwszy kod golfowy:)

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

Pierwsza linia jest funkcją do obliczania Fibonacciego, druga konwertuje z wbudowanego kodowania podstawowego Ruby 26 (0-9, a następnie ap) na kodowanie az, trzecia pobiera linię ze STDIN i przepuszcza ją przez oba.

gntskn
źródło
-1

Python 2, 112 bajtów

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

Wypróbuj online .

Mego
źródło
Wydaje się to nieco wyłączone w przypadku dużych wartości; pierwszy przelew w 71. Oto Fib (1337): diffchecker.com/bwjpg7bb, gdzie poprawna odpowiedź kończy się na „win”.
Filip Haglund
4
@FilipHaglund Prawdopodobnie nonsens zmiennoprzecinkowy. Powrócę do iteracyjnej formuły.
Mego