挑战
编写一个程序,作为Fractran解释器。以字符计数最少的方式实现,无论是哪种语言,都是获胜者。您的程序必须接收两个输入:要执行的fractran程序和输入整数n。程序可以采用任何方便您的程序的形式 - 例如,2元组列表或平面列表。输出必须是单个整数,即执行结束时寄存器的值。
Fractran
Fractran是由John Conway发明的一种微不足道的语言。一个fractran程序由一系列正分数和一个初始状态n组成。解释器维护一个程序计数器,最初指向列表中的第一个分数。Fractran程序按以下方式执行:
- 检查当前状态和程序计数器下的当前分数的乘积是否为整数。如果是,则将当前状态乘以当前分数,并将程序计数器重置为列表开头。
- 推进程序计数器。如果到达列表末尾,则停止,否则返回步骤1。
有关Fractran的工作原理和原因的详细信息,请参见esolang entry和good math/bad math上的this entry。
测试向量
程序:[(3, 2)]
输入:72(2332)
输出:243(35)
程序:[(3, 2)]
输入:1296(2434)
输出:6561(38)
程序:[(455, 33), (11, 13), (1, 11), (3, 7), (11, 2), (1, 3)]
输入:72(2332)
输出:15625(56)
奖励测试向量:
如果您能正确执行最后一个程序,则不需要提交此答案。但是,如果可以,那就太棒了!
程序: [(455, 33), (11, 13), (1, 11), (3, 7), (11, 2), (1, 3)]输入: 60466176 (210310)
输出: 7888609052210118054117285652827862296732064351090230047702789306640625 (5100)
提交与评分
程序将按照字符长度严格排名,最短的为最佳。可以同时提交美观且有文档的代码和“minified”版本的代码,以便人们了解情况。
不接受“J”语言。这是因为在链接页面中已经有一个众所周知的J解决方案。 如果您是J粉丝,很抱歉!
额外奖励,任何能够提供一个自托管的fractran解释器的人将获得500声望点奖励。如果存在多个自托管解释器,则具有最少分数的解释器将获得赏金。
获胜者
官方获胜者是Jesse Beder's solution,他提交了一个由1779个分数构成的自托管fractran解决方案。但实际上,该解决方案的执行速度太慢,甚至无法执行1+1。
令人难以置信的是,这已经被另一个分数解决方案Amadaeus's solution打败了,只用了84个分数!当在我的参考Python解决方案上运行时,它能够在几秒钟内执行前两个测试用例。它使用了一种新颖的分数编码方法,值得仔细研究。
荣誉提名:
- Stephen Canon's solution,使用165个字符的x86汇编语言(28个字节的机器代码)
- Jordan's solution,使用52个字符的ruby - 可处理长整数
- Useless's solution,使用87个字符的Python,虽然不是最短的Python解决方案之一,但是它是少数不是递归的解决方案之一,因此可以轻松处理更难的程序。它也非常易读。