Apakah Anda sudah belajar fib-abc?

31

Saya tidak suka angka, tapi saya suka urutan Fibonacci. Saya yakin kita bisa menyelesaikan sesuatu.

Harap baca satu bilangan bulat n dari STDIN dan tampilkan angka Fibonacci ke- n di basis 26 ( abcdefghijklmnopqrstuvwxyzbukan 0123456789) ke STDOUT.

Nomor Fibonacci pertama adalah 0. Yang kedua adalah 1. Nomor fibonacci n adalah jumlah dari nomor Fibonacci n -2 dan n -1st.

32 nomor fib-abc pertama:

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

Ini kode golf, jadi kode terpendek dalam byte menang!

Filip Haglund
sumber
3
@ l0b0 Anda masih menyebutnya basis 26 karena pilihan karakter untuk mewakili digit sepenuhnya arbitrer dan digit heksadesimal yang umum hanyalah sebuah konvensi.
Martin Ender
2
Itu masih base26. Karakter apa yang Anda gunakan sewenang-wenang, dan di sini kami menggunakan az (dalam urutan abjad).
Filip Haglund
Benar, ini notasi base-26 yang berbeda dari notasi konvensional, tetapi ini masih notasi base-26.
Lightness Races dengan Monica
5
Mengapa menggunakannya angka-angka jahat untuk input?
ugoren
Saran nama: Fibona-bc
Matthew Roh

Jawaban:

12

CJam, 18 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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
sumber
8

TeaScript , 34 byte 37 51 54

TeaScript adalah JavaScript untuk bermain golf. Ini juga membawa fitur ES2015 ke browser rata-rata.

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

Cobalah online

Penjelasan

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

* Jawaban ini tidak bersaing

Downgoat
sumber
1
Versi JS golf-y yang bagus! Saya merancang versi saya sendiri sekitar sebulan yang lalu, tetapi belum memulai juru bahasa. Tanpa input Fibonacci built-in atau implisit, program yang sama ini akan sepanjang 48 byte. Namun , jika saya membuat built-in dan menambahkan input implisit, itu akan menjadi 34. Mungkin saya harus mulai bekerja pada penerjemah. ;)
ETHproduksi
Ooh, itu jauh lebih baik. Salah satu trik dalam bahasa saya yang mungkin berlaku di sini adalah membuat semua variabel huruf besar (termasuk Matematika, Tanggal, dll.) Dan semua metode huruf kecil, yang menghilangkan kebutuhan akan titik. Ini hanya saran; ini mungkin bukan ide terbaik untuk bahasa ini, tetapi saya akan membiarkan Anda memutuskan. (Love the name, BTW.)
ETHproduk
@ ETHproduk ide menarik. Saya akan melihat apakah saya dapat mengimplementasikannya untuk beberapa kasus, tetapi sampai sekarang, saya mengimplementasikan sebagian besar fitur melalui metode pencarian-ganti yang sederhana, membuatnya sulit untuk mengimplementasikan semantik yang lebih kompleks.
Downgoat
6

Mathematica, 67 61 byte

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

Menghitung f(1000000)sekitar 51 milidetik.

LegionMammal978
sumber
Ah, tidak melihat bahwa sudah ada jawaban Mathematica! IntegerStringIntegerString[Fibonacci@#~IntegerDigits~26+10,36]<>""&
Saya menghapusnya; menggunakan Input[]dan Print[]untuk perbandingan yang adil, solusi saya akan menjadi 66 byte. Tetapi Alphabet[]fitur 10.1, jadi saya pikir saya akan meninggalkannya sebagai komentar.
@ user5254 Saya pertama kali menggunakan FromLetterNumbersebelum melihat bahwa itu digunakan secara internal Alphabetdengan Partdan menggunakannya, kecuali dengan daftar indeks.
LegionMammal978
5

Simplex v.0.6 , 35 byte

Kadang-kadang saya menghela nafas dan berpikir, "Apakah ini layak untuk disampaikan? Itu tidak menang, jadi mengapa repot-repot?" Sebagai tanggapan, saya pikir, "Heck. Itu menyenangkan. Selain itu, ini benar-benar naksir sialan. Bagaimanapun juga, tidak terlalu buruk."

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
sumber
Oh, dan, sebagai tambahan, Wperintah menafsirkan basis 26 sebagai alfabet huruf kecil, basis 52 sebagai alfabet huruf besar dan kecil, dan pangkalan 64 pada dasarnya adalah btoafungsi JavaScripts .
Conor O'Brien
4

Pyth, 17 byte

s@LGjhu,eGsGQU2lG

Cobalah online.

orlp
sumber
Luar biasa, saya dapat memverifikasi bahwa ini berfungsi
Hack-R
3

Minkolang 0,9 , 40 byte

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

Coba di sini.

Penjelasan

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
sumber
Benar-benar bagus! Bekerja sangat baik untuk input besar!
Filip Haglund
3

Python 2.7, 82 byte

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
sumber
1

Haskell, 114 karakter.

Itu tak terduga panjang. Selamat datang bantuan. Sebelumnya ditemukan bug untuk 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

fadalah daftar tak terhingga dari fibonacci. toEnumsama dengan chr, kecuali yang sebelumnya tidak perlu mengimpor Data.Char.

Akangka
sumber
0

Ruby, 67 byte

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
sumber
0

Matlab, 133 byte

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
sumber
0

Ruby, 125 byte

Tidak akan menang dalam waktu dekat, tapi itu menyenangkan & golf kode pertama saya: ')

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

Baris pertama adalah fungsi untuk menghitung fibonacci, konversi kedua dari pengkodean basis 26 bawaan built-in Ruby (0-9 lalu ap) ke dalam pengkodean az, ketiga mendapat garis dari STDIN dan menjalankan keduanya.

gntskn
sumber
-1

Python 2, 112 byte

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

Cobalah online .

Mego
sumber
Ini tampaknya sedikit tidak cocok untuk nilai besar; overflow pertama di 71. Di sini untuk fib (1337): diffchecker.com/bwjpg7bb di mana jawaban yang benar berakhir dengan "menang".
Filip Haglund
4
@FilipHaglund Mungkin omong kosong floating point. Saya akan kembali ke rumus berulang.
Mego