可能な限り最大の無限大を作りましょう!


31

カントール標準形

序数のシステムは、無限の番号を持つシステムです。無限の数字がたくさん。非常に多くの無限数であるため、文字通り、自身の無限性を表す無限大はありません。上の画像は、それらがどのように機能するかについての少しのアイデアを提供します。序数(フォンノイマン構文)は、以前の序数のセットです。たとえば、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 ...}の場合、スコアはωになります。

依頼した序数をどのように出力しますか。もちろんコード。つまり、プログラムは、各行に1つの引用符で囲まれた他のプログラムの潜在的に無限のリストを出力します(新しい行を表すにはリテラル文字列 "\ n"を使用します)。プログラムは、上記のスコアに対応しています。たとえば、出力する場合

"A"
"B"
"C"

A、B、およびC自体が有効な回答であり、スコアが{0、1、4}である場合、プログラムのスコアは5になります。A、B、およびCは、フラグメントではなく完全なプログラムである必要があります。

上記のルールに基づいて、何も出力しないプログラムのスコアは0です(すべての{}よりも大きい最小の序数は0です)。また、Foundation公理を介して、セットがそれ自体を含むことはできません。つまり、すべてのセット(したがって序数)にはゼロまでのパスがあります。つまり、フルクインはセットではないため無効です。

また、外部のリソース(独自のファイル、インターネットなど)にアクセスするプログラムは許可されていません。また、スコアをリストするときに、可能であればカンター標準形式になっていない場合は、カントール標準形式のスコアを一緒に配置します(そうでない場合は、他の人が可能です)。

上記をすべて考慮した後、投稿する実際の回答は1,000,000バイト未満でなければなりません(コメントはカウントしません)。(この上限は、自動生成されたコードでのみ有効になる可能性があります)。また、使用しないバイトごとにスコアを増加させることができます(無限を扱っているため、これはおそらく序数が非常に近いか同じ場合にのみ考慮されます)。繰り返しますが、この段落は投稿された回答にのみ適用され、生成された回答や生成された回答には適用されません。

これにはquineタグがあります。これは、大きな序数を作成する際に使用するために、ソース独自のコードの少なくとも一部を生成すると役立つ場合があるためです。ただし、必ずしも必要ではありません(たとえば、スコア5の提出には、おそらく独自のソースコードは必要ありません)。

解決済みの注釈付きの例については、こちらを参照してください


無限の数の基数を出力するために終了すべきではないということですか?そして、制限付きソース部分はどこにありますか?このタグはコードの長さの制限のためではないと思います。引用符で囲まれた行と改行を\ nに変換する必要があるのは冗長なように思えますが、他の組み込みリスト形式を許可する必要がありますか?
jimmy23013

@ user23013オプションで、無限数の序数を出力するために終了することはありません。改行を引用してエスケープすることは冗長ですが、多くの言語にはそのタスクのための機能が組み込まれています。他のリスト形式とはどういう意味ですか?
PyRulez

使用する言語で認識可能なリストまたは配列形式を意味します。または、\ nの変換をオプションにします。ただし、多くの言語での簡単な修正は、改行を使用しないことです。
-jimmy23013

3
画像が壊れています。「設定できない」とはどういう意味ですか?「投稿する実際の回答1,000,000バイト未満でなければなりません」は、StackExchangeが30000文字を超える回答を許可しないため、実際の制限よりもはるかに弱いです。
ピーターテイラー

1
@NateEldredge別の言い方をすると、計算可能な序数が可算でなければならないことを証明します。
単に美しいアート

回答:


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と一致しますが、マドーアがそれを右から左に反転させることに注意してください。

ハスケル:Γ 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のワームの一般化に基づいています。

ハスケル:ε 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。

ハスケル:ε 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。

Z0を表し、そして我々は上transfinite誘導によって証明することができα、その後に、β、そのα :@ β≥ω α + β。そう少なくともいずれか塔ωとして大きなとしての第2のレベルの出力があるω ω最初のレベルの出力が少なくともεであることを意味し、0と初期プログラムは、少なくともεである0 + 1。


2
いい答えだ。もっと説明できると思いますか?整然としたタイプを使用するというあなたのアイデアが好きです。
PyRulez

1
具体的には、どの序数が出力として生成されますか?
PyRulez

また、これらの序数のカントールの標準形を知っていますか?
PyRulez

@PyRulez Cantorの標準形式は、これらの序数を説明するのに役立ちません。ψ(Ω^Ω^ω)、Γ₀、およびε₀はすべてイプシロン数です。そのため、「単一レベル」のカントール正規形(ψ(Ω^Ω^ω)=ω^ψ (Ω^Ω^ω)、Γ₀=ω^Γ₀、ε₀=ω^ε₀)、すべての指数がCantor正規形で再帰的になる式としてそれらを書くことはできません。
アンデルスカセオルグ

1
したがって、なぜ順序崩壊関数にVeblenのような正規形を使用する必要があるのか​​:p。そのため、Γ₀=ψ(Ω^Ω)およびε₀=ψ(0)と記述します。
単に美しいアート

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の「序数」です。

このプログラムは、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(I 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(ψ I(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

これは、スコア0で何も印刷しないプログラムです。したがって、

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はい、ここでは枢機inalの代わりに序数を使用する方が理にかなっています。通常、それIは、ωがアレフヌルに関連するように、それが最初のアクセスできない枢機cardに関連する序数であると言います。
単に美しいアート

4

Java + Brainf ***、ω+ 999180ポイント

無限に多くのBrainf ***プログラムを生成するJavaプログラムで、それぞれが出力として最後を生成します。

どうして?出来るからです。

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 StackExchangeは*ワイルドカード文字として使用するため、単にbrainf***、またはを入力しbrainfます。これらのバリエーションはすべて検索結果に表示されます。codegolf.stackexchange.com/help/searching
mbomb007

@ mbomb007ありがとう、私はそれを知りませんでした
Sparr

4

Literate 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は上記のヘルパー関数です。

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

ヘルパー関数を必要としないため(onからの間接的な場合を除き)、後続のもの(s(o(n))、s(s(o(n))))のいずれかではなく、qのみが必要です。ここで、有限nに対してすべてのω* nを出力するだけです。

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

いくよ ω^ 2 314個のコード文字しか使用していないので、最終的なボーナスは999686で、最終的なスコアはω^ 2 + 999686になります。これは既にカントールの標準形式です。

出力の最初の4行(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"

今すぐ深刻な解決策を書きに行きます:
単に美しいアート

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ω=ω。
単に美しいアート

さて、ω•2、私の悪い。
kamoroso94
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.