您学会了fib-abc吗?


31

我不喜欢数字,但是我喜欢斐波那契数列。我相信我们可以解决一些问题。

请从STDIN 读取一个整数n,然后将以n为底的26的第n个斐波那契数(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(按字母顺序)。
Filip Haglund

正确,这是与常规符号不同的base 26表示法,但仍然是base 26表示法。
莫妮卡(Monica)

5
为什么要使用讨厌的数字作为输入?
ugoren 2015年

名称建议:Fibona-bc
马修·

Answers:


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

*此答案无竞争力


1
不错的JS高尔夫版!我大约一个月前设计了自己的版本,但是还没有开始翻译。如果没有Fibonacci内置或隐式输入,则该程序的长度为48个字节。但是,如果我要创建一个内置函数并添加隐式输入,则为34。也许我应该开始研究解释器。;)
ETHproductions 2015年

哦,好多了。在我的语言中,可能适用于此的技巧之一是使所有变量(包括Math,Date等)变为大写,而所有方法变为小写,从而消除了句点的需要。这只是一个建议;对于这种语言,这可能不是最好的主意,但我会让您决定。(喜欢这个名字,顺便说一句。)
ETHproductions 2015年

@ETHproductions有趣的主意。我将看看是否可以在某些情况下实现它,但是到目前为止,我正在通过简单的查找替换方法实现大多数功能,这使得实现更复杂的语义变得困难。
Downgoat,2015年

6

Mathematica,67 61字节

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

f(1000000)在大约51毫秒内计算。


啊,还没有看到Mathematica的答案!我的用来IntegerString格式化数字的格式:IntegerString[Fibonacci@#~IntegerDigits~26+10,36]<>""&

我已经把它删了; 使用Input[]Print[]进行公平比较,我的解决方案将是66个字节长。但这Alphabet[]是10.1的功能,因此我想将其保留为评论。

@ user5254我第一次使用FromLetterNumber看到它内部使用前AlphabetPart和使用的,除非指数列表。
LegionMammal978

5

单纯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本质上是JavaScript btoa函数。
Conor O'Brien


3

Minkolang 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

非常好!非常适合大量输入!
Filip Haglund

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'

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。


0

Ruby,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"

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

Ruby,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)转换为z编码,第三行从STDIN获得一行,并通过两者运行。


-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

在线尝试


对于较大的值,这似乎略有偏离;第一次溢出是在71。这是针对fib(1337)的:diffchecker.com/bwjpg7bb,正确答案以“ win”结尾。
Filip Haglund

4
@FilipHaglund可能是浮点废话。我将回到迭代公式。
Mego
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.