|
|
1
45
(编辑:固定)
看来我不会发布这么长的东西,所以我发布了Fractran源代码 here 输入指定如下:
首先,我们编码一个分数
这样,我们将任何分数编码为正整数。现在,给定一个progoram(编码分数F0,F1,…)序列,我们通过
最后,通过以下方式向口译员提供输入:
哪里
它是如何工作的?
我写了一种元语言,可以编译成Fractran。它允许函数(简单Fractran和其他函数序列)和
here [tar.gz]。在一个惊人的DOOFUTIN显示(和炫耀),我用我的C++ YAML解析器 yaml-cpp ,所以你必须下载并链接到它。对于yaml cpp和“编译器”,您需要 CMake 用于跨平台生成makefile。 此程序的用途是:
它从标准输入中读取函数名,并将相应的“伪分数”(我稍后会解释)写入标准输出。因此,要编译解释器(解释函数),可以运行
将其转换为Fractran非常容易,但如果您很懒,可以使用 to-fractions.py . [ 注
关于输入的注释
:如果要以这种方式测试不同的函数,约定始终相同。它在pseudo Fractran中有许多参数(通常函数上方的注释解释了这一点),所以给它想要的,再加上一个
然而,
因此,你可以比较两个解释器,运行C++版本(它也采用伪FractRAN中的输入/输出),检查它是否有效,然后说服自己,元语言也能工作。 或如果你感到受到鼓舞 真正地 但是,我真的不知道如何做到这一点,我对所做的很满意,所以我将把它留给读者作为练习。 |
|
|
2
41
这完全是手写的。我确实编写了一种伪语言来更清楚地表达事物,但我没有编写编译器,而是选择直接编写优化的Fractran代码。
FTEVAL接受输入
解释后的程序嵌入为一个以10为基数的数字列表,位于一个以11为基数的数字内,使用数字“a”标记边界,但最末端除外。加法程序[3/2]编码为
乘法程序[455/33,11/13,1/11,3/7,11/2,1/3]编码为
这确实是一个很大的数字。 第一个测试向量在中完成 不到一秒钟 the complete output . 不幸的是,当我尝试第二个测试向量时,sage出现了故障(但我认为它在Nick使用素数指数向量的实现下可以工作)。 这里的空间实在太小,无法解释一切。但这是我的伪代码。我希望能在几天后写下我的过程。
|
|
|
3
20
x86_64程序集 ,165个字符(28字节的机器代码)。
中间计算(状态*分子)最宽可达128位,但仅支持64位状态。
删除注释、无关空格和详细标签
|
|
|
4
16
|
|
|
5
12
Golfscript-32
{:^{1=1$\%!}?.1={~@\/*^f}{}if}:f
; 108 [[3 2]] f p
# 243
; 1296 [[3 2]] f p
# 6561
; 108 [[455 33][11 13][1 11][3 7][11 2][1 3]] f p
# 15625
; 60466176 [[455 33][11 13][1 11][3 7][11 2][1 3]] f p
# 7888609052210118054117285652827862296732064351090230047702789306640625
|
|
|
6
7
Haskell ,102个字符
$ ghci Prelude> :m List Ratio Prelude List Ratio> let l&n=maybe n((&)l.numerator.(n%1*).(!!)l)$findIndex((==)1.denominator.(n%1*))l Prelude List Ratio> [3%2]&108 243 Prelude List Ratio> [3%2]&1296 6561 Prelude List Ratio> [455%33,11%13,1%11,3%7,11%2,1%3]&108 15625 88,对输入/输出格式的限制放宽。
Prelude List Ratio> let l&n=maybe n((&)l.(*)n.(!!)l)$findIndex((==)1.denominator Prelude List Ratio> [455%33,11%13,1%11,3%7,11%2,1%3]&108 15625 % 1 |
|
7
6
python
以分数形式输入很方便。分数对象。与Ruby解决方案中的想法相同。
|
|
|
8
6
C
,
|
|
|
9
5
Python-53多亏了保罗
不使用分数的Python-54
Python-55 这个有点理论性。前两种情况运行正常,但其他两种情况由于递归深度而失败。也许有人可以让它与生成器表达式一起工作
这里有一种可能性,但即使不包括进口,也会增长到65
|
|
|
10
5
F#:80个字符
这是一个扩展版本,使用
测试代码:
和结果(在F#interactive中测试):
编辑
让我们从中获得更多乐趣,并计算一些素数(请参阅起始文章中的链接页面)。我写了一个新函数
说出前10个素数需要惊人的4.7秒:
毫无疑问,这是我写过的最奇怪、速度最慢的素数生成器。我不确定这是好事还是坏事。 |
|
|
11
4
一个Javascript版本: . 无奖励向量:(
漂亮版: function g(n,p) {
var q, c, i=0;
while(i < p.length) {
q = p[i];
c = n * q[0];
if(c % q[1] != 0) {
++i;
} else {
n = c % q[1];
i = 0;
}
}
return n;
};
|
|
|
12
4
python
|
|
|
13
4
C#: 整洁版本:
压缩版本称重在 (没有名称空间声明或任何名称空间声明,只有single using语句(不是system)和Main函数):
示例(通过命令行参数输入):
|
|
|
14
2
棒极了
,
调用groovy fractal.groovy[输入状态][程序向量作为数字列表]
样品
|
|
|
15
2
|
|
|
16
2
哈斯克尔:
|
|
|
17
2
计划:326我认为需要提交一份方案,以实现平等。我也只是想找个借口玩它。(请原谅我的基础知识,我相信这是可以优化的,我愿意接受建议!)
测验:
我得到了奖励向量! (使用Dr方案,分配256 mb) |
|
|
18
2
卢阿: 整洁代码:
98个字符 (我的另一个答案中的Scoregraphic建议减少,gwell建议更多):
从命令行运行,首先提供基数,然后提供以数字形式显示的分数系列,并用空格分隔,如下所示:
(手动输入其中的一些内容,因为从命令行中获取内容是一件痛苦的事情,尽管这是返回的结果) 不处理奖金向量:( |
|
|
19
2
Python中的参考实现
首先,它通过将分子和分母编码为(idx,value)元组列表来解码分数元组列表,其中idx是素数(2是素数0,3是素数1,等等)。
这种方法的速度大约是Python中对大整数执行算术运算速度的5倍,并且更易于调试! 通过构造一个数组,将每个素数索引(变量)映射到第一次检查分数分母中的素数索引(变量),然后使用该数组构造一个“跳转映射”,由下一条指令组成,以便为程序中的每条指令执行。
|
|
|
20
2
Perl 6:77个字符(实验)
换行是可选的。称为:
可读版本:
笔记:
|
|
|
21
1
Haskell,142个字符没有任何附加库和完整I/O。
|
|
|
22
1
|
|
|
23
1
方案73个字符我的第一次尝试,用完全标准的R 5. RS方案,共104个字符: (define(f p n)(let l((q p)(n n))(if(null? q)n(let((a(* n(car q))))(if(integer? a)(l p a)(l(cdr q)n))))))
> (f '(3/2) 1296) 6561 > (f '(455/33 11/13 1/11 3/7 11/2 1/3) 60466176) 7888609052210118054117285652827862296732064351090230047702789306640625
如果你假设
(define(f n p)(let/cc r(map(λ(i)(if(integer?(* n i))(r(f(* n i)p))))p)n))
(define(f n p)(call-with-current-continuation(lambda(r)(map(lambda(i)(if(integer?(* n i))(r(f(* n i)p))))p)n)))
定义
(define-syntax λ
(syntax-rules ()
((_ . body) (lambda . body)))
(define-syntax let/cc
(syntax-rules ()
((_ var . body) (call-with-current-continuation (lambda (var) . body)))))
|
|
|
24
1
有点晚了。。。dc 84字符
只是为了好玩
|
|
|
25
0
我还不能留下评论,但这里有一个“稍微”短一点的RCIX的C#版本(我相信它短了7个字符)
哪个使用
我还删除了else语句周围不必要的一对大括号,以获得1个字符:)。
我还更换了
|