Certains d'entre vous connaissent peut-être le BigNum Bakeoff , qui s'est avéré assez intéressant. L'objectif peut être plus ou moins résumé comme l'écriture d'un programme C dont la sortie serait la plus importante, sous certaines contraintes et conditions théoriques, par exemple un ordinateur qui pourrait exécuter le programme.
Dans le même esprit, je pose un défi similaire ouvert à toutes les langues. Les conditions sont les suivantes:
512 octets maximum .
Le résultat final doit être imprimé sur STDOUT. Ceci est votre score. Si plusieurs entiers sont imprimés, ils seront concaténés.
La sortie doit être un entier. (Remarque: Infinity n'est pas un entier .)
Aucune constante intégrée supérieure à 10, mais les chiffres / chiffres sont corrects (par exemple, la constante d'Avogadro (en tant que constante intégrée) n'est pas valide, mais 10000 ne l'est pas.)
Le programme doit se terminer lorsqu'il dispose de ressources suffisantes pour être exécuté.
La sortie imprimée doit être déterministe lorsqu'elle dispose de ressources suffisantes pour être exécutée.
On vous fournit des nombres entiers ou bigints suffisamment grands pour que votre programme s'exécute. Par exemple, si votre programme nécessite l'application d'opérations de base à des nombres inférieurs à 10 1 000 000 , vous pouvez supposer que l'ordinateur exécutant ce système peut gérer des nombres d'au moins 10 1 000 000 . (Remarque: votre programme peut également être exécuté sur un ordinateur qui gère des nombres allant jusqu'à 10 2 000 000 , donc le simple fait d'appeler l'entier maximum que l'ordinateur peut gérer n'entraînera pas de résultats déterministes.)
Vous disposez d'une puissance de calcul suffisante pour que votre programme puisse terminer son exécution en moins de 5 secondes. (Ne vous inquiétez donc pas si votre programme fonctionne depuis une heure sur votre ordinateur et ne se terminera pas de si tôt.)
Pas de ressources externes, alors ne pensez pas à importer cette fonction Ackermann à moins qu'elle ne soit intégrée.
Tous les objets magiques sont temporairement empruntés à une généreuse divinité.
Extrêmement grand avec une limite inconnue
- Steven H , Pyth f 3 + B³F + ω² (256 26 )
où B³F est l'ordinal de Church-Kleene avec la séquence fondamentale de
B³F[n] = B³F(n), the Busy Beaver BrainF*** variant
B³F[x] = x, ω ≤ x < B³F
Classement:
Simply Beautiful Art , Ruby f ψ 0 (X (Ω M + X (Ω M + 1 Ω M + 1 ) )) + 29 (9 9 9 )
Steven H , Pyth f ψ (Ω Ω ) + ω² + 183 (256 27! )
Leaky Nun , Python 3 f ε 0 (9 9 9 )
fejfo , Python 3 f ω ω 6 (f ω ω 5 (9e999))
Steven H , Python 3 f ω ω + ω² (9 9 9 99 )
L'art tout simplement magnifique , Ruby f ω + 35 (9 9 99 )
i .. , Python 2 , f 3 (f 3 (141))
Quelques notes annexes:
Si nous ne pouvons pas vérifier votre score, nous ne pouvons pas le mettre dans le classement. Vous pouvez donc vous attendre à expliquer un peu votre programme.
De même, si vous ne comprenez pas la taille de votre numéro, expliquez votre programme et nous essaierons de le résoudre.
Si vous utilisez un type de programme de type Loader , je vais vous placer dans une catégorie distincte appelée "Extrêmement grand avec une limite inconnue" , car le numéro de Loader n'a pas de limite supérieure non triviale en termes de hiérarchie à croissance rapide pour ' séquences fondamentales standard.
Les nombres seront classés via la hiérarchie à croissance rapide .
Pour ceux qui voudraient apprendre à utiliser la hiérarchie à croissance rapide pour approximer de très grands nombres, j'héberge un serveur Discord juste pour cela. Il y a aussi une salle de chat: Ordinality .
Défis similaires:
Le plus grand nombre imprimable
Golf un nombre plus grand que TREE (3)
Programme de terminaison le plus court dont la taille de sortie dépasse le nombre de Graham
Pour ceux qui veulent voir des programmes simples qui produisent la hiérarchie à croissance rapide pour les petites valeurs, les voici:
Ruby: une hiérarchie en croissance rapide
#f_0:
f=->n{n+=1}
#f_1:
f=->n{n.times{n+=1};n}
#f_2:
f=->n{n.times{n.times{n+=1}};n}
#f_3:
f=->n{n.times{n.times{n.times{n+=1}}};n}
#f_ω:
f=->n{eval("n.times{"*n+"n+=1"+"}"*n);n}
#f_(ω+1):
f=->n{n.times{eval("n.times{"*n+"n+=1"+"}"*n)};n}
#f_(ω+2):
f=->n{n.times{n.times{eval("n.times{"*n+"n+=1"+"}"*n)}};n}
#f_(ω+3):
f=->n{n.times{n.times{n.times{eval("n.times{"*n+"n+=1"+"}"*n)}}};n}
#f_(ω∙2) = f_(ω+ω):
f=->n{eval("n.times{"*n+"eval(\"n.times{\"*n+\"n+=1\"+\"}\"*n)"+"}"*n);n}
etc.
Pour passer de f_x
à f_(x+1)
, nous ajoutons une boucle du n.times{...}
.
Sinon, nous diagonalisons par rapport à tous les précédents, par exemple
f_ω(1) = f_1(1)
f_ω(2) = f_2(2)
f_ω(3) = f_3(3)
f_(ω+ω)(1) = f_(ω+1)(1)
f_(ω+ω)(2) = f_(ω+2)(2)
f_(ω+ω)(3) = f_(ω+3)(3)
etc.