Bei einem gegebenen Eingang n
wo 3 <= n <= 25
, die folgenden Schritte aus , beginnend mit einem einzelnen n
-seitige Gesenk (Flächen im Bereich [1, n]
, inklusive):
- Drucken Sie das Ergebnis des
n
Würfelns der aktuellen Würfel im Spiel in der Form kdn: X
(wo X
ist das Ergebnis und k
ist die Anzahl der Würfel im Spiel).
- Wenn die Anzahl der Würfel
X
größer oder gleich n/2
der Anzahl der Würfel im Spiel ist, füge einen Würfel hinzu. Sonst entferne einen Würfel.
- Wenn die Anzahl der Würfel gleich
0
oder ist n
, halten Sie an. Fahren Sie andernfalls mit Schritt 1 fort.
Beispielläufe (beachten Sie, dass die Ausgabe in Klammern zur Erklärung dient und nicht erforderlich ist):
6-seitig:
1d6: 4 (avg: 3.0, add)
2d6: 6 (avg: 6.0, add)
3d6: 9 (avg: 9.0, add)
4d6: 16 (avg: 12.0, add)
5d6: 13 (avg: 15.0, remove)
4d6: 9 (avg: 12.0, remove)
3d6: 5 (avg: 9.0, remove)
2d6: 7 (avg: 6.0, add)
3d6: 11 (avg: 9.0, add)
4d6: 14 (avg: 12.0, add)
5d6: 17 (avg: 15.0, add)
9-seitig:
1d9: 7 (avg: 4.5, add)
2d9: 14 (avg: 9.0, add)
3d9: 18 (avg: 13.5, add)
4d9: 18 (avg: 18.0, add)
5d9: 28 (avg: 22.5, add)
6d9: 26 (avg: 27.0, remove)
5d9: 28 (avg: 22.5, add)
6d9: 34 (avg: 27.0, add)
7d9: 33 (avg: 31.5, add)
8d9: 30 (avg: 36.0, remove)
7d9: 29 (avg: 31.5, remove)
6d9: 35 (avg: 27.0, add)
7d9: 32 (avg: 31.5, add)
8d9: 42 (avg: 36.0, add)
Regeln
- Die Ausgaben müssen exakt im Format vorliegen
kdn: X
, wobei die einzelnen Rollen durch Zeilenumbrüche voneinander getrennt sein müssen
- Sie müssen tatsächlich das Würfeln mehrerer Würfel simulieren. Das einfache Zurückgeben einer zufälligen Ganzzahl im Bereich
[1, n]
(einschließlich) multipliziert mit der Anzahl der aktuell gespielten Würfel ist nicht zulässig, da dies das Werfen mehrerer Würfel nicht genau simuliert.
- Standardlücken sind verboten
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes
Bestenliste
Das Stapel-Snippet am Ende dieses Beitrags generiert die Rangliste aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamtrangliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><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="language-list"> <h2>Shortest Solution 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> <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> <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><script>var QUESTION_ID = 65904; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Antworten:
Pyth, 37 Bytes
Probieren Sie es online aus.
quelle
Mathematica,
958980 ZeichenUngolfed
quelle
Echo
kann leider keine reihenfolge von eingaben nehmen wie dasPrint
tut.PHP,
164121112113109 BytesEndgültige Version, das verspreche ich. Verbessert mit Titus Vorschlag:
BEARBEITEN: Zusätzliches Byte zur Formatierung hinzugefügt. Ich habe vergessen, dass es eine IF gibt, die dank dem Löschen des "add / sub" -Textes ein ternärer Operator sein könnte:
Die Ausgabe sieht jetzt so aus:
EDIT: Dank @Manatwork, hat mir viel gespart! Neue und verbesserte Version:
Vorheriger Eintrag:
Wirft separate Würfel, gibt Folgendes aus:
Und so heißt es:
d(6, 1);
Muss das Suffix
Add
und angegeben werdenSub
? Dies ist aus Ihrer Frage nicht ersichtlich.quelle
function d($x,$y=1){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x, $r↵";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}
$y-=$r/$y>$x/2?:-1
Python 3, 125
3 Bytes gespart dank DSM.
Ziemlich einfach, wirft ein paar Würfel und überprüft den Durchschnitt. Hier ist noch nichts Besonderes.
Es muss mit einem int aufgerufen werden. Also,
x(6)
wird so etwas produzieren:.
quelle
JavaScript (ES6), 97
102106112ByteVielen Dank an @ user81655 und @Jupotter, dass sie mir ein paar Bytes gespart haben.
Demo
Dies funktioniert nur in ES6-kompatiblen Browsern (derzeit einschließlich Firefox und Edge, möglicherweise mit Chrome und Opera mit aktivierten experimentellen JavaScript-Funktionen):
quelle
while
in einefor
Schleife ändern , mit|0
abrunden~~()
und stattdessen einige Anweisungen verschieben, um die Klammern zu entfernen und einige Bytes zu sparen. Du darfst es auch zu einer anonymen Funktion machen (neinf=
). 103 Bytes:n=>{for(k=1;k&&k!=n;k+=x<k*n/2?-1:1)for(x=i=0;i++<=k;console.log(k+`d${n}: `+x))x+=1+Math.random()*n|0}
console.log
in die anderefor
Schleife verschoben habe (kostet mich 1 Zeichen mehr als Ihre). Immer noch auf 106k&&k!=n
Bedingung durch den Vergleichk%n!=0
k%n
funktioniert noch besser;)CJam, 45 Bytes
Probieren Sie es online aus.
Implementiert die Spezifikation ziemlich wörtlich (einschließlich der mathematisch falschen "Mean Roll" -Formel). Wie erwartet, unten an CJam das Original GolfScript Programm portieren ein paar Bytes gespeichert durch kürzere integrierten Befehlsnamen (
mr
,o
undg
stattrand
,puts
unddo
).GolfScript, 51 Bytes
Hier ist mein ursprünglicher GolfScript-Eintrag. Bemerkenswerte Golf-Tricks beinhalten die Verwendung der Zahl
1
als eine bequem vorinitialisierte Variable , um die aktuelle Anzahl der zu würfelnden Würfel zu speichern. (Die CJam-Version verwendet stattdessenX
, die CJam auf den Wert 1 initialisiert.)Ps. Als ich den Titel sah, wollte ich das ursprünglich in AnyDice beantworten . Aber es stellt sich als eine schreckliche Wahl für diese Herausforderung heraus, und ich denke nicht, dass es überhaupt technisch möglich ist, diese Spezifikation so zu implementieren, wie sie gegeben ist.
Das Problem ist, dass AnyDice eine domänenspezifische Sprache zum Schreiben ist deterministischer Programme zur Berechnung von Würfelwurfstatistiken ist. Während die möglichen Ergebnisse einer Rolle Inspektion und tun bedingte Rollen auf ihnen basiert ist möglich über Rekursion, gibt es keine Möglichkeit , eine tatsächliche Zufälligkeit zu erzeugen. Während Sie diese Folge von Würfeln in AnyDice simulieren können, erhalten Sie als Ergebnis lediglich Statistiken über die Anzahl der Würfel, bis der Prozess endet, oder die Verteilung der Ergebnisse in einem bestimmten Schritt.
Alles, was gesagt hat, Nach allem hier der nächste, den ich in AnyDice bekommen könnte :
Dies ist kein besonders golferischer Code, da dies eine Übung in der Sinnlosigkeit zu sein schien. Standardtricks für das Klammersprachengolf, wie das Verkürzen von Funktionsnamen und das Eliminieren unnötiger Leerzeichen, sollten das meiste Golfpotential sowieso ausschöpfen.
Der wichtigste Trick dabei ist, dass
:n
AnyDice die Funktion automatisch auswertet , wenn Sie in AnyDice eine Funktion aufrufen, die eine Zahl erwartet (wie in der Funktionsdefinition angegeben), und ihr stattdessen einen Würfel (dh eine Wahrscheinlichkeitsverteilung) übergeben alle möglichen Werte des Würfels und kombiniert die Ergebnisse zu einem neuen Würfel.Hier ist ein Screenshot der Ausgabe (im Balkendiagrammformat) für die ersten drei Rollen:
(Beachten Sie, dass die Spalte "0" in jedem Diagramm die Wahrscheinlichkeit angibt, dass die Iteration aufgrund der Anzahl der Würfel, die entweder 0 oder N treffen , vor dem aktuellen Wurf gestoppt wurde . Dies ist eine bequeme Möglichkeit, die Stoppbedingung darzustellen, da Natürlich ergibt das Rollen von 0dN immer 0).
quelle
R, 103 Bytes
Eine recht unkomplizierte Implementierung. Würfelwürfe werden von gemacht
sum(sample(n,i))
.Testlauf
quelle
CoffeeScript,
10699 BytesUngolfed
quelle
Julia, 77 Bytes
Das meiste sollte selbsterklärend sein - es wird ein tatsächlicher Zeilenumbruch in der
print
Zeichenfolge verwendet, anstattprintln
ein Byte zu speichern.rand(1:n,N)
erzeugtN
zufällige ganze Zahlen zwischen 1 undn
.quelle
Ruby,
939082 ZeichenProbelauf:
quelle
QBIC , 83 Bytes (nicht konkurrierend)
Erläuterung:
quelle
PHP, 104 Bytes
Laufen Sie mit
php -r '<code>' <N>
Nervenzusammenbruch
quelle