ローダーの数よりも大きい数のゴルフ


18

フォローアップとして 出力サイズがGrahamの数超えGolfがTREE(3)より大きい数である最短終了プログラムの、私は新しい課題を提示します。

ローダーの数は非常に大きい数であり、説明するのは困難です(それ自体が柔軟な目標を持つコードゴルフ練習の結果であるため)。そこ定義と説明があり、ここではなく、自己封じ込めのために、私も、この記事の後半でそれを説明しようとします。

Ralph Loaderが使用するアルゴリズムは、これまでに作成された(計算可能な)アルゴリズムの中で最大の数の1つを生成します。実際、Loaderの番号は、Googology Wikiで最大の「計算可能な」番号です。(「計算可能な」数とは、計算の観点から定義された数を意味します。)つまり、答えがローダーの数よりも面白い数(つまり、ローダーの数+1だけではない)を生成する場合、 Googologyの歴史!そうは言っても、Loaderのnumber + 1のようなものを生成するプログラムは、間違いなく有効な答えであり、この質問に対する候補です。名声を期待しないでください。

あなたの仕事は、ローダーの数より大きい数を生成する終了プログラムを作成することです。これはなので、最短のプログラムが勝ちです!

  • 入力を許可されていません。
  • プログラムは最終的に確定的に終了する必要がありますが、マシンには無限のメモリがあると想定できます。
  • あなたの言語の数値型は任意の有限値を保持できると仮定するかもしれませんが、これがあなたの言語で正確にどのように機能するかを説明する必要があります(例:浮動小数点数は無限の精度を持っていますか?)
    • 出力として無限は許可されません。
    • 数値型のアンダーフローは例外をスローします。ラップアラウンドしません。
  • 番号が非常に大きい理由の説明と、ソリューションが有効かどうかを確認するためのコードの未使用バージョンを提供する必要があります(ローダーの番号を格納するのに十分なメモリを備えたコンピュータがないため)。

ローダーの番号の説明は次のとおりです。より正確な詳細については、http://googology.wikia.com/wiki/Loader%27s_numberおよびその中のリンクを参照してください。特に、ローダーの番号を(定義により)正確に生成するプログラムが含まれています。

構造の計算は、本質的に非常に特定のプロパティを持つプログラミング言語です。

まず、構文的に有効なプログラムはすべて終了します。無限ループはありません。これは、構築プログラムの任意の計算を実行する場合、プログラムがスタックしないことを意味するため、非常に便利です。問題は、これは構造の計算がチューリング完全ではないことを意味することです。

第二に、チューリング以外の完全な言語の中で、最も強力な言語の1つです。基本的に、チューリングマシンがすべての入力で停止することを証明できれば、それをシミュレートする構造計算の関数をプログラムできます。(停止しても、停止できないことを証明できない停止マシンがあります。)

ローダーの番号は、基本的に構造の計算のためのビジーなビーバー番号です。これは、すべてのcocプログラムが終了するため計算が可能です。

特に、loader.cはと呼ばれる関数を定義しますD。おおよそ、D(x)未満のすべてのビット文字列を反復処理しx、それらをcocプログラムとして解釈し、構文的に有効なものを実行し、結果を連結します(これもビット文字列になります)。この連結を返します。

ローダーの番号はD(D(D(D(D(99)))))です。

googolology wikiからのコードのより読みやすいコピー

int r, a;

P(y,x){return y- ~y<<x;}

Z(x){return r = x % 2 ? 0 : 1 + Z (x / 2 );}

L(x){return x/2 >> Z(x);}

S(v,y,c,t){
   int f = L(t);         
   int x = r;
   return f-2 ? f>2 ? f-v ? t-(f>v)*c : y : P(f,P(S(v,y,c,L(x)), S(v+2,t=S(4,13,-4,y),c,Z(x)))) : A(S(v,y,c,L(x)),S(v,y,c,Z(x)));
}

A(y,x){return L(y)-1 ? 5<<P(y,x) : S(4,x,4,Z(r));}

