Escreva o programa mais curto possível (comprimento medido em bytes) atendendo aos seguintes requisitos:
- sem entrada
- saída é stdout
- a execução termina eventualmente
- o número total de bytes de saída excede o número de Graham
Suponha que os programas sejam executados até a finalização "normal" em um computador ideal 1 capaz de acessar recursos ilimitados e que as linguagens de programação comuns sejam modificadas, se necessário (sem alterar a sintaxe) para permitir isso. Devido a essas suposições, podemos chamar isso de uma espécie de experiência Gedanken.
Para começar, aqui está um programa Ruby de 73 bytes que calcula f ω + 1 (99) na hierarquia de rápido crescimento :
f=proc{|k,n|k>0?n.times{n=f[k-1,n]}:n+=1;n};n=99;n.times{n=f[n,n]};puts n
1 EDIT: Mais precisamente, suponha que estamos pegando um sistema existente e modificando-o apenas para não ter limite superior no tamanho do armazenamento (mas é sempre finito). Os tempos de execução das instruções não devem ser modificados, mas presume-se que a máquina seja ideal, pois não terá limite superior na vida útil de operação.
Respostas:
GolfScript (
4947 caracteres)Veja a vida de um verme para muitas explicações. Em resumo, isso imprime um número maior que f ω ω (2).
fonte
Haskell,
59.575563.Como funciona:
%
simplesmente pega uma função e a compõe váriasn-1
vezess
; isto é,%3
pega uma funçãof
e retorna uma funçãon
igual a aplicá-laf
a 3,n-1
vezes seguidas. Se iterarmos a aplicação dessa função de ordem superior, obteremos uma sequência de funções que cresce rapidamente - começando pela exponenciação, é exatamente a sequência dos tamanhos de floresta de flechas de Knuth:((%3)%(3^))1 n = (3^)n = 3ⁿ = 3↑n
((%3)%(3^))2 n = ((3^)%3)n = (3↑)ⁿ⁻¹ $ 3 = 3↑↑n
((%3)%(3^))3 n = (((3^)%3)%3)n = (3↑↑)ⁿ⁻¹ $ 3 = 3↑↑↑n
e assim por diante.
((%3)%(3^))n 3
é3 ↑ⁿ 3
, que é o que aparece no cálculo do número de Graham. Tudo o que resta a fazer é compor a função(\n -> 3 ↑ⁿ 3) ≡ flip((%3)%(3^))3
mais de 64 vezes, além de 4 (o número de setas com o qual o cálculo começa), para obter um número maior que o número de Graham. É óbvio que o logaritmo (que função é muito lenta!) Deg₆₅
ainda é maior queg₆₄=G
, portanto, se imprimirmos esse número, o comprimento da saída excederáG
.⬛
fonte
print$((flip((%3)%(3*))3)%2)1
, há um erro de tempo de execução - você pode dizer por quê? É bem-sucedido quando o2
é alterado para1
(a saída é 81).Int
rapidamente. Em um sistema de 64 bits, isso consome muita memória para reproduzir, mas é claro que ainda não permitirá alcançarG
. Eu preciso do tipo (big-int)Integer
, então não posso usar!!
; aguarde ...%
.((%3)%(3*))2 n
na verdade cresce mais rápido do que você diz (uma coisa boa ), mas meu Haskell-fu é inadequado para entender o porquê. Poisn = 0, 1, 2, ...
, em vez de dar3, 3^3, 3^(3^3), ...
, dá3, 3^(3+1), 3^((3^(3+1))+1), ...
.((%3)%(3*))n 3
é maior que3 ↑ⁿ 3
". Ou você quer dizer outra coisa? De qualquer forma, mudei a definição para que todas as igualdades (pelo menos eu acho que seja, com preguiça de verificar agora ...) em vez de maiores que. E se você mudar66
para65
, ele realmente se produzG
, não é legal?Pitão ,
2928 bytesDefine um lambda para hiperoperação e o chama recursivamente. Como a definição para o número de Graham, mas com valores maiores.
Este:
Define um lambda, aproximadamente igual ao python
Isso fornece a função de hiperoperação, g (G, H) = 3 ↑ G + 1 (H + 1).
Então, por exemplo, g (1,2) = 3 ↑ 2 3 = 7.625.597.484.987, que você pode testar aqui .
V<x><y>
inicia um ciclo que executa o corpo,y
,x
vezes.=gZT
é o corpo do loop aqui, que é equivalente aZ=g(Z,10)
O código:
Deve recursivamente chamar a hiperoperação acima de 64 vezes, fornecendo o Número de Graham.
Na minha resposta, no entanto, substituí os dígitos únicos com
T
, inicializados em 10, e aumentei a profundidade da recursão para 99. Usando a Notação Graham Array , o Número de Graham é [3,3,4,64] e meu o programa gera o maior [10,11,11,99]. Também removi o)
que fecha o loop para salvar um byte, para que ele imprima cada valor sucessivo nas 99 iterações.fonte
Python (111 + n), n = comprimento (x)
Embora este não seja tão curto quanto o programa Ruby do respondente, eu o publicarei de qualquer maneira, para descartar essa possibilidade.
Ele usa a função Ackermann e chama a função Ackermann com m e n sendo os valores de outra chamada para a função Ackermann, e se repete 1000 vezes.
Provavelmente é maior que o número de Graham, mas não tenho certeza, porque ninguém sabe o tamanho exato. Pode ser facilmente estendido, se não for maior.
fonte
return
declaração ou alambda
.exec'x=A(x,x);'*x;print x
, o programa está ok e a saída é aproximadamente f_ (ω + 1) (x) (assumindo que o código de função de Ackermann esteja correto), que possui mais de G bytes, mesmo para x = 99, digamos . (No meu programa Ruby,f[m,n]
é uma versão doA(m,n)
.)eval
vez deexec
, sua última linha pode serf=lambda x:A(x,x);print eval('f('*x+'x'+')'*x)
. Além disso, sua definição de A (m, n) precisa ser corrigida pelo comentário do boothby.Ruby,
545250 bytesRubi,
858176716864635957 bytesHierarquia em rápido crescimento com f (a + 1)> f ω + 1 (a).
Ruby, 61 bytes
Basicamente, uma função de Ackermann com uma torção.
Ruby,
6359 bytesOutro Ruby,
7471 bytesBasicamente, Ackermann funciona 99 vezes.
fonte
Python: 85
Que talvez pudesse ser reduzido para 74 +
length(X)
:Onde
X
existe um número grande apropriado, de modo que a hiperoperação resultante3, 3
seja maior que o número de Grahams (se esse número for menor do que99999999999
algum byte será salvo).Nota: Presumo que o código python seja executado no interpretador interativo, portanto, o resultado será impresso em stdout; caso contrário, adicione
9
bytes a cada solução para a qual a chamada será feitaprint
.fonte
Javascript, 83 bytes
Outra solução da função Ackermann.
fonte
JavaScript, 68 bytes, porém pouco atraente para usar o ES6
a
A função é semelhante à notação de seta para cima na base 9.b
a função é: b (x) = b x (9).b(99)
é ~ f ω + 1 (99), comparado ao número de Graham <f ω + 1 (64).fonte