Étant donné une entrée n
où 3 <= n <= 25
, effectuez les étapes suivantes, en commençant par un n
dé simple face (faces dans la plage [1, n]
, inclus):
- Imprime le résultat du lancer des
n
dés en cours, sous la forme kdn: X
(où X
est le résultat et k
le nombre de dés en jeu).
- Si
X
est supérieur ou égal au n/2
nombre de fois en jeu, ajoutez un dé. Sinon, retirez un dé.
- Si le nombre de dés en jeu est égal à
0
ou n
, arrêtez. Sinon, passez à l'étape 1.
L'exemple s'exécute (notez que la sortie entre parenthèses est pour explication et n'est pas requise):
6 faces:
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 faces:
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)
Règles
- Les sorties doivent être exactement au format
kdn: X
, avec des retours à la ligne séparant chaque rouleau
- Vous devez simuler le fait de lancer plusieurs dés; renvoyer simplement un entier aléatoire dans la plage
[1, n]
(incluse) multiplié par le nombre de dés actuellement en jeu n'est pas autorisé, car cela ne simule pas avec précision le lancement de plusieurs dés.
- Les failles standard sont interdites
- Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte
Classement
L'extrait de pile au bas de cet article génère le classement à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
## [><>](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>
Réponses:
Pyth, 37 octets
Essayez-le en ligne.
la source
Mathematica,
958980 caractèresNon golfé
la source
Echo
ne peut malheureusement pas prendre une séquence d'entrées comme lePrint
fait.PHP,
164121112113109 octetsVersion finale, je le promets. Amélioré en utilisant la suggestion de Titus:
EDIT: ajout d'un octet supplémentaire pour le formatage. J'ai oublié qu'il y a un IF dedans qui, grâce à la suppression du texte "add / sub", aurait pu être un opérateur ternaire:
La sortie ressemble maintenant à:
EDIT: Merci à @Manatwork, ça m'a sauvé beaucoup! Version nouvelle et améliorée:
Entrée précédente:
Lance des matrices séparées, produit ceci:
Et cela s'appelle ainsi:
d(6, 1);
L'affichage du suffixe
Add
etSub
est-il obligatoire? Cela ne ressort pas clairement de votre question.la source
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
Enregistré 3 octets grâce à DSM.
Assez simple, lance un tas de dés et vérifie la moyenne. Rien d'extraordinaire ici encore.
Il doit être appelé avec un int. Donc,
x(6)
cela produira quelque chose comme ceci:.
la source
JavaScript (ES6), 97
102106112octetsMerci @ user81655 et @Jupotter de m'avoir sauvé quelques octets.
Démo
Cela ne fonctionne que dans les navigateurs compatibles ES6 (pour le moment qui incluent Firefox et Edge, éventuellement avec Chrome et Opera avec les fonctionnalités expérimentales JavaScript activées):
la source
while
enfor
boucle, arrondir à la|0
place de~~()
et déplacer quelques instructions afin de pouvoir supprimer les crochets pour économiser quelques octets. Vous pouvez également en faire une fonction anonyme (nonf=
). 103 octets: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
vers l'autrefor
boucle (m'a coûté 1 char de plus que la vôtre). Toujours à 106k&&k!=n
condition par la comparaisonk%n!=0
k%n
marche encore mieux;)CJam, 45 octets
Essayez-le en ligne.
Implémente la spécification de façon assez littérale (y compris la formule mathématique incorrecte du "rouleau moyen"). Comme prévu, le portage du programme GolfScript d'origine ci-dessous vers CJam a enregistré un tas d'octets en raison de noms de commandes intégrés plus courts (
mr
,o
etg
au lieu derand
,puts
etdo
).GolfScript, 51 octets
Voici mon entrée GolfScript originale. Les astuces de golf notables incluent l' utilisation du nombre
1
comme variable commodément pré-initialisée pour stocker le nombre actuel de dés à lancer. (La version CJam utilise à la placeX
, que CJam initialise à la valeur 1.)Ps. En voyant le titre, je voulais à l'origine répondre à cela dans AnyDice . Mais cela s'avère être un choix horrible pour ce défi, et je ne pense pas qu'il soit même techniquement possible de l'utiliser pour implémenter cette spécification comme indiqué.
Le problème est que AnyDice est un langage spécifique au domaine pour écrire des programmes déterministes pour calculer les statistiques de roulement des dés. Bien qu'il soit possible d'inspecter les résultats possibles d'un rouleau et d'effectuer des rouleaux conditionnels en fonction de ceux -ci via la récursivité, il n'y a aucun moyen de générer un caractère aléatoire réel. Ainsi, bien que vous puissiez simuler cette séquence de lancers de dés dans AnyDice, tout ce que vous pouvez obtenir en sortie est des statistiques sur, par exemple, le nombre de lancers jusqu'à la fin du processus ou la distribution des résultats à une étape donnée.
Cela dit, voici le plus proche que je pouvais obtenir dans AnyDice :
Ce n'est pas un code particulièrement golfé, car cela semblait être un exercice futile. Les astuces de golf standard en accolade, comme raccourcir les noms de fonction et éliminer les espaces inutiles, devraient de toute façon épuiser la plupart du potentiel de golf.
L'astuce clé utilisée ici est que, lorsque vous appelez une fonction qui attend un nombre (comme indiqué
:n
dans la définition de fonction) dans AnyDice, et lui passez un dé (c'est-à-dire une distribution de probabilité) à la place, AnyDice évalue automatiquement la fonction pour tous les possibles valeurs du dé, et combine les résultats dans un nouveau dé.Voici une capture d'écran de la sortie (au format graphique à barres) pour les trois premiers rouleaux:
(Notez que le « 0 » colonne dans chaque graphique indique la probabilité que l'itération est arrêté, en raison du nombre de dés frapper soit 0 ou N, avant que le rouleau actuel. Cela arrive à être un moyen commode de représenter la condition d' arrêt, depuis bien sûr, rouler 0dN donne toujours 0.)
la source
R, 103 octets
Une implémentation assez simple. Les jets de dés sont effectués par
sum(sample(n,i))
.Essai
la source
CoffeeScript,
10699 octetsNon golfé
la source
Julia, 77 octets
La plupart de ces informations devraient être explicites - une nouvelle ligne réelle est utilisée dans la
print
chaîne plutôt queprintln
pour enregistrer un octet.rand(1:n,N)
produitN
des entiers aléatoires entre 1 etn
.la source
Rubis,
939082 caractèresExemple d'exécution:
la source
QBIC , 83 octets (non concurrents)
Explication:
la source
PHP, 104 octets
Courir avec
php -r '<code>' <N>
panne
la source