D(x) 
{
   int f;
   int d;
   int c=0;
   int t=7;
   int u=14;
   while(x&&D(x-1),(x/=2)%2&&(1)){
      d = L(L(D(x))),
      f = L(r),
      x = L(r),
      c - r||(L(u)||L(r)-f||(x/=2)%2&&(u=S(4,d,4, r),t=A(t,d)),f/2&(x/=2)%2&&(c=P(d,c),t=S(4,13,-4,t),u=S(4,13,-4,u))),
      c&&(x/=2)%2&&(t=P(~u&2|(x/=2)%2&&(u=1<<P(L(c),u)),P(L(c),t)),c=r)
      u/2&(x/=2)%2&&(c=P(t,c),u=S(4,13,-4,t),t=9);
    }
    return a = P( P( t, P( u, P( x, c)) ),a);
}

main(){return D(D(D(D(D(99)))));}

6
TREE(3)の質問との類似性については、これを支持しないことをお勧めします。ローダーの数はTREE(3)よりもはるかに大きいため、新しい興味深いアプローチが必要です。
リルトシアスト

2
@ fəˈnɛtɪkまあ、ローダーの番号+ 1を印刷することは、コードのゴルフの観点からはまだ興味深いです(たとえば、元の512バイトを打つことができますか?)ローダーの番号には、実装が簡単な自然な一般化もいくつかあります(たとえば、 CoCの代わりにZFC)。また、貪欲なクリークシーケンスまたは有限約束ゲームを使用できます。
PyRulez

2
残念ながら、ローダーの番号の構造が理解できず、急速に成長する階層の上限がわかっていないため、ここで良い答えを出すことはできません。ほとんどの答えは、ローダーの数の拡張か、貪欲なクリークシーケンスや有限な約束のゲームなどのいずれかであると信じています...
単に美しいアート

1
@SimplyBeautifulArtああ、あなたがそれを理解していないなら、それはこの挑戦にとって良い前兆ではありません。:PIは、チャットでより詳細に説明を試みることができますが、階層の上限もわかりません。
PyRulez

1
@SimplyBeautifulArt特に、ローダーの定数は、特定の量のコード(Grahamの数とTREE(3)がちょうど数学的に興味深い数である場合)によって生成される最大数になるように特別に選択されたため、ほとんどの答えはちょうどLoaderの数+ 1になると思う
PyRulez

回答:


9

JavaScript、D ^ 6(9)(508 501 495 492 487 485 481バイト)

_='r=a=0,PN,yEx-~x<<y,ZNEr=x%2?0:1+ZC>>1@LNEx/2>>ZC@S=Bt,f=Ht@x=rEf-2?f>2?f-v?t-(f>v)*c:y:Ff,FSO(v+2,t8y@c,ZCMM:A(AOBZC)GAN,yELC)-1?5<<PC,y):Iy,4,Z(rGDN,f,dQ=0,t=7,u=14Eeval("whileC&&DC-1@61Md=HHDC)Gf=Hr@x=Hr@c-r||(Hu)||Hr)-f||6u=Id,4,r@t=A(t,dGfJdQ@t8t@u8u)Gc&&6t=F~u&2|6u=1<<FHc@uGFHc@tGc=r@uJtQ@u8t@t=9);a=FFt,Fu,PCQ)Ga)"@KKK9MMM6C>>=1)%2&&(8=I13,-4,G)@@),B(v,yQ,N=COBLCGSC(xE)=>J/2&6c=FFP(HL(IS(4,KD(D(M))Q,c';for(Y of $='QMKIHFJECONB@G86')with(_.split(Y))_=join(pop());eval(_)

これはエンコードされたコードです。

