Ecrivez le programme le plus court possible (longueur mesurée en octets) répondant aux exigences suivantes:
- pas d'entrée
- la sortie est sur stdout
- l'exécution se termine finalement
- le nombre total d'octets de sortie dépasse le nombre de Graham
Supposons que les programmes s'exécutent jusqu'à la fin "normale" d'un ordinateur idéal 1 pouvant accéder à des ressources illimitées et que les langages de programmation courants soient modifiés si nécessaire (sans modification de la syntaxe). En raison de ces hypothèses, nous pourrions appeler cela une sorte d'expérience de Gedanken.
Pour commencer, voici un programme Ruby de 73 octets qui calcule f ω + 1 (99) dans la hiérarchie en pleine croissance :
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: Plus précisément, supposons que nous prenions un système existant et que nous le modifions uniquement pour ne pas avoir de limite maximale de la taille de stockage (mais elle est toujours finie). Les temps d'exécution des instructions ne sont pas supposés être modifiés, mais la machine est supposée être idéale en ce sens qu'elle n'aura pas de limite supérieure de durée de vie.
Réponses:
GolfScript (
4947 caractères)Voir Durée de vie d'un ver pour de nombreuses explications. En bref, il imprime un plus grand nombre de f que co co (2).
la source
Haskell,
59575563Comment ça marche:
%
prend simplement une fonction et la composen-1
fois par dessuss
; c'est-à-dire qu'il%3
prend une fonctionf
et retourne une fonctionn
égale à son applicationf
à 3n-1
fois d'affilée. Si nous itérons l'application de cette fonction d'ordre supérieur, nous obtenons une séquence de fonctions à croissance rapide - à commencer par l'exponentiation, c'est exactement la séquence des tailles de Knuth-flèche-forêt:((%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
et ainsi de suite.
((%3)%(3^))n 3
est3 ↑ⁿ 3
, qui est ce qui apparaît dans le calcul du nombre de Graham. Il ne reste plus qu'à composer la fonction(\n -> 3 ↑ⁿ 3) ≡ flip((%3)%(3^))3
plus de 64 fois, en plus de 4 (le nombre de flèches par lequel commence le calcul), pour obtenir un nombre supérieur à celui de Graham. Il est évident que le logarithme (quelle fonction légèrement lente!)g₆₅
Est toujours supérieur à celui-cig₆₄=G
, donc si nous imprimons ce nombre, la longueur de sortie dépasseG
.⬛
la source
print$((flip((%3)%(3*))3)%2)1
, il y a une erreur d'exécution - pouvez-vous dire pourquoi? Il réussit lorsque2
est remplacé par1
(la sortie est 81).Int
rapidement. Sur un système 64 bits, cela consomme trop de mémoire pour se reproduire, mais bien sûr, cela ne permet toujours pas d'atteindreG
. J'ai besoin du type (big-int)Integer
, donc je ne peux pas utiliser!!
; attendez ...%
.((%3)%(3*))2 n
que la croissance est plus rapide que ce que vous dites (une bonne chose), mais mon Haskell-fu ne permet pas de comprendre pourquoi. Aun = 0, 1, 2, ...
lieu de donner3, 3^3, 3^(3^3), ...
, cela donne3, 3^(3+1), 3^((3^(3+1))+1), ...
.((%3)%(3*))n 3
est plus grand que3 ↑ⁿ 3
". Ou voulez-vous dire autre chose? Quoi qu'il en soit, j'ai changé la définition pour que ce soit toutes les égalités (du moins, je pense que oui, paresseux pour vérifier maintenant ...) plutôt que des choses plus grandes. Et si vous changez66
pour65
, cela se produit réellementG
, n'est-ce pas si agréable?Pyth ,
2928 octetsDéfinit un lambda pour l'hyper-opération et l'appelle de manière récursive. Comme la définition du nombre de Graham, mais avec des valeurs plus grandes.
Cette:
Définit un lambda, à peu près égal au python
Ceci donne la fonction hyper-opération, g (G, H) = 3 ↑ G + 1 (H + 1).
Ainsi, par exemple, g (1,2) = 3 ↑ 2 3 = 7 625 597 484 987, que vous pouvez tester ici .
V<x><y>
démarre une boucle qui exécute le corpsy
,x
fois.=gZT
est le corps de la boucle ici, ce qui équivaut àZ=g(Z,10)
Le code:
Devrait appeler récursivement l'hyperopération ci-dessus 64 fois, donnant le numéro de Graham.
Dans ma réponse, cependant, j’ai remplacé les chiffres uniques par
T
, initialisés à 10, et augmenté la profondeur de la récursion à 99. Avec la notation Graham Array , le nombre de Graham est [3,3,4,64], et mon programme affiche le plus grand [10,11,11,99]. J'ai également supprimé le)
qui ferme la boucle pour enregistrer un octet, de sorte qu'il imprime chaque valeur successive dans les 99 itérations.la source
Python (111 + n), n = longueur (x)
Bien que celui-ci ne soit pas aussi court que le programme Ruby du répondeur, je le posterai quand même, pour écarter cette possibilité.
Il utilise la fonction Ackermann et appelle la fonction Ackermann avec m et n étant les valeurs d'un autre appel à la fonction Ackermann, et effectue un retour 1000 fois.
C'est probablement plus grand que le nombre de Graham, mais je ne suis pas sûr, car personne ne connaît la longueur exacte de celui-ci. Il peut être facilement étendu, si ce n’est pas plus grand.
la source
return
déclaration ou d'unlambda
.exec'x=A(x,x);'*x;print x
, alors le programme est ok et la sortie est approximativement f_ (+ 1) (x) (en supposant que le code de la fonction Ackermann est correct), qui a plus de G octets même pour x = 99, disons . (Dans mon programme Ruby,f[m,n]
est une version deA(m,n)
.)eval
au lieu deexec
, votre dernière ligne pourrait l'êtref=lambda x:A(x,x);print eval('f('*x+'x'+')'*x)
. De plus, votre valeur de A (m, n) doit être corrigée par le commentaire de votre stand.Ruby,
545250 octetsRuby,
858176716864635957 octetsHiérarchie à croissance assez rapide avec f (a + 1)> f ω + 1 (a).
Ruby, 61 octets
Fondamentalement, une fonction Ackermann avec une torsion.
Ruby,
6359 octetsUn autre Ruby,
7471 octetsAckermann fonctionne à lui seul 99 fois.
la source
Python: 85
Ce qui pourrait peut-être être réduit à 74 +
length(X)
:Où
X
est un grand nombre approprié, de sorte que l'hyperopération résultante3, 3
soit plus grande que le nombre de Graham (si ce nombre est inférieur à99999999999
alors un octet est enregistré).Remarque: je suppose que le code python est exécuté sur l'interpréteur interactif; le résultat est donc imprimé sur la sortie standard. Sinon, ajoutez des
9
octets à chaque solution pour l'appel àprint
.la source
Javascript, 83 octets
Une autre solution de fonction Ackermann.
la source
JavaScript, 68 octets, toutefois incompétent pour utiliser ES6
a
la fonction est similaire à la notation en flèche vers le haut avec la base 9.b
la fonction est: b (x) = b x (9).b(99)
est ~ f ω + 1 (99), par rapport au nombre de Graham <f ω + 1 (64).la source