Golf um número maior que o número do Loader

18

Como acompanhamento do programa de finalização mais curto, cujo tamanho de saída excede o número de Graham e Golf um número maior que o TREE (3) , apresento um novo desafio.

O número do carregador é um número muito grande, difícil de explicar (já que foi o resultado de um exercício de código de golfe com um objetivo flexível). Há uma definição e explicação aqui , mas para fins de auto-contenção, tentarei explicá-lo mais adiante neste post.

O algoritmo que Ralph Loader usou produz um dos maiores números de qualquer algoritmo (computável) já escrito! De fato, o número do Loader é o maior número "computável" no Googology Wiki. (Por número "computável", eles significam um número definido em termos de cálculo.) Isso significa que, se a resposta produzir um número maior que o número do Carregador de uma maneira interessante (ou seja, não apenas o número do Carregador + 1), você poderá descer em História da Googologia! Dito isto, os programas que produzem algo como o número Loader + 1 são respostas e candidatos definitivamente válidos para essa pergunta; só não espere nenhuma fama.

Seu trabalho é criar um programa de encerramento que produza um número maior que o número do Loader. Isso é , então o programa mais curto vence!

  • Você não tem permissão para receber informações.
  • Seu programa deve eventualmente terminar deterministicamente, mas você pode assumir que a máquina possui memória infinita.
  • Você pode assumir que o tipo de número do seu idioma pode conter qualquer valor finito, mas precisa explicar como isso funciona exatamente no seu idioma (por exemplo: um flutuador tem precisão infinita?)
    • Infinidades não são permitidas como saída.
    • O fluxo insuficiente de um tipo de número gera uma exceção. Não envolve.
  • Você precisa fornecer uma explicação do motivo pelo qual o seu número é tão grande e uma versão sem código do seu código para verificar se a sua solução é válida (já que não há computador com memória suficiente para armazenar o número do Loader).

Então, aqui está uma explicação do número do carregador. Veja http://googology.wikia.com/wiki/Loader%27s_number e os links para obter detalhes mais precisos. Em particular, ele contém um programa que produz o número do Loader exatamente (por definição).

O cálculo das construções é essencialmente uma linguagem de programação com propriedades muito particulares.

Primeiro de tudo, todo programa sintaticamente válido termina. Não há loops infinitos. Isso será muito útil, pois significa que, se executarmos um programa de cálculo arbitrário de construções, nosso programa não ficará preso. O problema é que isso implica que o cálculo das construções não está completo.

Segundo, entre os idiomas completos não-Turing, é um dos mais poderosos. Essencialmente, se você puder provar que uma máquina de Turing será interrompida em cada entrada, poderá programar uma função no cálculo de construções que a simularão. (Isso não o torna completo, porque existem máquinas de parada que você não pode provar que estão parando.)

O número do carregador é essencialmente um número ocupado do castor para o cálculo das construções, que é possível calcular, pois todos os programas COC terminam.

Em particular, loader.c define uma função chamada D. Aproximadamente, D(x)itera sobre todas as cadeias de bits menores que x, interpreta-as como programas COC, executa as sintaticamente válidas e concatena os resultados (que também serão cadeias de bits ). Retorna essa concatenação.

O número do carregador é D(D(D(D(D(99))))).

Uma cópia mais legível do código do wiki da googolology

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)))));}
PyRulez
fonte
6
Eu desaconselharia a reduzir a votação por similaridade com a pergunta TREE (3): O número do carregador é tão maior que o TREE (3) que são necessárias abordagens novas e interessantes.
precisa saber é o seguinte
2
@ fəˈnɛtɪk Bem, imprimir o número do Loader + 1 ainda é interessante do ponto de vista do código de golfe (por exemplo, você pode superar os 512 bytes originais?) Há também algumas generalizações naturais do número do carregador que podem ser mais fáceis de implementar (por exemplo, usando ZFC em vez de CoC). Além disso, sequências de camaradas gananciosos ou jogos de promessa finita podem ser usados.
PyRulez
2
Infelizmente, como eu não entendo a construção do número do Loader e não parece haver limites superiores conhecidos em termos da hierarquia em rápido crescimento, não posso dar boas respostas aqui. Eu acredito que a maioria das respostas vão ser extensões de número ou coisas do carregador, como as seqüências gananciosos camarilha e jogos promessa finitos ...
Simply Beautiful Art
1
@SimplyBeautifulArt Oh garoto, se você não entende, isso não é um bom presságio para esse desafio. : O PI pode tentar explicá-lo com mais detalhes no chat, mas também não conheço nenhum limite superior da hierarquia.
PyRulez
1
@SimplyBeautifulArt Em particular, como a constante do Loader foi escolhida especificamente para tentar ser o maior número gerado por uma certa quantidade de código (onde, como o número de Graham e TREE (3), apenas em números matematicamente interessantes que por acaso são grandes), eu acho que a maioria das respostas será apenas o número do carregador + 1.
PyRulez

Respostas:

9

JavaScript, D ^ 6 (9) ( 508 501 495 492 487 485 481 bytes)

_='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(_)

Este é um código codificado.

_='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

Código decodificado:

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

Código decodificado e não destruído (as condições e outras coisas são mantidas no 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))))))

