Votre travail consiste à créer la fonction de croissance la plus lente possible en 100 octets maximum.
Votre programme prendra en entrée un entier non négatif et sortira un entier non négatif. Appelons votre programme P.
Il doit répondre à ces deux critères:
- Son code source doit être inférieur ou égal à 100 octets.
- Pour tout K, il y a un N, tel que pour tout n> = N, P (n)> K. En d'autres termes, lim (n-> ∞) P (n) = ∞ . (C'est ce que cela signifie pour lui de "grandir".)
Votre «score» est le taux de croissance de la fonction sous-jacente de votre programme.
Plus précisément, le programme P est plus lent que Q s'il y a un N tel que pour tout n> = N, P (n) <= Q (n), et qu'il y ait au moins un n> = N tel que P (n ) <Q (n). Si aucun des deux programmes n'est meilleur que l'autre, ils sont à égalité. (Essentiellement, le programme le plus lent est basé sur la valeur de lim (n-> ∞) P (n) -Q (n).)
La fonction de croissance la plus lente est définie comme celle qui croît plus lentement que toute autre fonction, selon la définition du paragraphe précédent.
C'est le golf à taux de croissance , donc le programme à croissance la plus lente gagne!
Remarques:
- Pour aider à la notation, essayez de mettre quelle fonction votre programme calcule dans la réponse.
- Mettez également quelques entrées et sorties (théoriques), pour aider à donner aux gens une idée de la lenteur de votre progression.
la source
<
suivi d'une lettre est le début d'une balise HTML. Prévisualisez vos questions avant de les poster: PRéponses:
Haskell, 98 octets, score = f ε 0 -1 ( n )
Comment ça marche
Cela calcule l'inverse d'une fonction à croissance très rapide liée au jeu de vers de Beklemishev . Son taux de croissance est comparable à f ε 0 , où f α est la hiérarchie à croissance rapide et ε 0 est le premier nombre epsilon .
Pour comparaison avec d'autres réponses, notez que
la source
Brachylog , 100 octets
Essayez-le en ligne!
C'est probablement loin de la lenteur de certaines autres réponses fantaisistes, mais je ne pouvais pas croire que personne n'avait essayé cette approche simple et belle.
Simplement, nous calculons la longueur du numéro d'entrée, puis la longueur de ce résultat, puis la longueur de cet autre résultat ... 100 fois au total.
Cela augmente aussi rapidement que log (log (log ... log (x), avec 100 journaux base-10).
Si vous entrez votre numéro sous forme de chaîne , cela fonctionnera extrêmement rapidement sur toute entrée que vous pourriez essayer, mais ne vous attendez jamais à voir un résultat supérieur à 1: D
la source
JavaScript (ES6), fonction Ackermann inverse *, 97 octets
* si je l'ai bien fait
La fonction
A
est la fonction Ackermann . La fonctiona
est censée être la fonction Ackermann inverse . Si je mis en œuvre correctement, Wikipedia dit qu'il ne sera pas touché5
jusqu'àm
égaux2^2^2^2^16
. Je fais leStackOverflow
tour1000
.Usage:
Explications:
Fonction Ackermann
Fonction Ackermann inverse
la source
Pure Evil: Eval
L'instruction à l'intérieur de l'éval crée une chaîne de longueur 7 * 10 10 10 10 10 10 8.57 qui se compose de rien mais plus d'appels à la fonction lambda dont chacun construira une chaîne de longueur similaire ,
y
indéfiniment jusqu'à ce qu'elle devienne finalement 0. Ostensiblement cela a la même complexité que la méthode Eschew ci-dessous, mais plutôt que de s'appuyer sur une logique de contrôle si et / ou, il écrase simplement des chaînes géantes (et le résultat net obtient plus de piles ... probablement?).La plus grande
y
valeur que je puisse fournir et calculer sans que Python ne génère d'erreur est 2, ce qui est déjà suffisant pour réduire une entrée de max-float en renvoyant 1.Une chaîne de longueur 7.625.597.484.987 est trop grand:
OverflowError: cannot fit 'long' into an index-sized integer
.Je devrais m'arrêter.
Eschew
Math.log
: Aller à la racine (10e) (du problème), Score: fonction effectivement indiscernable de y = 1.L'importation de la bibliothèque mathématique limite le nombre d'octets. Supprimons cela et remplaçons la
log(x)
fonction par quelque chose à peu près équivalent:x**.1
et qui coûte environ le même nombre de caractères, mais ne nécessite pas l'importation. Les deux fonctions ont une sortie sublinéaire par rapport à l'entrée, mais x 0,1 croît encore plus lentement . Cependant, nous ne nous soucions pas beaucoup, nous nous soucions seulement du fait qu'il a le même schéma de croissance de base en ce qui concerne les grands nombres tout en consommant un nombre comparable de caractères (par exemple,x**.9
est le même nombre de caractères, mais croît plus rapidement, donc il est une valeur qui présenterait exactement la même croissance).Maintenant, que faire avec 16 caractères. Que diriez-vous ... d'étendre notre fonction lambda pour avoir des propriétés de séquence Ackermann? Cette réponse pour un grand nombre a inspiré cette solution.
La
z**z
partie ici m'empêche d'exécuter cette fonction avec n'importe où près d'entrées saines poury
etz
, les plus grandes valeurs que je peux utiliser sont 9 et 3 pour lesquelles je récupère la valeur de 1,0, même pour les plus grands supports flottants Python (note: tandis que 1.0 est numériquement supérieur à 6,77538853089e-05, l'augmentation des niveaux de récursivité rapproche la sortie de cette fonction de 1, tout en restant supérieure à 1, tandis que la fonction précédente rapprochait les valeurs de 0 tout en restant supérieure à 0, donc même une récursion modérée sur cette fonction entraîne tellement d'opérations que le nombre à virgule flottante perd tous les bits significatifs).Reconfiguration de l'appel lambda d'origine pour avoir des valeurs de récursivité de 0 et 2 ...
Si la comparaison est faite à "décalage de 0" au lieu de "décalage de 1", cette fonction retourne
7.1e-9
, ce qui est nettement inférieur à6.7e-05
.La récursion de base du programme réel (valeur z) est profonde de 10 10 10 10 1,97 , dès que y s'épuise, il est réinitialisé avec 10 10 10 10 10 1,97 (ce qui explique pourquoi une valeur initiale de 9 est suffisante), donc je ne ne sais même pas comment calculer correctement le nombre total de récursions qui se produisent: j'ai atteint la fin de mes connaissances mathématiques. De même je ne sais pas si déplacer une des
**n
exponentiations de l'entrée initiale vers le secondairez**z
améliorerait ou non le nombre de récursions (idem inverse).Permet d'aller encore plus lentement avec encore plus de récursivité
n//1
- enregistre 2 octets de plusint(n)
import math
,math.
enregistre 1 octet de plusfrom math import*
a(...)
enregistre 8 octets au total surm(m,...)
(y>0)*x
enregistre un octet sury>0and x
9**9**99
augmente le nombre d'octets de 4 et augmente la profondeur de récursivité approximativement2.8 * 10^x
où sex
trouve l'ancienne profondeur (ou une profondeur proche d'un googolplex de taille: 10 10 94 ).9**9**9e9
augmente le nombre d'octets de 5 et augmente la profondeur de récursivité de ... une quantité folle. La profondeur de récursivité est maintenant de 10 10 10 9,93 , pour référence, un googolplex est de 10 10 10 2 .m(m(...))
pour lesa(a(a(...)))
coûts 7 octetsNouvelle valeur de sortie (à 9 profondeurs de récursivité):
La profondeur de récursivité a explosé au point où ce résultat est littéralement dénué de sens, sauf en comparaison avec les résultats précédents utilisant les mêmes valeurs d'entrée:
log
25 foisLambda Inception, score: ???
Je t'ai entendu comme des lambdas, alors ...
Je ne peux même pas exécuter cela, j'empile le débordement même avec seulement 99 couches de récursivité.
L'ancienne méthode (ci-dessous) renvoie (en ignorant la conversion en un entier):
La nouvelle méthode revient, en utilisant seulement 9 couches d'incursion (plutôt que le googol complet ):
Je pense que cela a une complexité similaire à la séquence Ackerman, seulement petite au lieu de grande.
Merci aussi à ETHproductions pour une économie de 3 octets dans des espaces que je ne pensais pas pouvoir supprimer.
Ancienne réponse:
La troncature entière du journal de fonction (i + 1) a été répétée
20 à25 fois (Python) en utilisant des lambdas lambda.La réponse de PyRulez peut être compressée en introduisant un deuxième lambda et en l'empilant:
99100 caractères utilisés.Cela produit une itération de
2025, au-dessus de l'original 12. En outre, il enregistre 2 caractères en utilisantint()
au lieu defloor()
ce qui permettait unex()
pile supplémentaire .Si les espaces après le lambda peuvent être supprimés (je ne peux pas vérifier pour le moment), un 5èmePossible!y()
peut être ajouté.S'il existe un moyen d'ignorer l'
from math
importation en utilisant un nom complet (par exemplex=lambda i: math.log(i+1))
), cela économiserait encore plus de caractères et permettrait une autre pile dex()
mais je ne sais pas si Python prend en charge de telles choses (je ne le pense pas). Terminé!C'est essentiellement la même astuce que celle utilisée dans le blog de XCKD sur les grands nombres , mais la surcharge de déclaration des lambdas empêche une troisième pile:
Il s'agit de la plus petite récursivité possible avec 3 lambdas qui dépasse la hauteur de pile calculée de 2 lambdas (la réduction de tout lambda à deux appels fait chuter la hauteur de pile à 18, en dessous de celle de la version 2-lambda), mais nécessite malheureusement 110 caractères.
la source
int
conversion et j'ai pensé que j'avais quelques pièces de rechange.import
et l'espace aprèsy<0
. Je ne connais pas beaucoup Python, donc je ne suis pas certainy<0and x or m(m,m(m,log(x+1),y-1),y-1)
pour enregistrer un autre octet (en supposant que cex
n'est jamais0
quandy<0
)log(x)
croît plus lentement que n'importe quelle puissance positive dex
(pour les grandes valeurs dex
), et ce n'est pas difficile à montrer en utilisant la règle de L'Hopital. Je suis presque sûr que votre version actuelle fait(...(((x**.1)**.1)**.1)** ...)
tout un tas de fois. Mais ces pouvoirs se multiplient, c'est donc effectivementx**(.1** (whole bunch))
, ce qui est un (très petit) pouvoir positif dex
. Cela signifie qu'elle se développe en fait plus rapidement qu'une seule itération de la fonction de journal (bien que, d'accord, vous devriez regarder de TRÈS grandes valeursx
avant de le remarquer ... mais c'est ce que nous entendons par "aller à l'infini" ).Haskell , 100 octets
Essayez-le en ligne!
Cette solution ne prend pas l'inverse d'une fonction à croissance rapide au lieu de cela, elle prend une fonction à croissance plutôt lente, dans ce cas
length.show
, et l'applique plusieurs fois.Nous définissons d'abord une fonction
f
.f
est une version bâtarde de la notation ascendante de Knuth qui croît légèrement plus vite (c'est un peu un euphémisme, mais les chiffres auxquels nous avons affaire sont si grands que dans le grand schéma des choses ...). Nous définissons le cas de base def 0 a b
êtrea^b
oua
à la puissance deb
. Nous définissons ensuite le cas général à(f$c-1)
appliquer auxb+2
instances dea
. Si nous définissions une notation de type ascendant Knuth comme construction, nous l'appliquerions auxb
instances dea
, maisb+2
est en fait plus golfeur et a l'avantage d'être plus rapide.Nous définissons ensuite l'opérateur
#
.a#b
est défini pour êtrelength.show
appliqué auxb
a
temps. Chaque application delength.show
est approximativement égale à log 10 , ce qui n'est pas une fonction à croissance très rapide.Nous allons ensuite définir notre fonction
g
qui prend et entier et appliquelength.show
à l'entier un tas de fois. Pour être précis, il s'appliquelength.show
à l'entréef(f 9 9 9)9 9
. Avant d'entrer dans sa taille, regardonsf 9 9 9
.f 9 9 9
est supérieur à9↑↑↑↑↑↑↑↑↑9
(neuf flèches), par une marge massive. Je pense que c'est quelque part entre9↑↑↑↑↑↑↑↑↑9
(neuf flèches) et9↑↑↑↑↑↑↑↑↑↑9
(dix flèches). Maintenant, c'est un nombre incroyablement grand, bien trop grand pour être stocké sur n'importe quel ordinateur existant (en notation binaire). Nous prenons ensuite cela et le mettons comme premier argument de notref
qui signifie que notre valeur est plus grande9↑↑↑↑↑↑...↑↑↑↑↑↑9
qu'avecf 9 9 9
flèches entre les deux. Je ne vais pas décrire ce nombre parce qu'il est si grand que je ne pense pas pouvoir lui rendre justice.Chacun
length.show
est approximativement égal à prendre la base de log 10 de l'entier. Cela signifie que la plupart des nombres renverront 1 lorsqu'ils leur serontf
appliqués. Le plus petit nombre pour renvoyer autre chose que 1 est10↑↑(f(f 9 9 9)9 9)
, ce qui renvoie 2. Pensons-y un instant. Aussi abominablement grand que ce nombre que nous avons défini plus haut, le plus petit nombre qui renvoie 2 est 10 à sa propre puissance autant de fois. C'est 1 suivi de10↑(f(f 9 9 9)9 9)
zéros.Pour le cas général de
n
la plus petite entrée en sortie, tout n donné doit être(10↑(n-1))↑↑(f(f 9 9 9)9 9)
.Notez que ce programme nécessite énormément de temps et de mémoire même pour les petits n (plus qu'il n'y en a plusieurs fois dans l'univers), si vous voulez tester cela, je suggère de le remplacer
f(f 9 9 9)9 9
par un nombre beaucoup plus petit, essayez 1 ou 2 si vous le souhaitez jamais obtenir une sortie autre que 1.la source
APL, Appliquer
log(n + 1)
,e^9^9...^9
fois, où la longueur de la chaîne este^9^9...^9
de la longueur de la chaîne moins 1 fois, et ainsi de suite.la source
e^n^n...^n
pièce alors je l'ai transformée en constante, mais cela pourrait être vraiMATL , 42 octets
Essayez-le en ligne!
Ce programme est basé sur la série harmonique avec l'utilisation de la constante d'Euler – Mascheroni. Alors que je lisais la documentation de @LuisMendo sur son langage MATL (avec des majuscules, donc ça a l'air important) j'ai remarqué cette constante. L'expression de la fonction de croissance lente est la suivante:
où εk ~ 1 / 2k
J'ai testé jusqu'à 10000 itérations (dans Matlab, car il est trop grand pour TIO) et son score est inférieur à 10, donc c'est très lent.
Explications:
Preuve empirique: (ln k ) + 1 en rouge toujours au-dessus de ln k + γ + εk en bleu.
Le programme pour (ln k ) + 1 a été réalisé en
Matlab,
471814 octetsIl est intéressant de noter que le temps écoulé pour n = 100 est 0,208693s sur mon ordinateur portable, mais seulement 0,121945s avec
d=rand(1,n);A=d*0;
et encore moins, 0,112147s avecA=zeros(1,n)
. Si les zéros sont une perte d'espace, cela fait gagner de la vitesse! Mais je m'éloigne du sujet (probablement très lentement).Edit: merci à Stewie pour
avoir aidé àréduire cette expression Matlab à, simplement:la source
n=input('');A=log(1:n)+1
, ou comme une fonction anonyme sans nom (14 octets):@(n)log(1:n)+1
. Je ne suis pas sûr de MATLAB, maisA=log(1:input(''))+1
travaille dans Octave ...n=input('');A=log(1:n)+1
fonctionne,@(n)log(1:n)+1
pas (en effet une fonction valide avec poignée dans Matlab, mais l'entrée n'est pas demandée),A=log(1:input(''))+1
fonctionne et peut être raccourcielog(1:input(''))+1
f=
n'est pas nécessaire de compter, car il est possible de simplement:@(n)log(1:n)+1
suivi parans(10)
pour obtenir les 10 premiers chiffres.Python 3 , 100 octets
Le plancher du journal des fonctions (i + 1) a été répété 99999999999999999999999999999999999 fois.
On peut utiliser des exposants pour rendre le nombre ci-dessus encore plus grand ...
Essayez-le en ligne!
la source
9**9**9**...**9**9e9
?Le plancher du journal des fonctions (i + 1) a été répété 14 fois (Python)
Je ne m'attends pas à ce que cela se passe très bien, mais j'ai pensé que c'était un bon début.
Exemples:
la source
int
au lieu defloor
, vous pouvez en intégrer un autrex(
e^e^e^e...^n
? Aussi, pourquoi y a-t-il un espace après le:
?x()
appel?Ruby, 100 octets, score -1 = f ω ω + 1 (n 2 )
Fondamentalement emprunté à mon plus grand nombre imprimable , voici mon programme:
Essayez-le en ligne
Calcule fondamentalement l'inverse de f ω ω + 1 (n 2 ) dans la hiérarchie à croissance rapide. Les premières valeurs sont
Et puis il continue de produire
2
pendant très longtemps. Mêmex[G] = 2
, oùG
est le numéro de Graham.la source
Mathematica, 99 octets
(en supposant que ± prend 1 octet)
Les 3 premières commandes définissent
x±y
à évaluerAckermann(y, x)
.Le résultat de la fonction est le nombre de fois
f(#)=#±#±#±#±#±#±#±#
qu'il faut appliquer à 1 avant que la valeur atteigne la valeur du paramètre. Au fur et à mesuref(#)=#±#±#±#±#±#±#±#
que (c'est-à-diref(#)=Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[#, #], #], #], #], #], #], #]
) croît très rapidement, la fonction se développe très lentement.la source
Clojure, 91 octets
Type de calcule le
sum 1/(n * log(n) * log(log(n)) * ...)
, que j'ai trouvé à partir d' ici . Mais la fonction a fini par 101 octets, j'ai donc dû abandonner le nombre explicite d'itérations, et à la place répéter tant que le nombre est supérieur à un. Exemples de sorties pour les entrées de10^i
:Je suppose que cette série modifiée diverge toujours, mais je sais maintenant comment le prouver.
la source
Javascript (ES6), 94 octets
Explication :
Id
fait référence àx => x
dans ce qui suit.Jetons d'abord un coup d'œil à:
p(Math.log)
est approximativement égal àlog*(x)
.p(p(Math.log))
est approximativement égal àlog**(x)
(nombre de fois que vous pouvez prendrelog*
jusqu'à ce que la valeur soit au plus 1).p(p(p(Math.log)))
est approximativement égal àlog***(x)
.La fonction Ackermann inverse
alpha(x)
est approximativement égale au nombre minimum de fois que vous devez composerp
jusqu'à ce que la valeur soit au plus 1.Si nous utilisons alors:
alors nous pouvons écrire
alpha = p(Id)(Math.log)
.C'est assez ennuyeux, cependant, augmentons donc le nombre de niveaux:
C'est comme la façon dont nous avons construit
alpha(x)
, sauf qu'au lieu de le fairelog**...**(x)
, nous le faisons maintenantalpha**...**(x)
.Mais pourquoi s'arrêter ici?
Si la fonction précédente est
f(x)~alpha**...**(x)
, celle-ci l'est maintenant~ f**...**(x)
. Nous faisons un niveau de plus pour obtenir notre solution finale.la source
p(p(x => x - 2))
est approximativement égal àlog**(x)
(nombre de fois que vous pouvez prendrelog*
jusqu'à ce que la valeur soit au plus 1)". Je ne comprends pas cette affirmation. Il me semble que celap(x => x - 2)
devrait être "le nombre de fois que vous pouvez soustraire2
jusqu'à ce que la valeur soit au plus 1". Autrement dit, p (x => x - 2) `devrait être la fonction" diviser par 2 ". Par conséquent, celap(p(x => x - 2))
devrait être "le nombre de fois que vous pouvez diviser par 2 jusqu'à ce que la valeur soit au plus 1" ... c'est-à-dire que ce devrait être lalog
fonction, paslog*
oulog**
. Peut-être que cela pourrait être clarifié?p = f => x => x < 2 ? 0 : 1 + p(p(f))(f(x))
, oùp
est passép(f)
comme dans les autres lignes, nonf
.