尽最大可能!


31

Cantor范式

序号系统是无限的数字系统。许多无穷大。如此众多的无穷数字,以至于它实际上没有一个无穷大来表示自己的无限性。上图给出了它们如何工作的一点想法。序数(冯·诺依曼构造)是一组先前的序数。例如,0是空集,1是集{0},2是集{0,1},依此类推。然后我们得到ω,即{0,1,2,3 ...}。ω+ 1是{0,1,2,3 ...ω},ω乘以2是{0,1,2 ...ω,ω+ 1,ω+ 2 ...}然后你会像那。

您的程序将输出一组序数,例如{0,1,4}。这样,您的分数将比集合中所有序数的最低序数高。对于{0,1,4},得分将为5。对于{0,1,2 ...},得分将为ω。

您如何输出您要求的序号。当然是代码。即,您的程序将在每行中用引号输出一个可能无限的其他程序列表(用引号引起来)(使用文字字符串“ \ n”表示新行)。程序对应于其得分,如上所述。例如,如果您输出

"A"
"B"
"C"

其中A,B和C本身是有效答案,并且得分为{0,1,4},则您的程序的得分为5。请注意,A,B和C必须是完整程序,而不是片段。

根据上述规则,不输出任何内容的程序的得分为0(大于所有{}的最小序数为0)。另外,请记住,根据基础公理,集合不能包含自身。即,每个集合(因此是序数)都具有下降到零的路径。这意味着完整的quine将无效,因为它不是一个set。

另外,不允许任何程序访问外部资源(其自己的文件,互联网等)。另外,在列出分数时,如果可以的话,请将分数的Cantor普通形式放在旁边,如果可以的话(如果没有,则其他人可以)。

考虑以上所有因素后,您发布的实际答案必须少于1,000,000字节(不包括注释)。(此上限可能只会对自动生成的代码起作用)。同样,您可以为不使用的每个字节增加分数(由于我们处理的是无穷大,只有当序数非常接近或相同时,这才可能被考虑在内)。同样,本段仅适用于发布的答案,不适用于生成的答案或生成的答案生成的答案,依此类推。

这具有quine标记,因为生成至少部分源代码自己的代码可能有助于生成大型序言。但是,它绝对不是必需的(例如,分数为5的提交可能不需要其自己的源代码)。

有关示例的注释示例,请参见此处


这是否意味着它不应该终止输出无限数量的基数?限制来源部分在哪里?我认为这个标签不是为了限制代码长度。要求将引用和换行符都转换为\ n对我来说似乎是多余的,是否应允许其他内置列表格式?
jimmy23013 2015年

@ user23013您可以选择永不终止以输出无限数量的序数。尽管引用和转义换行符是多余的,但是许多语言已经内置了用于完成该任务的工具。您所说的其他列表格式是什么意思?
PyRulez 2015年

我的意思是所用语言可以识别的任何列表或数组格式。或者只是将\ n转换为可选。但是,许多语言的快速解决方案是仅不使用任何换行符。
jimmy23013

3
图像坏了。“ 设定不能 ”是什么意思?“ 您发布的实际答案必须少于1,000,000字节 ”比实际限制弱得多,因为StackExchange不允许答案超过30000个字符。
彼得·泰勒

1
@NateEldredge换句话说,证明可计算序数必须是可数的。
Simply Beautiful Art

Answers:


20

哈斯克尔:ψ(Ω Ω ω)+ 999672点

main=print$f++shows f"$iterate(Z:@)Z";f="data N=Z|N:@N deriving Show;r=repeat;s Z=[];s(a:@Z)=r a;s(Z:@b)=($u b)<$>h b;s(a:@b)=do(f,c)<-h b`zip`s a;f<$>[c:@b,a]\nh=scanl(flip(.))id.t;t(Z:@Z)=r(:@Z);t(Z:@b)=((Z:@).)<$>t b;t(a:@b)=flip(:@).(:@b)<$>s a;u Z=Z;u(Z:@b)=u b;u(a:@_)=a;g f=mapM_$print.((f++shows f\"$s$\")++).show;main=g"