Neste, supõe-se que seja:

  • Pilha de chamadas infinita
  • Memória infinita
  • Precisão infinita Number
  • Magnitude infinita Number
  • Operadores Bitshift e bit a bit trabalham em números inteiros de bits infinitos, em vez de 53 bits. A negação bit a bit ainda anula o bit do sinal.

Algoritmo de codificação / decodificação:

A codificação é feita da seguinte maneira:

  • Pegue uma sequência repetida, chame-a S.
  • Substitua todos os S no código por uma chave K.
  • Coloque K e S no final.
  • Faça uma lista de chaves e também coloque o algoritmo de decodificação para que o código realmente seja executado.

O algoritmo de decodificação:

  • Pegue a lista de chaves.
  • Pegue a tecla mais antiga K.
  • Divida a sequência para cada K.
  • Como o último da matriz é o que substituir KS, pop e substitua todos os K juntando a matriz ao valor popped S.

A compactação foi feita com esse código , marque apenas a última caixa. Como isso codificará o maior salvamento primeiro, não é a compressão mais eficiente, mas também não sei como diminuí-lo.

JavaScript, (339 caracteres )

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

Este código pegará a string de 16 bits como a, a converterá em string de 8 bits com o mesmo binário (BE) e evalele.

O código decodificado é o código codificado acima.

Prova de que D ^ 6 (9)> D ^ 5 (99)

Para isso, compararíamos D (9) e 99.

Ao executar o código manualmente, D (9) é encontrado igual a (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)))))))))))))))))))))))))))))))), e até D (0) é igual a 8646911284551352321.

Portanto, D (9) >>> 99 e, como D está aumentando estritamente, D ^ 6 (9)> D ^ 5 (99).

  • 508B-> 501B, -7B
    • -1B para ... não sei por que. Eu mudei D(D(D(D(D(99)))))para D(D(D(D(D(D(9)))))). Também isso embaralhou as letras.
    • -6B para re-adição &&(1)para D(x)'s condição de ciclo.
  • 501B-> 495B, -6B
    • Corrigido a maioria /2dos >>1sa porqueNumber
    • 6 bytes salvos de algum lugar
    • Você pode ver minha tentativa nesta atualização aqui
  • 495-> 492B, -3B
    • Alterando o decodificador de for...inpara for...of.
  • 492-> 487B, -5B
    • Removendo atribuições desnecessárias
    • Alterando nomes de argumentos
  • 487-> 485B, -2B
    • 1 byte de usar evalpara D, removerreturn .
    • Compactação de 1 byte combinando os parênteses de fechamento em vírgula.
  • 485-> 481B, -4B
    • Comprimindo diferentes substrings.
Naruyoko
fonte
Ou passe-o facilmente com o mesmo comprimento, substituindo 99 por M9, o que torna o valor D ^ 6 (9).
Naruyoko
0

Python 3, D ^ 6 (9) ( 608 600 599 bytes)

_='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(_)

Este é um código codificado. Extraído:

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

Neste, supõe-se que seja:

  • Pilha de chamadas infinita
  • Memória infinita

Esta é basicamente uma porta da minha resposta JavaScript . Para mais detalhes, verifique esse.

A compactação foi feita com isso .

Eu não sou muito experiente em Python, então certamente existem lugares para salvar bytes. Eu acho que sub-600 é possível. sub-600 foi comprovado.

  • 608-> 600B, -8B
    • Agrupou algumas tarefas
    • Condições invertidas Spara reduzir parênteses
  • 600-> 599B, ​​-1B
    • Alterando u/2a terceira última linha da definição de Dpara u>>1, salvando um byte de compactá-lo em um caractere com outros >>1s.
Naruyoko
fonte
0

Ruby, D ^ 6 (9) (553 bytes)

_='F=$a=0TEK#y-~yUx.Z@#F=x%2G1?0R1+Z(x/2).L@#x/2>>[email protected])VHt);x=F#fG2?A(8L@C8Z@IRf>2?fGv ?yRt-(f>v ?1R0)*cREf,E8L@CS(v+2,t6yCc,Z@I).A(K#Hy)G1?Mx,4,Z(FIR5UEK.D@;$>UxVd=c=0;t=7;u=14;while[xNOx-1CB>0][1];d=HHD@IVW;x=W;cGF&&[Hu)G0&&WGf&&![u=Md,4,FCt=A(t,d)],fJd,cCt6tCu6u)]];cNB&&[t=E~u&2|!(u=1UEHcCu)CEHcCt)Cc=F];uJt,cCu6tCt=9]Q#$a=EEt,Eu,Ex,cIC$a)Q;$>UOOOOOO9III!BN#;return .QT6=M13,-4,8S(v,y,c,@(x)B(x/=2)%2C),J/2&![c=EEP(F$rNG0||G==WHF)HL(I))Ky,x)MS(4,OD(Q;endR: T;def U<<V;f=VUTRQOMKIHWGNFEJCB@86.#!'.each_char{|Y|_=_.split(Y);_=_.join(_.pop())};eval(_)

Este é um código codificado. Extraído:

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

Este código é o número do carregador com D 6 (9).

Neste, supõe-se que seja:

  • Pilha de chamadas infinita
  • Memória infinita

Esta é basicamente uma porta da minha resposta JavaScript e Python 3 . Para mais detalhes, verifique-os.

A compactação foi feita com isso (pode parecer que não existe).

Eu sou iniciante no Ruby, então talvez seja possível menos de 512, mas duvido.

Naruyoko
fonte