Un autre problème de notre golf interne ... celui-ci autour des vacances l'année dernière.
PROBLÈME
Andy, Barb, Carl, Didi, Earl et Fran s'achètent des cadeaux. Dessinez des noms pour un échange de cadeaux.
- Chaque personne achète un cadeau et reçoit un cadeau.
- Personne n'achète son propre cadeau.
- L'exécution de la solution plusieurs fois devrait produire des résultats différents (la paire donneur-récepteur ne doit pas être prévisible ou identique d'une exécution à l'autre).
CONTRIBUTION
Aucun.
PRODUCTION
Formaté comme dans cet exemple:
Andy achète pour Barb
Barb achète pour Carl
Carl achète pour Didi
Didi achète pour Earl
Earl achète pour Fran
Fran achète pour Andy
Réponses:
J, 57
par exemple
la source
c99 - 252 caractères
Légère amélioration en profitant du caractère circulaire de la permutation. Cette version construit toujours une stratégie d'achat en boucle, elle est donc moins aléatoire que la version précédente (271 caractères), mais je pense qu'elle répond toujours aux spécifications.
Nécessite une plateforme qui fonctionne
/dev/random
. Je devrais être en mesure de supprimer environ 8 en omettant le\0
s dans la grande chaîne, mais ma libc ne semble pas traiter%4s
les spécificateurs d'impression comme le dit la page de manuel.Le shuffle est mauvais, mais le faire de cette façon m'empêche d'avoir à vérifier les conditions "Foo achète pour Foo" .
Lisible:
la source
Windows PowerShell, 83
Histoire:
$i
il sera recréé à chaque fois.$_
dans la chaîne pour enregistrer le+
.la source
Haskell,
241189caractèresSortie entièrement aléatoire (qui satisfait toujours la spécification).
Cela génère toutes les permutations de la liste des noms, en choisit un au hasard (je pense que c'est le moyen le plus court à Haskell de mélanger une liste - si quelqu'un a quelque chose de plus petit, je l'apprécierais), puis chaque personne achète ensuite un présent pour la prochaine personne dans la liste.
la source
permutations$words"Andy Barb Carl Didi Earl Fran"
et quelques autres astuces que j'ai essayées dans ma version améliorée. J'ai oublié, cepermutations
n'est pas inclus dans le 98List
, vous devez donc utiliser le nom long non plus. Jetez-y un œil.r=tail.cycle
. et que l'inline.main=randomRIO(0,719)>>=mapM_ putStrLn.f
Golfscript:
72 6457 caractèresLes tests
"AndyBarbCarlDidiEarlFran"4/
, mis à jour et obtenu 7 caractères de moins;9rand
c'est plus aléatoire que mon6rand*
la source
"AndyBarbCarlDidiEarlFran"4/
6rand*
-0=rand
ou c'est peut;9rand
- être préférable. Pour la boucle,{.n+\' buys for '}%(
c'est plus court ..6rand*
parce que je pensais qu'il randomiserait également le tableau des 6 éléments (je pense que j'avais tort, car il a l';9rand
air vraiment aléatoire que le mien)Japt -R, 41 octets
-2 octets grâce à @Oliver!
Essayez!
C'est l'approche que j'ai adoptée à un haut niveau:
J'ai un peu d'histoire avec ce problème car j'ai créé un programme de "père Noël secret" pour mon travail il y a des années. Nous avons fini par demander à quelques candidats de travailler aussi :)
la source
ã
ne retourne pas une paire qui relie le premier au dernier élément. Je travaille sur un moyen de faire en sorte que cela fonctionne, mais j'ai pensé que je vous le ferais savoir. Merci encore! ethproductions.github.io/japt/…"q"
dans le.ö("q")
doPython - 118 caractères
Python - 120 caractères
la source
R - 85 caractères
la source
Python - 154 caractères
la source
map
appellestr.__eq__
chaque paire de valeurs correspondantes dans L et M, et la boucle continue jusqu'à ce qu'aucune d'entre elles ne soit vraie.D: 233 caractères
Plus lisiblement:
la source
Python (175)
la source
Schéma, 173
Donne l'une des deux solutions.
la source
C #,
210183 caractèresDes tas de passe-partout :(
Cette solution n'est pas totalement aléatoire - il y a toujours une ou plusieurs "boucles" de personnes, par exemple A-> C-> E-> A, et les décalages sont toujours les mêmes dans les boucles. Cependant, il n'est pas possible de prédire la sortie d'une exécution particulière à moins d'avoir une partie de cette sortie.
la source
var n="Andy Barb Carl Didi Earl Fran".Split()
? Enregistre 16 octets. Vous pouvez ignorer l'argument deMain()
, ce qui économise encore 9 octets. Et vous pouvez combiner la déclaration dec
eti
:int c,i=...;for(c=0;...
ce qui économise deux autres.Rubis - 89 caractères
Production:
la source
map
place deeach
.MathGolf , 41 octets
Essayez-le en ligne!
Explication
Cela n'est pas garanti pour produire chaque cas avec une probabilité égale, mais cela produit des résultats différents à chaque exécution. Un octet pourrait être supprimé si j'avais un opérateur de lecture aléatoire, mais c'est pour un autre jour.
la source