Ein weiteres Problem von unserem internen Golf ... dieses um die Feiertage im letzten Jahr.
PROBLEM
Andy, Barb, Carl, Didi, Earl und Fran kaufen sich gegenseitig Geschenke. Zeichnen Sie Namen für einen Geschenkaustausch.
- Jede Person kauft ein Geschenk und erhält ein Geschenk.
- Niemand kauft sein eigenes Geschenk.
- Das mehrmalige Ausführen der Lösung sollte zu unterschiedlichen Ergebnissen führen (das Geber-Empfänger-Paar sollte von Lauf zu Lauf nicht vorhersehbar oder identisch sein).
EINGANG
Keiner.
AUSGABE
Formatiert wie in diesem Beispiel:
Andy kauft für Barb
Barb kauft für Carl
Carl kauft für Didi
Didi kauft für Earl
Earl kauft für Fran
Fran kauft für Andy
Antworten:
J, 57
z.B
quelle
c99 - 252 Zeichen
Leichte Verbesserung durch Ausnutzung der kreisförmigen Natur der Permutation. Diese Version entwickelt immer eine schleifenartige Kaufstrategie, daher ist sie weniger zufällig als die vorherige Version (271 Zeichen), aber ich glaube, sie entspricht immer noch der Spezifikation.
Benötigt eine funktionierende Plattform
/dev/random
. Ich sollte in der Lage sein, ungefähr 8 auszuschalten, indem ich das\0
s in der großen Zeichenfolge weglasse , aber meine libc scheint sich nicht mit Druckspezifizierern zu befassen,%4s
wie es auf der Manpage steht.Das Mischen ist schlecht, aber wenn ich es so mache, muss ich nicht nach den Bedingungen für "Foo kauft für Foo" suchen.
Lesbar:
quelle
Windows PowerShell, 83
Geschichte:
$i
jedes Mal neu erstellt wird.$_
in die Zeichenfolge die zu speichern+
.quelle
Haskell,
241189 ZeichenVollständig zufällige Ausgabe (die immer noch die Spezifikation erfüllt).
Dies erzeugt alle Permutationen der Liste der Namen, wählt zufällig eine aus (ich denke, dies ist der kürzeste Weg in Haskell, um eine Liste zu mischen - wenn jemand etwas Kleineres hat, würde ich es schätzen), und dann kauft jede Person eine anwesend für die nächste Person in der Liste.
quelle
permutations$words"Andy Barb Carl Didi Earl Fran"
und einige andere Tricks, die ich in meiner verbesserten Version ausprobiert habe. Ich habe vergessen, dasspermutations
das nicht in der 98 enthalten istList
, also musst du auch den langen Namen verwenden. Schau es dir an.r=tail.cycle
. und dann inline.main=randomRIO(0,719)>>=mapM_ putStrLn.f
Golfscript:
72 6457 ZeichenTests
"AndyBarbCarlDidiEarlFran"4/
, aktualisiert und 7 Zeichen weniger bekommen;9rand
das zufälliger ist als meine6rand*
quelle
"AndyBarbCarlDidiEarlFran"4/
6rand*
-0=rand
oder vielleicht;9rand
ist vorzuziehen. Für die Schleife{.n+\' buys for '}%(
ist kürzer ..6rand*
weil ich dachte, es wird das 6-Elemente-Array gleichermaßen randomisieren (ich denke, ich habe mich geirrt, da es;9rand
wirklich zufällig aussieht als meins)Japt -R, 41 Bytes
-2 Bytes dank @Oliver!
Versuch es!
Dies ist der Ansatz, den ich auf hohem Niveau gewählt habe:
Ich habe eine kleine Geschichte mit diesem Problem, als ich vor Jahren ein "Secret Santa" -Programm für meine Arbeit erstellt habe. Am Ende haben wir ein paar Bewerber gebeten, das auch durchzuarbeiten :)
quelle
ã
als würde kein Paar zurückgegeben, das das erste mit dem letzten Element verknüpft. Ich arbeite daran, dies zum Laufen zu bringen, dachte aber, ich würde es Sie wissen lassen. Nochmals vielen Dank! ethproductions.github.io/japt/..."q"
in der.ö("q")
doPython - 118 Zeichen
Python - 120 Zeichen
quelle
R - 85 Zeichen
quelle
Python - 154 Zeichen
quelle
map
ruftstr.__eq__
jedes Paar entsprechender Werte in L und M auf, und die Schleife läuft weiter, bis keiner von ihnen wahr ist.D: 233 Zeichen
Lesbarer:
quelle
Python (175)
quelle
Schema, 173
Gibt eine von zwei Lösungen.
quelle
C #,
210183 ZeichenHaufenweise Boilerplate :(
Diese Lösung ist nicht völlig zufällig - es gibt immer eine oder mehrere "Schleifen" von Personen, z. B. A-> C-> E-> A, und die Offsets sind in den Schleifen immer gleich. Es ist jedoch nicht möglich, die Ausgabe eines bestimmten Laufs vorherzusagen, es sei denn, Sie haben einen Teil dieser Ausgabe.
quelle
var n="Andy Barb Carl Didi Earl Fran".Split()
? Spart 16 Bytes. Sie können das Argument weglassenMain()
, wodurch weitere 9 Bytes gespeichert werden. Und Sie können die Deklaration vonc
undi
: kombinieren,int c,i=...;for(c=0;...
wodurch zwei weitere gespeichert werden.Ruby - 89 Zeichen
Ausgabe:
quelle
map
anstelle von verwendeneach
.MathGolf , 41 Bytes
Probieren Sie es online aus!
Erläuterung
Dies garantiert nicht jeden Fall mit gleicher Wahrscheinlichkeit, führt jedoch bei jedem Lauf zu unterschiedlichen Ergebnissen. Ein Byte könnte entfernt werden, wenn ich einen Shuffle-Operator hätte, aber das ist für einen anderen Tag.
quelle