Inspiriert von Alex 'ruhmreichem Lerne dir ein R für großartiges Wohl, wir werden demütig Alex' "ein wahres R-Programm" nachbilden - aber mit einer Wendung.
Die Alex-Addition funktioniert wie folgt: Sie hat eine Chance von 90%, einfach die Summe der beiden angegebenen Zahlen zurückzugeben, und eine Chance von 10%, Alex rekursiv die erste Zahl und die zweite Zahl + 1 hinzuzufügen. Dies bedeutet möglicherweise, dass kann eine Addition um 1 oder mehr verschoben sein.
Herausforderung
Schreiben Sie ein vollständiges Programm oder eine vollständige Funktion, die zwei Ganzzahlen enthält, und Alex fügt sie wie definiert hinzu. Sie können davon ausgehen, dass Ihr Programm nicht überläuft, wenn Ihre Sprache keine Endrekursion aufweist. (Beachten Sie, dass Sie es nicht rekursiv implementieren müssen, solange die Wahrscheinlichkeiten gleich sind.)
Referenzimplementierung (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;
}
}
Probieren Sie diese Geige online.
Bestenliste
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>
quelle
Antworten:
Pyth, 8
Probieren Sie es online aus
Dies verwendet Pyths zweiten Modus beim Reduzieren, der nach wiederholten Eingaben sucht und dann beendet.
Erläuterung
Wenn das zusätzliche alex-add auftritt, wird es erneut ausgeführt, wenn nicht, wird es beendet.
quelle
Python 2, 55 Bytes
Dies ist eine absolut bizarre Methode.
Die Funktion
random
gibt einen Gleitkommawert in [0,1] an, und die Zeichenfolgendarstellung hat standardmäßig 16 Nachkommastellen für insgesamt 18 Zeichen. Da jedoch nachgestellte Nullen weggelassen werden, kann dies kürzer sein. Beim Ablesen der Ziffern vom Ende hat jede eine 1/10-Chance, 0 zu sein, und wir hören auf, wenn wir eine Ziffer ungleich Null treffen. Die Anzahl der nachgestellten Nullen ist also genauso verteilt wie die Anzahl der von Alex durchgeführten Rekursionen, sodass wir aus dieser Verteilung eine Stichprobe von 18 abzüglich der Stringlänge ziehen können.Tatsächlich zeigt Python mehr als 18 Stellen für kleine Zahlen an, manchmal sogar für wissenschaftliche Notationen. Deshalb fügen wir 1 hinzu, um dies zu beheben.
Dies gibt niemals mehr als 15 mehr als die Summe, aber das ist in Ordnung, da 10 ^ 15 viel weniger ist als die Wahrscheinlichkeit, dass ein kosmischer Strahl die Berechnung stört .
quelle
R
604728 BytesDies ist ein unbenanntes Funktionsobjekt, das zwei Zahlen akzeptiert und eine Zahl zurückgibt. Es wird keine Rekursion verwendet.
Wie xnor in einem Kommentar hervorhob, kann dieses Problem als einfaches Hinzufügen von zwei Zahlen plus einer geometrischen Zufallsvariablen mit einer Ausfallwahrscheinlichkeit von 1/10 angesehen werden.
Warum ist das so? Denken Sie an die Rekursion, wie in der Post beschrieben. In jeder Iteration haben wir eine 10% ige Chance, eine 1 zu addieren und eine 90% ige Chance, die Funktion ohne weitere Addition zu verlassen. Jede Iteration ist eine eigene unabhängige Bernoulli-Studie mit den Ergebnissen "Addiere 1, Rekurs" (Misserfolg) und "Exit" (Erfolg). Somit beträgt die Ausfallwahrscheinlichkeit 1/10 und die Erfolgswahrscheinlichkeit 9/10.
Bei einer Reihe unabhängiger Bernoulli-Versuche folgt die Anzahl der Versuche, die erforderlich sind, um einen einzelnen Erfolg zu erzielen, einer geometrischen Verteilung . In unserem Fall bedeutet jede Rekursion das Hinzufügen von 1. Wenn wir also die Funktion endgültig beenden, haben wir im Wesentlichen die Anzahl der Fehler gezählt, die vor dem ersten Erfolg aufgetreten sind. Das bedeutet, dass der Betrag, um den das Ergebnis verschoben wird, zufällig von einer geometrischen Verteilung abweicht.
Hier können wir Rs expansive Suite von eingebauten und verwendeten Wahrscheinlichkeitsverteilungen nutzen
rgeom
, die einen Zufallswert aus einer geometrischen Verteilung zurückgibt.Ungolfed:
quelle
Minkolang 0,14 ,
191112 BytesDies ist die "Funktions" -Version; es wird davon ausgegangen
a
undb
ist bereits auf dem Stapel, knallt sie ab und schiebt die modifizierte Versiona+b
. Die nächste äquivalente Funktionen zu in Minkolang zu bedienen istF
, die aus öffnetb
,a
und springt zu(a,b)
der codebox. Wenn dann der Programmzähler auf einen trifftf
, springt er zurück zu der Stelle, anF
der er benutzt wurde.Dies ist die Vollversion des Programms, 15 Bytes . (
nn
Nimmt zwei Zahlen von der Eingabe undN.
gibt das Ergebnis aus und stoppt.)Ich habe den Algorithmus aus Doorknobs Antwort gestohlen . Die while-Schleife wird wiederholt, solange die generierte Zufallszahl kleiner als 0,1 ist, wobei jedes Mal 1 addiert wird. Probieren Sie es hier aus (Vollversion) und führen Sie es hier 100 Mal aus .
Erläuterung
Der klügste Teil hier ist
d
. Die Spitze des Stapels zu diesem Zeitpunkt ist entweder 0 oder 1. Wenn sie 0 ist, wird die while-Schleife beendet. Ansonsten geht es weiter. Wenn ich den oberen Teil des Stapels dupliziere, wird[a+b,1]
die Schleife zum zweiten Mal durchlaufen, sodass+
am Anfang die 1 hinzugefügt wird (und ebenfalls für nachfolgende Trips).quelle
f
das Ende in die Char-Zählung einbeziehen (und technisch gesehen die vorangegangene Newline, wenn Sie sich extrapedant fühlen, aber ich denke nicht, dass dies notwendig ist).CJam,
1211 BytesVielen Dank an @ MartinBütter für das Speichern eines Bytes mit diesem super cleveren Trick!
Alte Antwort:
Probieren Sie es online aus .
Erläuterung:
Der grundlegende Algorithmus ist "while (0.1 chance), erhöhe die Zahl", wodurch die Notwendigkeit einer Rekursion entfällt.
quelle
Javascript ES6, 38 Bytes
quelle
f=(a,b)=>new Date%10<1?f(a,b+1):a+b
für 35 BytesDate
Zeitstempel verwendet wird, nicht genau, da er bei der Auswertung den Rest der Millisekunde langtrue
addiert1
.f=(a,b)=>a+b-~~Math.log10(Math.random())
aber sie ist 2 Byte länger.MATL ,
141312 BytesDies ist nur die Schleifenmethode.
[a b]
Addieren Sie die Eingänge (eingegeben als ) und addieren Sie dann einen, während eine einheitliche Zufallszahl zwischen 0 und 1 kleiner als 0,1 ist. Vollständige Beschreibung unten:1 Byte durch Ändern der Eingangsspezifikation (von
ii+
nachis
) entfernt.Die alte Methode basierte auf der Ermittlung des zu addierenden Betrags anhand des Basis-10-Protokolls einer Zufallszahl zwischen 0 und 1
a+b
, konnte jedoch aufgrund der Gleitkommagenauigkeit nur bis zu 15 Wiederholungen ausführen .Führt in diesem Code einen
10,2$YlZo-
Logarithmus zur Basis 10 der Zufallszahl aus und rundet auf die nächste Ganzzahl auf.quelle
ii+`10Yr1=tb+w]
Noch nicht Golf gespielt.Binary-Encoded Golfical ,
3229 + 1 (-x
Flag) = 30 BytesHexdump (manuell bearbeitet, um einen Fehler im Image-to-Binary-Teil des Transpilers zu korrigieren, der inzwischen behoben wurde):
Diese Codierung kann mit dem mitgelieferten Dienstprogramm Encoder wieder in die ursprüngliche grafische Darstellung konvertiert oder direkt mit dem
-x
Flag ausgeführt werden.Original Bild:
50x vergrößert:
Erläuterung: Die obere Reihe ist der Hauptblock. Es liest eine Zahl, kopiert sie nach rechts, liest eine andere Zahl, fügt sie hinzu, kopiert das Ergebnis nach rechts, erledigt einige RNG-Aufgaben und druckt mit einer Wahrscheinlichkeit von 90% das Ergebnis der Addition. In der restlichen Zeit wird es in die unterste Reihe gesendet, wo es eine Eins in die erste Zelle setzt und kurz vor der Additionsanweisung in die Hauptreihe zurückkehrt (mit einer Nordkurve und einer Ostkurve).
quelle
Python,
66656463 BytesProbieren Sie es online aus
Vielen Dank an Sherlock9 für die Korrekturen und das Byte gespeichert.
Vielen Dank an Mathias Ettinger für ein weiteres Byte.
Danke an mbomb007 für ein Byte.
quelle
.9>random()
ist wegen der ungleichmäßigen Verteilung der Floats nicht ganz 9-aus-10Julia, 30 Bytes
Dies ist eine rekursive Funktion
f
, die zwei Zahlen akzeptiert und eine Zahl desselben Typs zurückgibt. Es sollte für jeden numerischen Typ gut funktionieren.Zuerst prüfen wir, ob ein zufälliger Float zwischen 0 und 1 größer als 0,9 ist. Wenn ja, greifen wir auf ein bisschen mehr zurück, sonst fügen wir nur noch hinzu.
quelle
TI-BASIC, 15 Bytes
Damit wird die Eingabe als Liste mit zwei Elementen übernommen
Ans
. Während eine Zufallszahl kleiner als ist0.1
, wird0.5
die Liste vektorisiert ergänzt . Durch Erhöhen jedes Elements0.5
um wird die Summe um 1 erhöht. Ich glaube, dies ist die kürzeste TI-BASIC-Lösung.Das 9-Byte-Programm
sum(Ans)-int(log(10rand
funktioniert nicht, da esrand
nur eine Genauigkeit von 14 Stellen hat und daher keine Zahl unter 10-14 geben kann .quelle
APL, 17 Bytes
Dies ist eine unbenannte dyadische Funktion.
Ungolfed:
quelle
Pyth,
1412 BytesMein erstes richtiges Pythgolf!
Übernimmt die Eingabe für STDIN im Format
a,b
.Erläuterung:
Vielen Dank an @FryAmTheEggman, der mir die Möglichkeit gegeben hat, eine Variable auf kürzere Weise zu inkrementieren.
quelle
Vitsy ,
1210 BytesProbieren Sie es online!
Beachten Sie, dass das Risiko eines Stapelüberlauffehlers sehr gering ist. Wir reden über
(.1)^400
Zufall. Es wird auch durch einen Fehler beendet, der darauf zurückzuführen ist, dass ich eine Rekursion verursacht habe.quelle
Lisp, 58 Bytes
Das erste Mal, dass ich Lisp schreibe!
Sie können diesen speziellen Zusatz genau so verwenden, wie Sie ihn normalerweise in Lisp hinzufügen würden:
Ich würde gerne Vorschläge hören, da ich brandneu in der Sprache bin.
quelle
(- a(- -1 b))
funktionieren Speichert Sie 2 Bytes, wenn es tut.Im Ernst, 10 Bytes
Dieses Programm generiert eine Zufallsvariable aus einer geometrischen Verteilung, indem es eine gleichmäßige Verteilung transformiert. Die Eingabe erfolgt als Liste:
[2,3]
(geschweifte Klammern optional). Probieren Sie es online aus .Erläuterung:
Bei einer Zufallsvariablen
X ~ Uniform(0, 1)
kann dieseY ~ Geometric(p)
mit der Formel in eine Zufallsvariable umgewandelt werdenY = floor(log(X)/log(p))
.quelle
Mathematica, 32 Bytes
Erläuterung:
Beachten Sie, dass diese Funktion für eine beliebige Anzahl von Eingängen funktioniert.
quelle
TeaScript , 18 Bytes
21Dies ist eine TeaScript-Funktion. Weisen Sie es einer Variablen zu oder führen Sie es direkt aus.
Probieren Sie es online aus
quelle
Süßigkeit , 11 Bytes
Die lange Form ist:
quelle
C
71513937 BytesErste Code-Golf, in C gemacht ... Ich glaube nicht, dass es irgendetwas schlagen wird, und kann viel Golf gespielt werden
EDIT 3: 2 Bytes dank @Mego gekürzt, indem .1 anstelle von 0.1 geschrieben und der ternäre Operator neu geschrieben wurde
EDIT 2: 12 Bytes nach gnu99, jede Variable ist ein Int, wenn nicht anders angegeben. Gleiches gilt für den Rückgabetyp der Funktion
BEARBEITEN: 20 Bytes gekürzt, vergessen, dass grundlegende .h in C99 nicht erforderlich sind (zum Beispiel mit gcc). Es wird eine Warnung geben :)
71 Bytes Lösung:
Wenn Sie viele Ausgaben sehen möchten, können Sie den folgenden Code verwenden
quelle
MATL , 12
1314BytesDie Eingabe hat die Form
[3 4]
eines Zeilenvektors mit den beiden Zahlen.Beispiel
Erläuterung
Dies erzeugt die geometrische Zufallsvariable ohne Schleifen, indem eine Transformation direkt auf eine einheitliche Zufallsvariable angewendet wird. Beachten Sie, dass log 0.1 a anstelle von log a / log 0.1 verwendet wird, um 1 Byte zu sparen.
quelle
Microscript ,
2921 BytesIch habe versucht, eine Microscript II-Antwort zu erstellen, aber aus irgendeinem Grund konnte die Additionsschleife nicht richtig funktionieren :(
quelle
Mouse-2002 ,
413938 BytesKeine Rekursion.
Erklärt:
Oder, wenn Sie ein Fan der funktionalen Programmierung sind und Rekursion Ihr Geschäft ist, dann 57 Bytes :
Erklärt:
quelle
Jelly , 7 Bytes (nicht konkurrierend)
Probieren Sie es online!
Wie es funktioniert
quelle
APL (Dyalog Unicode) ,
1312 Bytes SBCSGrundsätzlich das gleiche wie die Pyth-Lösung von FryAmTheEggman . -1 Danke an Erik den Outgolfer.
Anonyme stillschweigende Infix-Funktion.
Probieren Sie es online!
+
Fügen Sie die Argumente hinzu{
...}⍣=
gilt die folgende Funktion , bis zwei aufeinanderfolgende Anwendungen das gleiche Ergebnis:?10
zufällige ganze Zahl im Bereich von 1 bis 101=
ist man dem gleich? (dh 1 / 10 th Chance)⍵+
Fügen Sie das Argument hinzuquelle
/
.Perl 6 , 26 Bytes
Eigentlich rekursiv:
Erstellen Sie eine möglicherweise leere Folge von
1
s, gefolgt von den Argumenten, und addieren Sie sie dann alle.(es kann tatsächlich eine beliebige Anzahl von Argumenten annehmen)
Verwendungszweck:
quelle
Pyth, 11 Bytes
Ein direkter Pyth-Port meiner Python-Antwort .
quelle
Oktave, 20 Bytes
Summe der Eingaben plus Zufallsstichprobe aus der geometrischen Verteilung mit Parameter
0.9
.quelle
Im Ernst, 13 Bytes
Verwendet eine ähnliche Strategie wie Doorknobs CJam-Antwort (Inkrementzahl bei einem zufälligen Float von weniger als 0,1), außer dass Ganzzahlen verwendet werden und Inkremente bei einem zufälligen Integer von
[0,9]
weniger als 1. Das Fehlen einer einfachen Rekursion schadet.Online ausprobieren (manuelle Eingabe erforderlich)
Erläuterung:
Die while-Schleife verlässt den Stapel folgendermaßen:
Eine Verschiebung
n
um 1 ist notwendig, um die while-Schleife zum Laufen zu bringen, da dies0
falsch ist. Es kann leicht durch Dekrementierenn
nach der while-Schleife behoben werden. Das Endergebnis ist alsoa + b + (n - 1)
.quelle
MATLAB, 51 Bytes
Das Ergebnis wird in der automatischen Variablen 'ans' gefunden
quelle