_='r=a=0,PN,yEx-~x<<y,ZNEr=x%2?0:1+ZC>>1@LNEx/2>>ZC@S=Bt,f=Ht@x=rEf-2?f>2?f-v?t-(f>v)*c:y:Ff,FSO(v+2,t8y@c,ZCMM:A(AOBZC)GAN,yELC)-1?5<<PC,y):Iy,4,Z(rGDN,f,dQ=0,t=7,u=14Eeval("whileC&&DC-1@61Md=HHDC)Gf=Hr@x=Hr@c-r||(Hu)||Hr)-f||6u=Id,4,r@t=A(t,dGfJdQ@t8t@u8u)Gc&&6t=F~u&2|6u=1<<FHc@uGFHc@tGc=r@uJtQ@u8t@t=9);a=FFt,Fu,PCQ)Ga)"@KKK9MMM6C>>=1)%2&&(8=I13,-4,G)@@),B(v,yQ,N=COBLCGSC(xE)=>J/2&6c=FFP(HL(IS(4,KD(D(M))Q,c'; //encoded code
for(Y of $='QMKIHFJECONB@G86')with(_.split(Y))_=join(pop()); //decoding algorithm
eval(_) //Evaluation of the string

デコードされたコード:

r=a=0,P=(x,y)=>x-~x<<y,Z=(x)=>r=x%2?0:1+Z(x>>1),L=(x)=>x/2>>Z(x),S=(v,y,c,t,f=L(t),x=r)=>f-2?f>2?f-v?t-(f>v)*c:y:P(f,P(S(v,y,c,L(x)),S(v+2,t=S(4,13,-4,y),c,Z(x)))):A(A(v,y,c,L(x)),S(v,y,c,Z(x))),A=(x,y)=>L(x)-1?5<<P(x,y):S(4,y,4,Z(r)),D=(x,f,d,c=0,t=7,u=14)=>eval("while(x&&D(x-1),(x>>=1)%2&&(1))d=L(L(D(x))),f=L(r),x=L(r),c-r||(L(u)||L(r)-f||(x>>=1)%2&&(u=S(4,d,4,r),t=A(t,d)),f/2&(x>>=1)%2&&(c=P(d,c),t=S(4,13,-4,t),u=S(4,13,-4,u))),c&&(x>>=1)%2&&(t=P(~u&2|(x>>=1)%2&&(u=1<<P(L(c),u)),P(L(c),t)),c=r),u/2&(x>>=1)%2&&(c=P(t,c),u=S(4,13,-4,t),t=9);a=P(P(t,P(u,P(x,c))),a)"),D(D(D(D(D(D(9))))))

デコードされた、改変されていないコード(条件と内容はloader.cから保持されます):

var r=a=0;
function P(y,x){
  return y-~y<<x;
}
function Z(x){
  return r=x%2?0:1+Z(x>>1);
}
function L(x){
  return x/2>>Z(x);
}
function S(v,y,c,t){
  var f=L(t),x=r;
  return f-2?
           f>2?
             f-v?
               t-(f>v)*c
               :y
             :P(f,P(S(v,y,c,L(x)),S(v+2,t=S(4,13,-4,y),c,Z(x))))
           :A(S(v,y,c,L(x)),S(v,y,c,Z(x)))
}
function A(y,x){
  return L(y)-1?
         5<<P(y,x):
         S(4,x,4,Z(r));
}
function D(x){
  var f,
      d,
      c=0,
      t=7,
      u=14;
  while(x&&D(x-1),(x>>=1)%2&&(1))
    d=L(L(D(x))),
    f=L(r),
    x=L(r),
    c-r||(
      L(u)||L(r)-f||
      (x>>=1)%2&&(
        u=S(4,d,4,r),t=A(t,d)
      ),
      f/2&(x>>=1)%2&&(
        c=P(d,c),
        t=S(4,13,-4,t),
        u=S(4,13,-4,u)
      )
    ),
    c&&(x>>=1)%2&&(
      t=P(
        ~u&2|(x>>=1)%2&&(
          u=1<<P(L(c),u)
        ),
        P(L(c),t)
      ),
      c=r
    ),
    u/2&(x>>=1)%2&&(
      c=P(t,c),
      u=S(4,13,-4,t),
      t=9
    );
  return a=P(P(t,P(u,P(x,c))),a)
};
D(D(D(D(D(D(9))))))

これでは、次のように想定されています。

  • 無限の呼び出しスタック
  • 無限の記憶
  • 無限の精度 Number
  • 無限大 Number
  • ビットシフト演算子とビット単位演算子は、53ビットではなく無限ビット整数で機能します。ビットごとの否定は、依然として符号ビットを否定します。