329个字节的代码以序ψ(Ω Ω ω + 1.使用基于树的表示通过发现序数Jervell(2005) 。带有孩子αβ,…,γ的树被表示α :@ (β :@ (… :@ (γ :@ Z)…))。从左到右的顺序与Jervell一致,尽管请注意Madore将其从右向左翻转。

哈斯克尔:Γ 0 + 999777点

main=print$f++shows f"$iterate((:[]).T)[]";f="data T=T[T]deriving(Eq,Ord,Show);r=reverse;s[]=[];s(T b:c)=(++c)<$>scanl(++)[](b>>cycle[fst(span(>=T b)c)++[T$r d]|d<-s$r b]);g f=mapM_$print.((f++shows f\"$s$\")++).show;main=g"

224个以序的字节代码Γ 0 + 1。这是基于Beklemishev的蜗杆以序数值元素,其本身递归蠕虫表示的概括。

Haskell中:ε 0 + 999853个

main=print$f++shows f"$map(:[])[0..]";f="s[]=[];s(0:a)=[a];s(a:b)=b:s(a:fst(span(>=a)b)++a-1:b);g f=mapM_$print.((f++shows f\"$s$\")++).show;main=g"

148个以序的字节代码ε 0 + 1。这是基于Beklemishev的蠕虫。列表

map(+1 ++ [0] ++ map(+1 ++ [0] ++  ++ [0] ++ map(+1

表示的顺序(ω γ +⋯+ω βα) - 1。所以第二电平输出[0][1][2][3],...表示1,ω,ω ω,ω ω ω,...中,第一级的输出表示ε 0,初始程序表示ε 0 + 1。

Haskell中:ε 0 + 999807个

main=print$f++shows f"$iterate(:@Z)Z";f="data N=Z|N:@N deriving Show;s Z=[];s(Z:@b)=repeat b;s(a:@Z)=scanl(flip(:@))Z$s a;s(a:@b)=(a:@)<$>s b;g f=mapM_$print.((f++shows f\"$s$\")++).show;main=g"

194个字节的代码以序ε 0 + 1。

Z表示0,我们可以通过超限归纳上证明α,然后在β,即α :@ β≥ω α + β。所以有第二电平输出至少一样大的任何塔ω ω ω,这意味着所述第一电平输出为至少ε 0和初始程序是至少ε 0 + 1。


2
好答案。您认为您可以进一步解释吗?我喜欢您使用井井有条的类型的想法。
PyRulez 2015年

1
具体来说,它会产生哪些序数作为输出?
PyRulez 2015年

另外,您知道这些普通话的Cantor正常形式吗?
PyRulez

@PyRulez Cantor范式对描述这些序数没有帮助。ψ(Ω^Ω^ω),Γ₀和ε₀都是epsilon数,因此尽管我们可以为它们的“单级” Cantor范式写无用的相似圆形方程(ψ(Ω^Ω^ω)=ω^ψ (Ω^Ω^ω),Γ₀=ω^Γ₀,ε₀=ω^ε₀),我们不能将它们写为每个指数都以Cantor正规形式递归的表达式。
Anders Kaseorg

1
因此,为什么要对序数折叠函数使用类似Veblen的范式:p。这样,您将写出Γ₀=ψ(Ω^Ω)和ε₀=ψ(0)。
Simply Beautiful Art

5

红宝石,ψ 0(ψ X(ψ M + 1(Ω M + 1 Ω M + 1))(0))+ 999663个

假设我明白我的程序适当地,我的分数是ψ 0(ψ X(ψ M + 1(Ω M + 1 Ω M + 1))(0))+ 999663个,其中ψ是一个序折叠功能,X是智功能(Mahlo折叠功能),而M是第一个Mahlo'ordinal'。

该程序是我在Golf上编写的程序的扩展,其数量比TREE(3)大,并且在此之前完全胜过所有其他解决方案。

z=->x,k{f=->a,n,b=a,q=n{c,d,e=a;!c ?q:a==c ?a-1:e==0||e&&d==0?c:e ?[[c,d,f[e,n,b,q]],f[d,n,b,q],c]:n<1?9:!d ?[f[b,n-1],c]:c==0?n:[t=[f[c,n],d],n,d==0?n:[f[d,n,b,t]]]};x==0??p:(w="\\"*k+"\"";y="";(0..1.0/0).map{|g|y+="x=#{f[x,g]};puts x==0??p:"+w+"#{z[f[x,g],k*2+1]}"+w+";"};y)};h=-1;(0..1.0/0).map{|i|puts "puts \"#{z[[i,h=[h,h,h]],1]}\""}

在线尝试!

红宝石,ψ 0(ψ (I ))+ 999674个

z=->x,k{f=->a,n,b=a{c,d,e,q=a;a==c ?a-1:e==0||d==0?(q ?[c]:c):e ?[[c,d,f[e,n,b],q],f[d,n,b],c,q]:[n<1?9:d&&c==0?[d]:d ?[f[c,n],d]:[f[b,n-1],f[c,n,b]],n,n]};x==0??p:(w="\\"*k+"\"";y="";(0..1.0/0).map{|g|y+="x=#{f[x,g]};puts(x==0??p:"+w+"#{z[f[x,g],k*2+1]}"+w+");"};y)};h=0;(0..1.0/0).map{|i|puts("puts(\"#{z[h=[h,h,h,0],1]}\")")}

在线尝试!(警告:它不会做太多,因为显然(0..1.0/0).map{...}无法终止。这也是我打印无限多个程序的方式。)

红宝石,ψ 0(ψ (0))+ 999697个

z=->x,k{f=->a,n,b=a{c,d,e=a;a==c ?a-1:e==0||d==0?c:e ?[[c,d,f[e,n,b]],d-1,c]:[n<1?9:d&&c==0?[d]:d ?[f[c,n-1],d]:[f[b,n-=1],f[c,n,b]],n,n]};x==0??p:(w="\\"*k+"\"";y="";(0..1.0/0).map{|g|y+="x=#{f[x,g]};puts(x==0??p:"+w+"#{z[f[x,g],k*2+1]}"+w+");"};y)};h=0;(0..1.0/0).map{|i|h=[h];puts|i|puts("puts(\"#{z[hz[h=[h],1]}\")")}

在线尝试!

(0..5).map{...}而是实施一个更合理的测试程序:

z=->x,k{f=->a,n,b=a{c,d,e=a;a==c ?a-1:e==0||d==0?c:e ?[[c,d,f[e,n,b]],d-1,c]:[n<1?9:d&&c==0?[d]:d ?[f[c,n-1],d]:[f[b,n-=1],f[c,n,b]],n,n]};x==0??p:(w="\\"*k+"\"";y="";(0..5).map{|g|y+="x=#{f[x,g]};puts(x==0??p:"+w+"#{z[f[x,g],k*2+1]}"+w+");"};y)};h=0;(0..5).map{|i|h=[h];puts("puts(\"#{z[h,1]}\")")}

在线尝试!

不幸的是,即使有(1..1).map{...},你会发现这个程序是非常占用大量内存。我的意思是,输出的长度超过了SCG(13)之类的东西。

通过使用更简单的程序,我们可以考虑一些值:

a = value you want to enter in.
z=->x,k{f=->a,n,b=a{c,d,e=a;a==c ?a-1:e==0||d==0?c:e ?[[c,d,f[e,n,b]],d-1,c]:[n<1?9:d&&c==0?[d]:d ?[f[c,n-1],d]:[f[b,n-=1],f[c,n,b]],n,n]};x==0??p:(w="\\"*k+"\"";y="x=#{f[x,k]};puts(x==0??p:"+w+"#{z[f[x,k],k*2+1]}"+w+");";y)};puts("puts(\"#{z[a,1]}\")")

在线尝试!

它基本上以以下格式重复打印同一程序:

x=...;puts(x==0??p:"...");

初始化x记录的位置与程序相关的序号,并且减少了"..."保留程序的位置x。如果为x==0,则打印

p

这是一个不打印任何零分数的程序,因此

x=0;puts(x==0??p:"p");

得分为1,并且

x=1;puts(x==0??p:"x=0;puts(x==0??p:\"p\");");

得分为2,并且

x=2;puts(x==0??p:"x=1;puts(x==0??p:\"x=0;puts(x==0??p:\\\"p\\\");\");");

得分为3等,并且我的原始程序以以下格式打印这些程序

puts("...")

...上面列出的程序在哪里。

我的实际程序实际上以以下格式打印这些程序

x=0;puts(x==0??p:"p;p;p;p;p;...");

无限次,对于,如ω,它的作用类似于

x=ω;puts(x==0??p:"(x=0 program); (x=1 program); (x=2 program); ...")

因此,该程序的分数

x=(some_ordinal);puts(x==0??p:"...")

1+some_ordinal,得分为

puts("x=(some_ordinal);puts(x==0??p:\"...\")")

1+some_ordinal+1,得分为

z=->x,k{f=->a,n,b=a{c,d,e=a;a==c ?a-1:e==0||d==0?c:e ?[[c,d,f[e,n,b]],d-1,c]:[n<1?9:d&&c==0?[d]:d ?[f[c,n-1],d]:[f[b,n-=1],f[c,n,b]],n,n]};x==0??p:(w="\\"*k+"\"";y="";(0..1.0/0).map{|g|y+="x=#{f[x,g]};puts(x==0??p:"+w+"#{z[f[x,g],k*2+1]}"+w+");"};y)};puts("puts(\"#{z[some_ordinal,1]}\")")

1+some_ordinal+2


平凡的解释:

f[a,n,b]减少序数a

每个自然数都减少到其下的自然数。

f[k,n,b] = k-1

[c,0,e]是的继任者c,一直减少到c

f[[c,0,e],n,b] = c

[c,d,e] 是向后关联的超操作,减少如下:

f[[c,d,0],n,b] = c
f[[c,d,e],n,b] = [[c,d,f[e,n,b]],f[d,n,b],c]

[0] 是第一个无穷序数(等于ω),并按如下方式减少:

f[[0],0,b] = [9,0,0]
f[[0],n,b] = [n,n,n]

[c] 是cth欧米茄序号,并减少如下:

f[[c],0,b] = [9,0,0]
f[[c],n,b] = [[f[b,n-1,b],f[c,n,b]],n,n]
Note the two-argument array here.

[c,d]是ψ d(c)和减少如下:

f[[c,d],0,b] = [9,0,0]
f[[0,d],n,b] = [[d],n,n]
f[[c,d],n,b] = [[f[c,n,c],d],n,n]

[c,d,e,0]与基本上相同[c,d,e],不同之处在于它枚举操作[c]而不是后继操作。

f[[c,0,e,0],n,b] = [c]
f[[c,d,0,0],n,b] = [c]
f[[c,d,e,0],n,b] = [[c,d,f[e,n,b],0],f[d,n,b],c,0]

根据Googology Wikia,我是第一个不可访问的基数,也不是第一个不可访问的序数。
PyRulez

@PyRulez是的,尽管这里有序数而不是基数更有意义。通常有人说这I是与第一个不可访问的基数有关的序数,就像ω与aleph null有关。
Simply Beautiful Art

4

Java + Brainf ***,ω+ 999180点

一个Java程序,它产生无限多个Brainf ***程序,每个程序都产生最后一个输出。

为什么?因为我可以。

肯定欢迎对Brainf ***生成部分的任何改进。

import java.io.*;import java.util.*;import static java.lang.System.*;
class O{
    static String F(String s){
        String t="++++++++++++++++++++";
        List<Character> c=Arrays.asList('+','-','.','<','>','[',']');
        t+="[->++>++>++>+++>+++>++++>++++<<<<<<<]>+++>+++++>++++++>>++>+++++++++++>+++++++++++++";
        for(int x=0,i=6;x<s.length();x++){
            int d=c.indexOf(s.charAt(x)),k=d;
            while(d>i){d--;t+=">";}
            while(d<i){d++;t+="<";}
            t+=".";i=k;
        }return t;
    };
    static void p(String a){
        int i=48;while(i<a.length()){out.println(a.substring(i-48,i));i+=48;}
        out.println(a.substring(i-48));out.println();
    }
    public static void main(String[]a) throws Exception{setOut(new PrintStream("o.txt"));String b="";while(true)p(b=F(b));}
}

1
当然,根据您的喜好,但是使用真实名称可以使搜索更加容易。:)
luser droog

1
@luserdroog不正确。由于我确定您知道如何包含多个搜索词,因此搜索具有不同命名的BF程序同样困难。
mbomb007

@ mbomb007是否建议输入“ brainfuck | brainf * ck | brainfcuk | brainf ** k | brainf *** | brain **** | brainfu * k | ...”与输入“ brainfuck”具有相同的难度?
Sparr

@Sparr StackExchange *用作通配符,因此只需键入brainf***或即可brainf。所有这些变化都会出现在搜索结果中。codegolf.stackexchange.com/help/searching
mbomb007 '17

@ mbomb007谢谢,我不知道
Sparr

4

识字Haskell(GHC 7.10):ω²+ 999686点。

这将作为示例答案。以其为例,仅使用识字编程是有意义的。不过得分不高。小鸟球会降低我的得分,但是哦。首先,让我们创建一个辅助函数s。如果x是序数,则sx = x + 1,但是我们发现s的意外用途。

> s x="main=putStrLn "++show x

show函数很幸运地为我们完成了所有字符串清理。它也值得设为0。零不是任何后继,但是s“”等于“ main = putStrLn”“”,等于0。

> z=s""

现在我们将创建一个函数,该函数取n,然后返回ω* n。

> o 0=z
> o n=q++"\nmain=putStrLn$unlines$map show$iterate s$o "++show(n-1)

通过{ω*(n-1),ω*(n-1)+1,ω*(n-1)+2,...}使ω* n起作用。这是什么q?为什么,这就是我们有标签的原因。到目前为止,q是上述帮助器功能。

> h x = x ++ show x
> q = h "s x=\"main=putStrLn \"++show x\nz=s\"\"\no 0=z\no n=q++\"\\nmain=putStrLn$unlines$map show$iterate s$o \"++show(n-1)\nh x = x ++ show x\nq = h "

请注意,仅在需要q时,而不在其后继者(s(o(n)),s(s(o(n)))中的任何一个,因为它们不需要辅助函数(间接地来自o n除外)。现在我们只需要输出有限n的所有ω* n即可。

> main=mapM(print.o)[0..]

好了 ω^ 2仅使用了314个代码字符,我要求获得999686的最终奖金,这给了我ω^ 2 + 999686的最终分数,这已经是康托尔的正常形式。

输出的前四行(0,ω,ω* 2,ω* 3):

"main=putStrLn \"\""
"s x=\"main=putStrLn \"++show x\nz=s\"\"\no 0=z\no n=q++\"\\nmain=putStrLn$unlines$map show$iterate s$o \"++show(n-1)\nh x = x ++ show x\nq = h \"s x=\\\"main=putStrLn \\\"++show x\\nz=s\\\"\\\"\\no 0=z\\no n=q++\\\"\\\\nmain=putStrLn$unlines$map show$iterate s$o \\\"++show(n-1)\\nh x = x ++ show x\\nq = h \"\nmain=putStrLn$unlines$map show$iterate s$o 0"
"s x=\"main=putStrLn \"++show x\nz=s\"\"\no 0=z\no n=q++\"\\nmain=putStrLn$unlines$map show$iterate s$o \"++show(n-1)\nh x = x ++ show x\nq = h \"s x=\\\"main=putStrLn \\\"++show x\\nz=s\\\"\\\"\\no 0=z\\no n=q++\\\"\\\\nmain=putStrLn$unlines$map show$iterate s$o \\\"++show(n-1)\\nh x = x ++ show x\\nq = h \"\nmain=putStrLn$unlines$map show$iterate s$o 1"
"s x=\"main=putStrLn \"++show x\nz=s\"\"\no 0=z\no n=q++\"\\nmain=putStrLn$unlines$map show$iterate s$o \"++show(n-1)\nh x = x ++ show x\nq = h \"s x=\\\"main=putStrLn \\\"++show x\\nz=s\\\"\\\"\\no 0=z\\no n=q++\\\"\\\\nmain=putStrLn$unlines$map show$iterate s$o \\\"++show(n-1)\\nh x = x ++ show x\\nq = h \"\nmain=putStrLn$unlines$map show$iterate s$o 2"

现在去写一个严肃的解决方案:-)
Simply Beautiful

2

GolfScript,ε₀+ 1 + 999537点

{{
{"{"lib`+"}:lib~~"@++"~"+p}:output;
{{}}:nothing;
{{1{).2$`+output 1}do}}:list;
{{\.(`2$`+" iter"+@`if output}}:iter;
{{1${@`@(2$`{rep~}+++\}{;;}if~}}:rep;
{\`\+}:combine;
{{\@@~}}:swap;
{{1${1$(1$`{rangemap~}+[+@@[\\]]{~}/+}{;;}if}}:rangemap;
{`{}+}:wrap;
}}:lib~~
nothing {iter combine list~} {rep combine} {~swap combine combine} rep combine swap combine combine {~list~} combine rangemap {~~} combine combine swap combine combine swap combine combine list~

它可能会更好,但是我变得懒得去调试和证明更大的序数。

较小的普通

#ω^ω^ω
#nothing {iter combine list~} {rep combine swap combine combine list~} {rep combine swap combine combine swap combine combine list~} rep combine swap combine combine swap combine combine swap combine combine list~
#ω^ω^2
#nothing {iter combine list~} { {rep combine swap combine combine list~} rep combine swap combine combine swap combine combine list~} rep combine swap combine combine swap combine combine list~
#ω^nω
#nothing {iter combine list~} 2 { {rep combine swap combine combine list~} rep combine swap combine combine swap combine combine list~} rep~
#ω^ω
#nothing {iter combine list~} {rep combine swap combine combine list~} rep combine swap combine combine swap combine combine list~
#ω^n
#nothing {iter combine list~} 3 {rep combine swap combine combine list~} rep~
#ω^3
#nothing {{iter combine list~} rep combine swap combine combine list~} rep combine swap combine combine list~
#ω^2
#nothing {iter combine list~} rep combine swap combine combine list~
#nω
#nothing 3 {iter combine list~} rep~
#2ω
#nothing iter combine list combine iter combine list~
#ω
#nothing iter combine list~
#finite
#2 nothing iter~

1

Javascript(Nashorn),ω2+ 999807点

Nashorn是Java内置的Javascript引擎。在Rhino中也可以使用,但是我还没有对此进行测试。

c="(b=function(a){print(a?\"(b=\"+b+\")(\"+(a-1)+\")\":\"c=\\\"(b=function(a){print(a?'(b='+b+')'+'('+(a-1)+')':'')})(\\\";a=0;while(++a)print(c+a+\\\")\\\")\")})(";a=0;while(++a)print(c+a+")")

是2ω还是ω²?
kamoroso94

@ kamoroso94 FYI2ω=ω。
Simply Beautiful

好吧,ω•2,我不好。
kamoroso94 '17
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.