var QUESTION_ID=83873,OVERRIDE_USER=48934;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+(?:\.\d+)?)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Réponses:
Calcul lambda binaire , 114 bits = 14,25 octets
Hexdump:
Binaire:
Explication
C'est (λ x . (Λ y . X y (λ m . M (λ g . Λ n . N g 1) (λ n . Λ f . X ( n f )) x ) y ) (λ f . Λ z . f ( x f z ))) 3, où tous les nombres sont représentés par des chiffres d'église. Chiffres Eglise sont la représentation standard de calcul lambda des nombres naturels, et ils sont bien adaptés à ce problème , car un certain nombre Eglise est définie par la fonction itération: n g est la n ième itérer de la fonction g .
Par exemple, si g est la fonction λ n . λ f . 3 ( n f ) qui multiplie 3 par un chiffre d'église, puis λ n . n g 1 est la fonction qui prend 3 au pouvoir d'un chiffre d'église. Itérer cette opération m fois donne
m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) n = u (3, n , m ).
(Nous utilisons la multiplication u (-, -, 0) plutôt que l'exponentiation u (-, -, 1) comme cas de base, car soustraire 1 à un chiffre d'église est désagréable .)
Suppléant n = 3:
m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) 3 = u (3, 3, m ).
Itérant cette opération 64 fois, à partir de m = 4, donne
64 (λ m . M (λ g . Λ n . N g 1) (λ n . Λ f . 3 ( n f )) 3) 4 = G .
Pour optimiser cette expression, remplacez 64 = 4 ^ 3 = 3 4:
3 4 (λ m . M (λ g . Λ n . N g 1) (λ n . Λ f . 3 ( n f )) 3) 4 = G .
Rappelez-vous 4 = succ 3 = λ f . λ z . f (3 f z ) comme argument lambda:
(λ y . 3 y (λ m . m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) 3) y ) (λ f . λ z . f (3 f z )) = G .
Enfin, rappelez-vous 3 = λ f . λ z . f ( f ( f z )) en tant qu'argument lambda:
(λ x . (λ y . x y (λ m . m (λ g . λ n . n g 1) (λ n . λ f . x ( n f )) x ) y ) (λ f . λ z . f ( x f z ))) 3 = G .
la source
14.25 bytes
semble déconner le classement. Il est analysé comme25 bytes
, et vous êtes donc placé en deuxième position.Haskell, 41 octets
Explication:
(`i`1)f n
=i f 1 n
calcule l'n
itération de la fonction àf
partir de1
. En particulier,(`i`1)(*3)n
= 3 ^ n , et itérer cette construction m fois donnei(`i`1)(*3)m n
= u (3, n , m ). Nous pouvons réécrire cela comme(($n).i(`i`1)(*3))m
= u (3, n , m ) et itérer cette construction k fois pour obteniri(($3).i(`i`1)(*3))4 k
= g _ k .la source
Haskell, 43 octets
Il y a une meilleure façon de retourner en
g
ligne.46 octets:
48 octets:
Il suffit d'écrire les définitions.
Les cas de base sont un peu plus propres, ils sont sauvegardés à 0, bien que cela ne sauvegarde aucun octet. Peut-être que cela facilitera l’écriture d’une autre définition.
la source
+
celle qui permet de supprimer les parenthèsesm-1
?(`g`3)
, pas(3`g`)
.Pyth, 25 octets
La première partie
M?H.UgbtH*G]3^3G
définit une méthodeg(G,H) = u(3,G,H+1)
.Pour tester la première partie, vérifier que
7625597484987=u(3,3,2)=g(3,1)
:g3 1
.La deuxième partie
ug3tG64 4
commencer0 = 4
et calcule ensuitern = u(3,3,r(n-1)) = g(3,r(n-1))
64 fois, en fournissant la valeur finale (àr
choisir au lieu deg
pour éviter toute confusion).Pour tester cette partie, recommencez à partir
r0=2
, puis calculerr1
:ug3tG1 2
.la source
^3
↦*3
,tG
↦G
), et un autre octet avec.UgbtH*G]3
↦e.ugNtHG1
.*G]3
↦ShG
.Sesos , 30 octets
Démonté
Ou en notation Brainfuck:
Essai
Pour calculer u (3, n , u (3, n , ... u (3, n , m ) ...)) avec k appels imbriqués pour u , remplacer les trois premières
add
instructionsadd 4
,add 64
,add 3
avecadd m
,add k
,add n
, respectivement. Comme Sesos ne peut pas construire de nombres plus rapidement qu'en temps linéaire, vous êtes pratiquement limité à de petites valeurs telles que u (3, 2, 2) = 27, u (3, 5, 1) = 243 et u (3, 1 , u (3, 1,… u (3, 1, m )…)) = 3.la source
[-]
par,
puisque EOF est0
.JavaScript (ES7), 63 octets
la source
Brachylog , 57 octets
N'attend ni entrée ni sortie et écrit le résultat dans
STDOUT
. Cela produira un débordement de pile à un moment donné.Pour vérifier que cela fonctionne pour de petites valeurs (par exemple
u(3,3,2)
), vous pouvez remplacer le4
avec la valeur dem
et64
par1
.Explication
Il s’agit d’une simple implémentation de la manière expliquée de calculer le nombre.
Prédicat principal:
Prédicat 1:
Prédicat 2:
la source
Caramel , 38 octets
C'est le sucre syntaxique pour l'expression du lambda calcul 64 (λ m . M (λ f . Λ n . N f 1) (λ n . Λ f . 3 ( n f )) 3) 4, où tous les nombres sont représentés par Church chiffres .
la source
(n f->3 (n f))
ne devrait-il pas liren-1
?(n f->3 (n f))
est une fonction permettant la multiplication par trois en chiffres d'église .Prolog (SWIPL), 129/137 octets
Pour sortir le numéro de Graham, interrogez pour
g(64,G).
(si les 8 octets de cette requête doivent être comptés, la longueur est de 137 octets):Mais comme on peut s'y attendre, cela manque de pile.
Tester
Le retour en arrière provoque son épuisement:
Ungolfed
La version non golfée ajoute la notation générale de la flèche vers le haut, pas seulement pour 3, et utilise des coupes et des contrôles pour éviter les retours en arrière et les situations non définies.
la source
64
n'importe où dans votre code?C, 161 octets
EDIT: enregistré 11 octets en supprimant les onglets et les nouvelles lignes. EDIT: thx auhmann a sauvegardé un autre octet et corrigé mon programme
la source
g(int a){if(a==1)return u(3,4);return g(a-1);}
car il n'est pas utilisé du tout ... Ou est-ce que vous oubliez quelque chose?return g(a-1)
devrait êtrereturn u(3,g(a-1))
.u(a,b){return a<2?3:b<2?pow(3,a):u(u(a-1,b),b-1);}g(a){return a<2?u(3,4):u(3,g(a-1));}main(){printf("%d",g(64));}
Mathematica, 59 octets
Utilise un opérateur infixe non défini
±
qui ne requiert qu'un octet lorsqu'il est codé selon ISO 8859-1. Voir le post de @ Martin pour plus d'informations. Les fonctions Mathematica prennent en charge la correspondance des modèles pour leurs arguments, de sorte que les deux cas de base peuvent être définis séparément.la source
n_ ±m_:=Nest[#±(m-1)&,3,n]
C,
114109 octetsSur la base de la réponse de @thepiercingarrow ( lien ), j'ai joué au golf la réponse un peu. La plupart des économies sont dues à l'abus de typage par défaut des arguments lors de l'exécution de fonctions de style K & R et au remplacement des instructions if par des opérateurs ternaires. Ajout de sauts de ligne optionnels entre les fonctions pour plus de lisibilité.
Amélioré à 109 grâce à @LeakyNun.
la source
g(a){return u(3,a<2?4:g(a-1));}
Python, 85 octets
La
v
fonction définit la même fonction que celle trouvée dans la réponse de Dennis :v(n,m) = u(3,n+1,m+1)
. Lag
fonction est une version zéro indexée de l'itération traditionnelle:g(0) = v(2,3), g(n) = v(2,g(n-1))
. Ainsi,g(63)
est le numéro de Graham. En définissant la valeur par défaut dun
paramètre de lag
fonction sur63
, la sortie requise peut être obtenue en appelantg()
(sans paramètre), ce qui répond à nos exigences en matière de soumission de fonction sans entrée.Vérifiez les cas
v(2,1) = u(3,3,2)
et lesv(4,0) = u(3,5,1)
tests en ligne: Python 2 , Python 3la source
g
semble éteinte. Ne devrait pasv(2,n-1)
êtreg(n-1)
ou quelque chose de similaire?u
etv
signifie que cela devrait êtreg(n-1)-1
.Dyalog APL, 41 octets
Cas de test:
la source
1=⍺:3⋄1=⍵:3*⍺
en just1=⍵:3*⍺
(3=3*1
)Ruby, 64 octets
Emprunter à un algorithme théorique pour calculer le nombre de Graham .
En termes simples,
f a = u(3,3,a)
et cela s'applique 64 fois.la source
J, 107 octets
Je travaille à la conversion
u
en agenda, mais pour le moment, ça ira.la source
u=:3^[`[:(3$:])/[#<:@]@.*@]
(non testé)F #,
111108 octetsmodifier
Ceci utilise la fonction ci-dessous pour calculer le numéro de Graham
Voici ma réponse précédente qui, bien, n'a pas:
Assez simple. Juste une définition de la
u
fonction.Usage:
Si je supposais 3 comme valeur pour a, je pourrais le réduire à 60:
Usage:
la source
u
. Vous pouvez bien sûr inclure toutes les fonctions intermédiaires dont vous avez besoin, commeu
avec ou sans son premier argument fixé à 3.R,
154142128126118 octetsJ'ai utilisé la définition de cette fonction récursive dans Wikipédia parce que, pour une raison quelconque, la fonction suggérée ne fonctionnait pas ... ou que je craignais simplement de jouer au golf.
UPD: rasé 12 + 14 = 26 octets grâce à un conseil de Leaky Nun . La version précédente utilisait le volumineux et moins efficace
UPD: rasé 2 + 6 + 2 octets supplémentaires (encore une fois, félicitations à Leaky Nun ) en raison d’un remplacement ingénieux par «if (x)» au lieu de «if (x == 0)» car x <0 n’est jamais alimenté la fonction ... non?
la source
u
dans la même clé que votreg
et a enregistré 6 octets supplémentaires - génial!PHP, 114 octets
ignorer les sauts de ligne; ils sont pour la lisibilité seulement.
Il est possible d'intégrer le deuxième cas dans le premier: pour
n=1
,3^n
égal3
.Cela permettra d'économiser quelques octets sur - autant que je sache - toutes les réponses existantes; enregistré deux octets sur mon
version précédente, 62 + 43 + 11 = 116 octets
L'associativité de gauche du ternaire nécessite des parenthèses ... ou un ordre spécifique de tests.
Cela a sauvegardé deux octets sur l'expression entre parenthèses.
Il existe probablement une approche itérative, qui pourrait permettre de continuer à jouer au golf ...
mais je ne peux pas en prendre le temps maintenant.
la source