エンコード/デコードアルゴリズム:

エンコードは次のように行われます。

  • 繰り返し文字列を取得して、Sと呼びます。
  • コード内のすべてのSをキーKに置き換えます。
  • 最後にKとSを置きます。
  • キーのリストを作成し、コードが実際に実行されるようにデコードアルゴリズムも配置します。

デコードアルゴリズム:

  • キーのリストを取得します。
  • 最も早いキーKを取得します。
  • 各Kの文字列を分割します。
  • 配列の最後はKSを置き換えるものであるため、ポップし、ポップされた値Sで配列を結合することにより、すべてのKを置き換えます。

圧縮はこのコードで行われましたで、最後のボックスのみをチェックします。これは最初に最大の保存をエンコードするため、最も効率的な圧縮ではありませんが、小さくする方法もわかりません。

JavaScript、(339 文字

eval("_㴧爽愽〬偍ⱹ䕸⵾砼㱹ⱚ䵅爽砥㈿〺ㄫ婃㸾ㅀ䱍䕸⼲㸾婃䁓㵂琬昽䡴䁸㵲䕦ⴲ㽦㸲㽦⵶㽴⴨显瘩⩣㩹㩆昬䙓丨瘫㈬琸祀挬婃䭋㩁⡁乂婃⥇䅍ⱹ䕌䌩ⴱ㼵㰼偃ⱹ⤺匨㐬礬㐬娨片䑍ⱦⱤⱣ㴰ⱴ㴷Ⱶ㴱㑅敶慬⠢睨楬敃☦䑃ⴱ䀶ㅋ搽䡈䑃⥇昽䡲䁸㵈牀挭牼簨䡵⥼籈爩ⵦ籼㙵㵓⠴ⱤⰴⱲ䁴㵁⡴Ɽ䝦䥤Ᵽ䁴㡴䁵㡵⥇挦☶琽䙾甦㉼㙵㴱㰼䙈捀畇䙈捀瑇挽牀畉琬捀甸瑀琽㤩㭡㵆䙴ⱆ甬偃Ᵽ⥇愩≀䩊䨹䭋䬶䌾㸽ㄩ┲☦⠸㵓⠴ⰱ㌬ⴴⱇ⥀䀩ⱂ⡶ⱹⱣⱍ㵃乂䱃䝓䌨硅⤽㹉⼲☶挽䙆倨䡌⡊䐨䐨䬩⤧㭦潲⡙映␽❋䩈䙉䕃乍䉀䜸㘧⥷楴栨弮獰汩琨天⥟㵪潩渨灯瀨⤩㭥癡氨弩".split``.map(a=>(d=String.fromCharCode)((c=a.charCodeAt())>>8)+d(c&255)).join``.slice(1))

このコードは16ビット文字列をaとして受け取り、同じバイナリ(BE)を持つ8ビット文字列に変換evalします。

デコードされたコードは、上記のエンコードされたコードです。

その証明D ^ 6(9)> D ^ 5(99)

このために、D(9)と99を比較します。

コードを手動で実行することにより、D(9)はに等しくなり(15*2^14849+1)*2^((15*2^14849+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^929+1)*2^((15*2^929+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^((15*2^59+1)*2^(15*2^59+1))))))))))))))))))))))))))))))))、D(0)さえもに等しくなり8646911284551352321ます。

したがって、D(9)>>> 99、およびDは厳密に増加しているため、D ^ 6(9)> D ^ 5(99)です。

  • 508B-> 501B、-7B
    • -1Bの理由はわかりません。に変更D(D(D(D(D(99)))))しましたD(D(D(D(D(D(9))))))。また、それは文字をシャッフルしました。
    • のループ条件を再追加する&&(1)場合は-6B D(x)
  • 501B-> 495B、-6B
    • ほとんど/2のsを>>1sに修正Number
    • どこかから6バイト保存
    • このアップデートでの私の試みはここで見ることができます
  • 495-> 492B、-3B
    • デコーダーをからfor...inに変更しfor...ofます。
  • 492-> 487B、-5B
    • 不要な割り当てを削除する
    • 引数名の変更
  • 487-> 485B、-2B
    • evalfor を使用して1バイトD削除しreturnます。
    • 閉じ括弧をコンマに結合する1バイトの圧縮。
  • 485-> 481B、-4B
    • 異なる部分文字列を圧縮する。

