Vous devez générer un parcours de golf de 18 trous au hasard.
Exemple de sortie:
[3 4 3 5 5 4 4 4 5 3 3 4 4 3 4 5 5 4]
Règles:
- Votre programme doit générer une liste de longueurs de trous pour exactement 18 trous
- Chaque trou doit avoir une longueur de 3, 4 ou 5
- La longueur des trous doit atteindre 72 pour tout le parcours
- Votre programme doit être capable de produire toutes les configurations de trous possibles avec une probabilité non nulle (les probabilités de chaque configuration ne doivent pas nécessairement être égales, mais n'hésitez pas à réclamer des félicitations supplémentaires si tel est le cas).
4
, et les seules possibilités sont3
,4
ou5
, les classes solution sont {no 3's or 5's
,one 3 and one 5
,two 3's and two 5's
, ...,nine 3's and nine 5's
}. Ceci peut être calculé parnCr(18,0)*nCr(18,0) + nCr(18,1)*nCr(17,1) + nCr(18,2)*nCr(16,2) + ... + nCr(18,9)*nCr(9,9) = 44,152,809
. Cela signifie qu'environ11.4%
toutes les combinaisons possibles sont des solutions valides(44,152,809 / 3^18)
.sum(factorial(18)/factorial(x)/factorial(y)/factorial(z) for x in range(25) for y in range(25) for z in range(25) if 3*x+4*y+5*z == 72 and x+y+z == 18)
donne44152809L
Réponses:
k (
18 1716 caractères)Retour à l'approche originale, créditons CS pour l'amélioration.
Autre approche (17 caractères), même méthode que la solution J, H / T à CS
Ancienne version:Non susceptible de déborder de la pile et s'exécute dans un espace d'espace fixe.
la source
K, 28
la source
J,
201817 caractèresCela fonctionne de la même manière que la réponse précédente, à ceci près que les 9 chiffres aléatoires sont 0 ou 1 et sont annulés avant d’être ajoutés. Cela signifie qu'il y a autant de
-1
s que de1
s. Ajouter 4 me donne une liste de3
s,4
s et5
s qui totalisent 72 à chaque fois.Réponse précédente:
Génère les 9 premiers trous de manière aléatoire
?9#3
, puis les copie et les inverse(,2-])
(transforme un 3 en un 5 et un 5 en un 3) pour générer le 9 final. Cela garantit que le total sera de 72 (puisque tous les 3 auront un Le total moyen par trou sera de 4 et 4x18 = 72). Il({~?~@#)
mélange ensuite le résultat au hasard pour s'assurer que chaque combinaison est possible.la source
Code machine x86 16 bits sous MS-DOS - 45 octets
Hexdump:
Binaire codé en Base64:
Le code source actuel avec quelques commentaires:
Compilez avec
nasm 18h.asm -o 18h.com
et exécutez-vous sous MS-DOS (ou Dosbox) ou NTVDM à partir d'une version Windows 32 bits.Exemple de sortie:
la source
Mathematica
71 68 6660Avec 6 caractères sauvés par la suggestion de Tally.
Tous les résultats possibles sont possibles, mais ils ne sont pas également probables.
Une analyse
produit toutes les 10 partitions possibles (combinaisons, pas permutations) de 72 en 18 éléments composés de 3, 4 et 5.
RandomChoice
sélectionne l'un d'entre eux.RandomSample
renvoie une permutation de ce choix.la source
R - 41
L'algorithme est similaire à celui de @ sgrieve.
la source
GolfScript (26 caractères)
Il y a des similitudes évidentes avec la solution d'Ilmari, mais aussi des différences évidentes. En particulier, j'exploite le fait que le pair moyen est de 4.
la source
{;0{3.rand+.@+}18*])72-}do
moi-même, mais je ne savais pas comment le raccourcir à partir de là. +1Python 77
Code
Sortie
L'import tue vraiment cette solution. Il utilise numpy pour générer 18 nombres compris entre 3 et 5 et continue de générer des listes jusqu'à ce que la somme de la liste soit égale à 72.
la source
GolfScript, 27 caractères
Utilise la même méthode d'échantillonnage de rejet que la solution Python de sgrieve. Ainsi, chaque sortie valide est également probable.
la source
Q (25 caractères)
Original (27)
Échantillon de sortie
Un peu plus court (25)
la source
JavaScript,
666461 caractèresFortement inspiré par TwoScoopsofPig (PHP) et Joe Tuskan (JS).
la source
s!=72
peut êtres-72
pour sauver un caractère. Et le dernier point-virgule;a
n'est pas nécessaire non plus pour un autre personnage.for(i=x;i;i--)
auparavant, il enregistre 2 caractèresfor(i=0;i<x;i++)
, merci mec!Python 2, 70 octets
modifier:En voici un autre, similaire à la solution de sgrieve:
Python 2, 73 octets + probabilité égale
la source
JavaScript,
1169965 octetsfor(i=0,h=[];i<18;)h[i++]=5;while(h.reduce(function(a,b){return a+b})!=72){i=Math.random()*18|0;h[i]=[3,4,4][i%3]}h;
h=[0];while(h.reduce(function(a,b){return a+b})-72)for(i=0;i<18;h[i++]=[3,4,5][Math.random()*3|0])h
la source
i is not defined
.Python,
128120116 caractèresimport
les instructions sont toujours des tueurs de longueur (23 caractères pour importer 2 fonctions dans l'espace de noms)J'espère que vous n'aurez pas besoin du résultat dans un proche avenir, car ce code évalue d'abord toutes les solutions possibles avant d'en choisir une au hasard. peut-être la solution la plus lente à ce problème.
Je réclame des félicitations supplémentaires pour une probabilité égale de chaque configuration ...
la source
import random,itertools
import random as r,itertools as i
utilisez ensuiter
et à lai
place derandom
etitertools
. Utilisez18*[0]
au lieu derange(18)
, et[3,4,5,6]
au lieu derange(3,6)
:)choice()
fonction. c'est aussi ce qui rend ce code si lent ...PHP - 77 caractères
Un peu comme la solution de sgrieve, cela construit une liste de 18 trous, vérifie le total pair, et l’imprime ou le rejette et essaie à nouveau. Curieusement, nos deux solutions ont la même longueur.
Plutôt ennuyeux, PHP n'offre pas de fonctions de tableau avec un nom aussi bref. Array_sum et print_r me tuent. Suggestions bienvenues.
la source
+=
.<?while($s!=72)for($s=$i=0;18>$i;$s+=$a[++$i]=rand(3,5));print_r($a);
while(array_sum($a)!=72)for($i=0;18>$i;)$a[++$i]=rand(3,5);
{}
(puisque la syntaxe de PHP le permet explicitement).Ruby 1.9 (62 caractères)
Rails (55 caractères)
Dans le
$ rails c
REPL (dans n'importe quel dossier Rails):Remarque: cela fonctionne avec Ruby 1.8 si vous utilisez à la
shuffle[0]
place desample
.la source
(1..18).map{rand(3)+3}
pour obtenir le tableau aléatoire;)Lisp (
7869 caractères)(do ((c ()) (mapcar (lambda (x) (+ 3 (aléatoire 3))) (liste de sélection 18)))) ((= (appliquer '+ c) 72) c))C'est assez similaire à la solution Python de sgrieve.
Commencez avec c comme NIL, vérifiez pour un montant de 72, le
do
"fonction d’incrément" de c génère une liste de 18 nombres compris entre 3 et 5, recherchez 72 de plus, faites mousser, rincez, répétez.C'est rafraîchissant de voir
do
et deloop
jouer au golf ensemble.la source
C (123 caractères) - effort d'efficacité
Passez par wc et il générera toutes les solutions 44152809 en 10 secondes ...
Oh, bien - je n'ai pas bien lu la question - mais étant donné que nous générons toutes les solutions, en choisir une au hasard avec une probabilité égale est un exercice de script: P
la source
Clojure - 55
Une astuce assez amusante .... exploite la structure mathématique du problème selon laquelle il doit y avoir exactement autant de trous 3 en par que de 5 en trous.
la source
Python 83
Comme la solution de sgrieve, mais sans numpy
La solution de golf d'Adrien Plisson: 120 -> 108 personnages
MATLAB 53
Sortie :
la source
randi([3,5],1,18)
place de3+floor(rand(1,18)*3)
Java (61 caractères)
Exemple de sortie:
la source
C (94 caractères)
La
s=0
ligne 1 peut ne pas être nécessaire, car quelles sont les chances qu'un int non initialisé soit égal à 72? Je n'aime tout simplement pas lire les valeurs non initialisées en C droit. De plus, cela nécessite probablement de semer larand()
fonction.sortie
la source
Script shell Bash (65 caractères)
( shuf vient du paquet GNU coreutils. Merci également à Gareth.)
la source
C # (143 espaces non blancs):
la source
new Guid()
crée un GUID vide. Pour générer réellement un GUID unique, vous devez appeler une méthode statiqueGuid.NewGuid
.Math.Random
, c'estSystem.Random
.var r=new Random();for(;;){var e=Enumerable.Range(1,18).Select(i=>r.Next(3,6)).ToList();if(e.Sum()==72){e.ForEach(i=>Console.Write(i));break;}}
Haskell,
10410298 caractères.la source
[1..n]>>[r]
est légèrement plus court quereplicate n$r
.sequence
pourmapM
.Perl, 74
Solution alternative:
la source
TXR (99 caractères)
Cette expression génère une liste paresseuse infinie de nombres aléatoires de 3 à 5:
Le reste de la logique est une simple boucle qui vérifie si les 18 premiers éléments de cette liste totalisent 72. Sinon, un élément est retiré et réessayé. La
for
boucle contient un bloc implicite appelénil
et(return ...)
peut donc être utilisé pour terminer la boucle et renvoyer la valeur.Notez que la longueur de 99 caractères inclut une nouvelle ligne de terminaison, obligatoire.
la source
APL 12
Notez que l'origine de l'index est définie sur 0, ce qui signifie que les tableaux commencent à 0. Vous pouvez définir ceci avec
⎕IO←0
.la source
R, 42 octets
sample
, par défaut, tire uniformément parmi les valeurs possibles (ici3 4 5
).r=T
représentereplace=TRUE
et permet l'échantillon avec remplacement.la source
CJam,
1714 octetsCJam est plus récent que ce défi, mais ce n'est pas la réponse la plus courte de toute façon, donc cela n'a pas vraiment d'importance.
Testez-le ici.
Pour maintenir le total de 72, chacun
3
doit être associé5
. Alors, voici comment cela fonctionne:la source