Вы изучили свою выдумку?

31

Я не люблю цифры, но мне нравится последовательность Фибоначчи. Я уверен, что мы могли бы что-то решить.

Пожалуйста, прочитайте одно целое число n из STDIN и выведите n- е число Фибоначчи в базе 26 ( abcdefghijklmnopqrstuvwxyzвместо 0123456789) в STDOUT.

Первое число Фибоначчи равно 0. Второе равно 1. n- е число Фибоначчи является суммой n -2-го и n -1-го чисел Фибоначчи.

Первые 32 числа 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

Это код гольф, поэтому выигрывает самый короткий код в байтах!

Филип Хаглунд
источник
3
@ l0b0 вы все равно назвали бы это основанием 26, потому что выбор символов для представления цифр совершенно произвольный, а обычные шестнадцатеричные цифры - это просто соглашение.
Мартин Эндер
2
Это все еще base26. Какие символы вы используете, является произвольным, и здесь мы используем az (в алфавитном порядке).
Филипп Хаглунд
Правильно, это нотация base-26 от обычной, но это все же нотация base-26.
Легкость гонки с Моникой
5
Зачем использовать их противные цифры для ввода?
Угорен
Название предложения: Фибона-до н.э.
Мэтью Ро

Ответы:

12

CJam, 18 байт

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

Попробуйте онлайн в интерпретаторе CJam .

Как это работает

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.
Деннис
источник
8

TeaScript , 34 байта 37 51 54

TeaScript - это JavaScript для игры в гольф. Это также приносит функции ES2015 для обычного браузера.

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

Попробуйте онлайн

объяснение

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

* Этот ответ не является конкурирующим

Downgoat
источник
1
Отличная гольф-версия JS! Я разработал свою собственную версию около месяца назад, но еще не начал переводчика. Без встроенного или неявного ввода Фибоначчи эта же программа будет иметь длину 48 байт. Однако , если бы я создал встроенный и добавил неявный ввод, это было бы 34. Возможно, мне следует начать работать с переводчиком. ;)
ETHproductions
Ох, это намного лучше. Один из приемов в моем языке, который может быть применен здесь, состоит в том, чтобы сделать все переменные заглавными (включая Math, Date и т. Д.) И все методы строчными, что устраняет необходимость в точках. Это всего лишь предложение; Возможно, это не лучшая идея для этого языка, но я позволю вам решить. (Люблю имя, кстати.)
ETHproductions
@ETHproductions интересная идея. Я посмотрю, смогу ли я реализовать это в некоторых случаях, но на данный момент я реализую большинство функций с помощью простого метода find-replace, что затрудняет реализацию более сложной семантики.
Downgoat
6

Mathematica, 67 61 байт

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

Рассчитывается f(1000000)примерно за 51 миллисекунду.

LegionMammal978
источник
Ах, не видел, что уже был ответ Mathematica! Шахта используется IntegerStringдля форматирования цифр:IntegerString[Fibonacci@#~IntegerDigits~26+10,36]<>""&
Я удалил это; используя Input[]и Print[]для сравнения справедливого, мое решение было бы 66 байт длиной. Но Alphabet[]это функция 10.1, поэтому я решил оставить ее в качестве комментария.
@ user5254 я впервые использовал FromLetterNumberпрежде , чем видеть , что она внутренне используется Alphabetс Partи используется , что, за исключением списка индексов.
LegionMammal978
5

Simplex v.0.6 , 35 байт

Иногда я вздыхаю и думаю: «Стоит ли даже подавать? Это не победа, так зачем?» В ответ я думаю: «Черт возьми. Это было весело. Кроме того, это действительно прикольное бред, во всяком случае. Не слишком потрепанный».

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
Конор О'Брайен
источник
Да, и, кроме того, Wкоманда интерпретирует основание 26 как строчный алфавит, основание 52 как верхний и строчный алфавит, а основание 64 по существу является btoaфункцией JavaScripts .
Конор О'Брайен
3

Минколанг 0,9 , 40 байт

10n[0c+r]$x'26'r(d0c%1G0c:d$)xrx("a"+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'ndia Starman
источник
Действительно мило! Прекрасно работает для огромных входов!
Филипп Хаглунд,
3

Python 2.7, 82 байта

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
источник
1

Haskell, 114 символов.

Это неожиданно долго. Любая помощь приветствуется. Ранее найдена ошибка для 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бесконечный список Фибоначчи. То toEnumже самое chr, за исключением того, что прежний не нужно импортировать Data.Char.

Akangka
источник
0

Рубин, 67 байт

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
источник
0

Matlab, 133 байта

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))
Луис Мендо
источник
0

Рубин, 125 байт

Не скоро выиграю, но это было весело и мой первый гольф-код: ')

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

Первая строка - это функция для вычисления Фибоначчи, вторая преобразует из встроенной в Ruby кодировки base 26 (0-9, затем ap) в кодировку az, третья получает строку из STDIN и пропускает ее через обе.

gntskn
источник
-1

Python 2, 112 байт

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

Попробуйте онлайн .

Mego
источник
Похоже, это немного не подходит для больших значений; первое переполнение в 71. Вот для fib (1337): diffchecker.com/bwjpg7bb, где правильный ответ заканчивается «победа».
Филип Хаглунд
4
@FilipHaglund Вероятно, глупость с плавающей точкой. Я вернусь к итерационной формуле.
Мего