または、99をM9に置き換えることにより、同じ長さで簡単に渡します。これにより、値はD ^ 6(9)になります。
ナルヨコ

0

パイソン3、D ^ 6(9)(608 600 599バイト)

_='r=a=0?CM:#y-~y<<x?H6@r=0.EB1+HI)#r?Fx):#xI>>H)?8t6@TtNr#A(U8HG).f==2BCf,CUS(v+2,/yNc,HGG.f<2Bt-(f>v)*c.f-vBy?A(M:#5<<CM.Fy)-1BOx,4,Z(rG?Jx6,a@f=d=c=0@VW7,14@while 1:@.x:Jx-1)X~E:breakKd,TFJxGNFrNFr)@.c-r:K.not(Fu)or(Fr)-fGQ.E:WOd,4,rRA(Vd)K.fIQ.Yd,cR/t);W/u)@.c:@!.EQ q=~u&2|EK .q:W1<<CFuNu)K  Vc=Cq and u,CFcNtG,rXuI&YVc);W/tR9@a=CCVCu,Cx,cGNa)#a\nprint(JJJJJJ9GGG)X\n!if !  x=xIK#@return . if /O13,-4,6):@global r8S(v,y,c,?\ndef Q:K! K@ @\n B else CP(YE:c=CEx%2Tf,x=FFL(U8FxG,G))HZ(xI>>1JD(My,x)N),OS(4,R);t=Vt,Wu='
for Y in 'WVRONMJIHGUFTEYCB@KQ?86/.#!X':_=_.split(Y);_=_.pop().join(_)
exec(_)

これはエンコードされたコードです。抽出:

r=a=0
def P(y,x):
 return y-~y<<x
def Z(x):
 global r
 r=0 if x%2 else 1+Z(x>>1)
 return r
def L(x):
 return x>>1>>Z(x)
def S(v,y,c,t):
 global r
 f,x=L(t),r
 return A(S(v,y,c,L(x)),S(v,y,c,Z(x))) if f==2 else P(f,P(S(v,y,c,L(x)),S(v+2,S(4,13,-4,y),c,Z(x)))) if f<2 else t-(f>v)*c if f-v else y
def A(y,x):
 return 5<<P(y,x) if L(y)-1 else S(4,x,4,Z(r))
def D(x):
 global r,a
 f=d=c=0
 t,u=7,14
 while 1:
  if x:D(x-1)
  x=x>>1
  if ~x%2:break
  d,f,x=L(L(D(x))),L(r),L(r)
  if c-r:
   if not(L(u)or(L(r)-f)):
    x=x>>1
    if x%2:u=S(4,d,4,r);t=A(t,d)
   if f>>1:
    x=x>>1
    if x%2:c=P(d,c);t=S(4,13,-4,t);u=S(4,13,-4,u)
  if c:
   x=x>>1
   if x%2:
    x=x>>1
    q=~u&2|x%2
    if q:u=1<<P(L(u),u)
    t,c=P(q and u,P(L(c),t)),r
  x=x>>1
  if u>>1&x%2:c=P(t,c);u=S(4,13,-4,t);t=9
 a=P(P(t,P(u,P(x,c))),a)
 return a
print(D(D(D(D(D(D(9)))))))

これでは、次のように想定されています。

  • 無限の呼び出しスタック
  • 無限の記憶

これは基本的にJavaScriptの回答の移植版です。詳細については、それを確認してください。

これで圧縮が行われまし

Pythonの知識はあまりないので、バイトを節約する場所は確かにあります。 サブ600は可能だと思います。サブ600が証明されています。

  • 608-> 600B、-8B
    • いくつかの課題をグループ化
    • S括弧を減らすための条件を逆にしました
  • 600-> 599B、-1B
    • to u/2の定義の最後から3番目の行を変更して、バイトが他のs を持つ文字に圧縮されないように保存します。Du>>1>>1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.