Inspirés par le glorieux Alex. Apprenez-nous un R de façon géniale, nous allons recréer humblement le "programme One True R" d'Alex, mais avec une touche différente.
Alex-style Addition fonctionne comme ceci: il a 90% de chance de simplement renvoyer la somme des deux nombres donnés et 10% de chance de faire récursivement Alex, en ajoutant le premier nombre et le second nombre + 1. Cela signifie que potentiellement , un ajout peut être désactivé de 1 ou plus.
Défi
Ecrivez un programme complet ou une fonction qui prend deux entiers et Alex les ajoute tels que définis. Vous pouvez supposer que votre programme n'empilera pas le débordement si votre langue n'a pas de récursion de la queue. (Notez que vous n'avez pas à l'implémenter de manière récursive, tant que les probabilités sont les mêmes.)
Implémentation de référence (Groovy)
int alexAdd(int a, int b) {
int i = new Random().nextInt(11);
if(i == 1) {
return alexAdd(a,b+1);
} else {
return a + b;
}
}
Classement
var QUESTION_ID=66522,OVERRIDE_USER=8478;function answersUrl(e){return"https://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"https://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+)(?=[^\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>
la source
Réponses:
Pyth, 8
Essayez-le en ligne
Cela utilise le second mode de Pyth sur réduire, qui recherche les entrées répétées puis se termine.
Explication
Si l'alex-add supplémentaire se produit, il sera exécuté à nouveau, mais sinon, il se fermera.
la source
Python 2, 55 octets
C'est une manière absolument bizarre de le faire.
La fonction
random
donne un float dans [0,1) et sa représentation sous forme de chaîne comporte par défaut 16 chiffres après le point décimal, pour un total de 18 caractères. Mais, étant donné que les derniers 0 sont omis, il pourrait être plus court. En lisant les chiffres à partir de la fin, chacun a 1/10 de chance d’être 0 et nous nous arrêtons lorsque nous atteignons un chiffre différent de zéro. Ainsi, le nombre de zéros à la fin est distribué comme le nombre de récursions effectuées par Alex. Nous pouvons ainsi échantillonner cette distribution de 18 moins la longueur de la chaîne.En fait, Python affichera plus de 18 chiffres pour les petits nombres, parfois même en notation scientifique, nous ajoutons donc 1 pour résoudre ce problème.
Cela ne donnera jamais plus de 15% de plus que la somme, mais ce n'est pas grave, car 10 ^ 15 équivaut beaucoup moins que le risque qu'un rayon cosmique perturbe le calcul .
la source
R,
604728 octetsC'est un objet fonction non nommé qui accepte deux nombres et renvoie un nombre. Il n'utilise pas de récursivité.
Comme xnor l'a souligné dans un commentaire, ce problème peut être considéré comme une simple addition de deux nombres plus une variable aléatoire géométrique avec une probabilité d'échec de 1/10.
Pourquoi est-ce vrai? Pensez-y en termes de récursion, comme décrit dans le post. À chaque itération, nous avons 10% de chances d’ajouter 1 et de récurrent, et 90% de quitter la fonction sans autre ajout. Chaque itération est son propre essai indépendant de Bernoulli avec les résultats "add 1, recurse" (échec) et "sortie" (succès). Ainsi, la probabilité d'échec est de 1/10 et la probabilité de succès est de 9/10.
Lorsqu'il s'agit d'une série d'essais indépendants de Bernoulli, le nombre d'essais nécessaires pour obtenir un seul succès suit une distribution géométrique . Dans notre cas, chaque récursivité signifie l'ajout de 1; ainsi, lorsque nous quittons finalement la fonction, nous avons essentiellement compté le nombre d'échecs survenus avant le premier succès. Cela signifie que le résultat obtenu sera une variation aléatoire d'une distribution géométrique.
Ici, nous pouvons tirer parti de la vaste suite de solutions intégrées de distribution de probabilités et d'utilisation de R
rgeom
qui renvoie une valeur aléatoire à partir d'une distribution géométrique.Ungolfed:
la source
Minkolang 0.14 ,
191112 octetsCeci est la version "function"; il assume
a
etb
est déjà sur la pile, les supprime et pousse la version modifiée dea+b
. Le plus proche équivalent à des fonctions dans Minkolang est d'utiliserF
, qui se soulèveb
,a
et saute(a,b)
dans le codebox. Ensuite, lorsque le compteur de programme frappe unf
, il revient à l'endroit où il aF
été utilisé.Ceci est la version complète du programme, 15 octets . (
nn
prend deux nombres à partir de l’entrée etN.
sort le résultat et s’arrête.)J'ai volé l'algorithme de la réponse de Doorknob ; la boucle while se répète tant que le nombre aléatoire généré est inférieur à 0,1, en ajoutant 1 à chaque fois. Essayez-le ici (version complète du programme) et exécutez-le 100 fois ici .
Explication
La partie la plus intelligente est ici
d
. Le haut de la pile à ce moment-là sera 0 ou 1. Si c'est 0, la boucle while se termine. Sinon, ça continue. Au fur et à mesure que je duplique le haut de la pile, ce sera[a+b,1]
la deuxième fois dans la boucle.+
Le début ajoute le 1 (et de même pour les voyages suivants).la source
f
dans le nombre de caractères (et, techniquement, la nouvelle ligne précédente si vous vous sentez extra-pédant, mais je ne pense pas que ce soit nécessaire).CJam,
12 à11 octetsMerci à @ MartinBütter d'avoir enregistré un octet grâce à cette astuce super intelligente!
Ancienne réponse:
Essayez-le en ligne .
Explication:
L'algorithme de base est "while (0.1 chance), incrémente le nombre", ce qui élimine le besoin de récursivité.
la source
Javascript ES6, 38 octets
la source
f=(a,b)=>new Date%10<1?f(a,b+1):a+b
pour 35 octetsDate
horodatage ne sera pas précise, car si elle est évaluéetrue
, l'ajout se poursuit1
pendant la millième de seconde.f=(a,b)=>a+b-~~Math.log10(Math.random())
mais c'est 2 octets de plus.MATL ,
141312 octetsCeci est juste la méthode de la boucle, ajoutez les entrées (entrées en tant que
[a b]
), puis continuez à en ajouter une tandis qu'un nombre aléatoire uniforme entre 0 et 1 est inférieur à 0,1. Description complète ci-dessous:Décollé de 1 octet en modifiant les spécifications d'entrée (de
ii+
àis
).L'ancienne méthode reposait sur l'utilisation du journal en base 10 d'un nombre aléatoire compris entre 0 et 1 pour calculer le montant à ajouter
a+b
, mais cela ne fonctionnerait que jusqu'à 15 répétitions en raison de la précision de la virgule flottante.Dans ce code,
10,2$YlZo-
effectue le logarithme en base 10 du nombre aléatoire et arrondit à l'entier le plus proche.la source
ii+`10Yr1=tb+w]
:, pas encore jouée au golf.Codé binaire Golfical ,
3229 + 1 (-x
pavillon) = 30 octetsHexdump (édité manuellement pour corriger un bogue dans la partie image vers binaire du transpiler, qui a été corrigé depuis):
Ce codage peut être reconverti dans la représentation graphique d'origine à l'aide de l'utilitaire Encoder inclus ou exécuté directement à l'aide de l'
-x
indicateur.Image originale:
Magnifié 50x:
Explication: La rangée supérieure correspond au bloc principal. Il lit un numéro, le copie à droite, en lit un autre, les ajoute, copie le résultat à droite, effectue des opérations de RNG et, avec une probabilité de 90%, imprime le résultat de l'addition. Le reste du temps, il est envoyé à la ligne inférieure, où il en insère un dans la première cellule et revient à la ligne principale juste avant l'instruction d'addition (en utilisant un virage nord puis un virage est).
la source
Python,
66656463 octetsEssayez-le en ligne
Merci à Sherlock9 pour les corrections et l'octet enregistré.
Merci à Mathias Ettinger pour un autre octet.
Merci à mbomb007 pour un octet.
la source
.9>random()
n'est pas tout à fait 9 sur 10, à cause de la répartition inégale des flotteursJulia, 30 octets
C'est une fonction récursive
f
qui accepte deux nombres et retourne un nombre du même type. Cela devrait fonctionner correctement pour tout type numérique.Nous vérifions d’abord si un flottant aléatoire entre 0 et 1 est supérieur à 0,9. Si tel est le cas, nous ajoutons un petit quelque chose en plus, sinon nous ajoutons.
la source
TI-BASIC, 15 octets
Cela prend l'entrée sous forme de liste à deux éléments
Ans
. Bien qu'un nombre aléatoire soit inférieur à0.1
, il est ajouté à0.5
la liste vectorisé . L'augmentation de chaque élément0.5
augmente la somme de 1. Je pense que c'est la solution TI-BASIC la plus courte.Le programme de 9 octets
sum(Ans)-int(log(10rand
ne fonctionne pas, carrand
il n'a que 14 chiffres de précision et ne peut donc pas donner un nombre inférieur à 10 -14 .la source
APL, 17 octets
C'est une fonction dyadique sans nom.
Ungolfed:
la source
Pyth,
1412 octetsMon premier vrai golf Pyth!
Prend l'entrée sur STDIN dans le format
a,b
.Explication:
Merci à @FryAmTheEggman pour avoir rasé deux caractères en me donnant un moyen plus rapide d’incrémenter une variable!
la source
Vitsy ,
12 à10 octetsEssayez-le en ligne!
Notez que cela a un risque infime d’erreur de débordement de pile. Nous parlons
(.1)^400
chance. Il se termine également par erreur en raison de la façon dont j'ai provoqué la récursivité.la source
Lisp, 58 octets
Ma première fois en écrivant Lisp!
Vous pouvez utiliser cet ajout spécial exactement comme vous le feriez habituellement avec Lisp:
J'aimerais entendre des suggestions car je suis nouveau dans la langue.
la source
(- a(- -1 b))
travailler? Vous sauve 2 octets si c'est le cas.Sérieusement, 10 octets
Ce programme génère une variable aléatoire à partir d'une distribution géométrique en transformant une distribution uniforme. Il prend les entrées sous forme de liste:
[2,3]
(accolades facultatives). Essayez-le en ligne .Explication:
Étant donné une variable aléatoire
X ~ Uniform(0, 1)
, il peut être transformé en une variable aléatoireY ~ Geometric(p)
avec la formuleY = floor(log(X)/log(p))
.la source
Mathematica, 32 octets
Explication:
Notez que cette fonction fonctionne pour n’importe quel nombre d’entrées.
la source
TeaScript , 18 octets
21Ceci est une fonction TeaScript. Attribuez-le à une variable ou exécutez-le directement.
Essayez-le en ligne
la source
Candy , 11 octets
La forme longue est:
la source
C,
71513937 octetsPremier code-golf, fait en C ... Je ne pense pas que ça battra quoi que ce soit, et peut être beaucoup joué au golf
EDIT 3: coupé 2 octets grâce à @Mego, en écrivant .1 au lieu de 0.1 et en réécrivant l'opérateur ternaire
EDIT 2: 12 octets coupés, après gnu99, chaque variable est un entier si ce n’est pas indiqué autrement. Il en va de même pour le type de fonction de retour
EDIT: coupé 20 octets, oublié que les bases .h ne sont pas nécessaires en C99 (en utilisant gcc par exemple). Cela produira un avertissement :)
Solution de 71 octets:
Si vous voulez voir beaucoup de résultats, vous pouvez utiliser le code suivant
la source
MATL , 12
1314octetsLa saisie est de la forme
[3 4]
, c’est-à-dire un vecteur ligne avec les deux nombres.Exemple
Explication
Cela génère la variable aléatoire géométrique sans boucle, en appliquant directement une transformation à une variable aléatoire uniforme. Notez que log 0.1 a est utilisé à la place de log a / log 0.1 pour enregistrer 1 octet.
la source
Microscript ,
29 à21 octetsJ'ai essayé de répondre à Microscript II mais, pour une raison quelconque, la boucle d'addition ne fonctionnait pas correctement :(
la source
Mouse-2002 ,
413938 octetsPas de récursion.
A expliqué:
Ou, si vous êtes un fan de programmation fonctionnel, et que la récursivité est votre affaire, alors 57 octets :
A expliqué:
la source
Gelée , 7 octets (non concurrente)
Essayez-le en ligne!
Comment ça fonctionne
la source
APL (Dyalog Unicode) ,
13SBCS de 12 octetsFondamentalement identique à la solution Pyth de FryAmTheEggman . -1 merci à Erik l'Outgolfer.
Fonction infixe tacite anonyme.
Essayez-le en ligne!
+
ajouter les arguments{
…}⍣=
Applique la fonction suivante jusqu'à ce que deux applications successives donnent le même résultat:?10
nombre entier aléatoire compris entre 1 et 101=
est-ce qu'on est égal à ça? (ie 1 ⁄ 10 ème chance)⍵+
ajouter l'argument à celala source
/
.Perl 6 , 26 octets
En train de le faire récursivement:
Créez une séquence de
1
s éventuellement vide suivie des arguments, puis additionnez-les.(il peut en réalité prendre n'importe quel nombre d'arguments)
usage:
la source
Pyth, 11 octets
Un port Pyth direct de ma réponse Python .
la source
Octave, 20 octets
Somme des entrées, plus un échantillon aléatoire de la distribution géométrique avec paramètre
0.9
.la source
Sérieusement, 13 octets
Utilise une stratégie similaire à la réponse CJam de Doorknob (numéro d’incrément lorsque float aléatoire est inférieur à 0,1), sauf qu’il utilise des entiers et s’incrémente tandis que nombre entier aléatoire
[0,9]
est inférieur à 1. Le manque de récursion facile fait mal.Essayez-le en ligne (nécessite une saisie manuelle)
Explication:
La boucle while laisse la pile comme ceci:
Déplacer
n
vers le haut de 1 est nécessaire pour obtenir la boucle while à exécuter, car0
est falsey. Il est facile à gérer en décrémentantn
après la boucle while, le résultat final est donca + b + (n - 1)
.la source
MATLAB, 51 octets
Le résultat est trouvé dans la variable automatique 'ans'
la source