Sie müssen einen zufälligen 18-Loch-Golfplatz erstellen.
Beispielausgabe:
[3 4 3 5 5 4 4 4 5 3 3 4 4 3 4 5 5 4]
Regeln:
- Ihr Programm muss eine Liste mit Lochlängen für genau 18 Löcher ausgeben
- Jedes Loch muss eine Länge von 3, 4 oder 5 haben
- Die Lochlängen müssen für den gesamten Platz 72 betragen
- Ihr Programm muss in der Lage sein, jede mögliche Lochkonfiguration mit einer Wahrscheinlichkeit ungleich Null zu erstellen (die Wahrscheinlichkeiten jeder Konfiguration müssen nicht gleich sein, in diesem Fall können Sie jedoch zusätzliche Anerkennung einfordern).
4
, und die einzigen Möglichkeiten sind3
,4
oder5
die möglichen Lösungsklassen {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
}. Dies kann mit berechnet werdennCr(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
. Dies bedeutet, dass ungefähr11.4%
alle möglichen Kombinationen gültige Lösungen sind(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)
gibt44152809L
Antworten:
k (
18 1716 Zeichen)Zurück zum ursprünglichen Ansatz, Dank an CS für die Verbesserung.
Anderer Ansatz (17 Zeichen), gleiche Methode wie die J-Lösung, H / T zu CS
Alte Version:Nicht anfällig für Stapelüberlauf und wird auf festem Platz ausgeführt.
quelle
K 28
quelle
J,
201817 ZeichenDies funktioniert genauso wie die vorherige Antwort, außer dass die 9 zufälligen Ziffern entweder 0 oder 1 sind und vor dem Anhängen negiert werden. Das heißt, es gibt so viele
-1
s wie es1
s gibt. Durch Hinzufügen von 4 erhalte ich eine Liste mit3
s,4
s und5
s, die jedes Mal 72 ergeben.Vorherige Antwort:
Erzeugt die ersten 9 Löcher nach dem Zufallsprinzip
?9#3
, kopiert und invertiert sie(,2-])
(wandelt eine 3 in eine 5 und eine 5 in eine 3 um), um die endgültige 9 zu erzeugen. Dies garantiert, dass die Gesamtsumme 72 beträgt (da jede 3 eine übereinstimmende 5 hat) Die durchschnittliche Gesamtsumme pro Loch beträgt 4 und 4x18 = 72). Das Ergebnis wird dann zufällig gemischt,({~?~@#)
um sicherzustellen, dass jede Kombination möglich ist.quelle
16-Bit-x86-Computercode unter MS-DOS - 45 Byte
Hexdump:
Base64-codierte Binärdatei:
Tatsächlicher Quellcode mit einigen Kommentaren:
Kompilieren Sie mit
nasm 18h.asm -o 18h.com
und führen Sie es unter MS-DOS (oder Dosbox) oder NTVDM von einer 32-Bit-Windows-Version aus.Beispielausgabe:
quelle
Mathematica
71 68 6660Mit 6 Zeichen nach Tallys Vorschlag gespeichert.
Alle möglichen Ergebnisse sind möglich, aber sie sind nicht gleich wahrscheinlich.
Analyse
Erzeugt alle 10 möglichen Partitionen (Kombinationen, keine Permutationen) von 72 in 18 Elemente, die aus 3, 4 und 5 bestehen.
RandomChoice
wählt eine davon aus.RandomSample
gibt eine Permutation dieser Wahl zurück.quelle
R - 41
Der Algorithmus ähnelt dem von @ sgrieve.
quelle
GolfScript (26 Zeichen)
Es gibt einige offensichtliche Ähnlichkeiten mit der Lösung von Ilmari, aber auch einige offensichtliche Unterschiede. Insbesondere nutze ich die Tatsache, dass das durchschnittliche Par 4 ist.
quelle
{;0{3.rand+.@+}18*])72-}do
mir etwas ausgedacht, konnte aber nicht herausfinden, wie ich es von dort aus kürzer machen kann. +1.Python 77
Code
Ausgabe
Der Import macht diese Lösung wirklich kaputt. Mit numpy werden 18 Zahlen zwischen 3 und 5 generiert, und Listen werden so lange generiert, bis die Summe der Listen 72 ergibt.
quelle
GolfScript, 27 Zeichen
Verwendet die gleiche Ablehnungsmethode wie die Python-Lösung von sgrieve. Somit ist jede gültige Ausgabe tatsächlich gleich wahrscheinlich.
quelle
Q (25 Zeichen)
Original (27)
Beispielausgabe
Etwas kürzer (25)
quelle
JavaScript,
666461 ZeichenStark inspiriert von TwoScoopsofPig (PHP) und Joe Tuskan (JS).
quelle
s!=72
kann seins-72
, ein Zeichen zu sparen. Und das letzte Semikolon;a
wird auch nicht für einen anderen Buchstaben benötigt.for(i=x;i;i--)
zuvor gesehen, dass es 2 Zeichen spartfor(i=0;i<x;i++)
, danke Mann!Python 2, 70 Bytes
bearbeiten:Hier ist eine andere, ähnlich der Lösung von sgrieve:
Python 2, 73 Bytes + gleiche Wahrscheinlichkeit
quelle
JavaScript,
1169965 Bytesfor(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
quelle
i is not defined
.Python,
128120116 Zeichenimport
Anweisungen sind immer noch Längenkiller (nur 23 Zeichen, um 2 Funktionen in den Namespace zu importieren)Ich hoffe, dass Sie das Ergebnis in naher Zukunft nicht benötigen, da dieser Code zunächst alle möglichen Lösungen bewertet, bevor er eine zufällig auswählt. Vielleicht die langsamste Lösung für dieses Problem.
Ich fordere zusätzliches Lob für die gleiche Wahrscheinlichkeit jeder Konfiguration ...
quelle
import random,itertools
import random as r,itertools as i
Verwenden Sie dannr
undi
anstelle vonrandom
unditertools
. Verwenden Sie18*[0]
anstelle vonrange(18)
und[3,4,5,6]
anstelle vonrange(3,6)
:)choice()
funktion verbietet . das ist auch der Grund, warum dieser Code so langsam ist ...PHP - 77 Zeichen
Ähnlich wie bei der Lösung von sgrieve wird eine Liste mit 18 Löchern erstellt, das gesamte Par überprüft und entweder gedruckt oder abgelehnt und ein neuer Versuch unternommen. Seltsamerweise sind unsere beiden Lösungen gleich lang.
Eher ärgerlich ist, dass PHP keine Array-Funktionen mit einer kurzen Bezeichnung anbietet. Array_sum und print_r bringen mich um. Vorschläge sind willkommen.
quelle
+=
.<?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);
{}
(da die PHP-Syntax dies ausdrücklich zulässt).Ruby 1.9 (62 Zeichen)
Schienen (55 Zeichen)
In der
$ rails c
REPL (in einem beliebigen Rails-Ordner):Hinweis: Es funktioniert mit Ruby 1.8, wenn Sie
shuffle[0]
statt verwendensample
.quelle
(1..18).map{rand(3)+3}
, um das zufällige Array zu erhalten;)Lisp (
7869 Zeichen)(do ((c () (mapcar (lambda (x) (+ 3 (zufällig 3))) (make-list 18))) ((= (apply '+ c) 72) c))Es ist der Python-Lösung von sgrieve ziemlich ähnlich.
Beginnen Sie mit c als NIL, prüfen Sie auf eine Summe von 72, die
do
"Inkrementierungsfunktion" für c erzeugt eine Liste von 18 Zahlen zwischen 3 und 5, prüfen Sie erneut auf 72, schäumen Sie auf, spülen Sie ab, wiederholen Sie.Es ist erfrischend, zusammen Golf zu sehen
do
undloop
schön zu spielen.quelle
C (123 Zeichen) - Effizienzbemühungen
Pipe durch wc und es werden alle 44152809 Lösungen innerhalb von 10 Sekunden generiert ...
Oh, nun - habe die Frage nicht richtig gelesen - aber da wir alle Lösungen generieren, ist es eine Scripting-Übung, eine zufällige mit gleicher Wahrscheinlichkeit auszuwählen: P
quelle
Clojure - 55
Ein ganz lustiger Trick ... nutzt die mathematische Struktur des Problems aus, dass es genau so viele 3 Par-Löcher wie 5 Par-Löcher geben muss.
quelle
Python 83
Wie die Lösung von sgrieve, aber ohne Dummheit
Golf Adrien Plissons Lösung: 120-> 108 Zeichen
MATLAB 53
Ausgabe :
quelle
randi([3,5],1,18)
anstelle von3+floor(rand(1,18)*3)
Java (61 Zeichen)
Beispielausgabe:
quelle
C (94 Zeichen)
Das
s=0
On-Line-1 ist möglicherweise nicht erforderlich, da die Wahrscheinlichkeit, dass ein nicht initialisiertes Int 72 ergibt, wie groß ist. Ich mag es einfach nicht, nicht initialisierte Werte in Straight C zu lesen. Dies erfordert wahrscheinlich auch das Setzen derrand()
Funktion.Ausgabe
quelle
Bash-Shell-Skript (65 Zeichen)
( shuf stammt aus dem GNU-Paket coreutils. Danke auch, Gareth.)
quelle
C # (143 ohne Leerzeichen):
quelle
new Guid()
Erstellt eine leere GUID. Um eine eindeutige GUID zu generieren, müssen Sie eine statische Methode aufrufenGuid.NewGuid
.Math.Random
, es istSystem.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 Zeichen.quelle
[1..n]>>[r]
ist etwas kürzer alsreplicate n$r
.sequence
zumapM
.Perl, 74
Alternative Lösung:
quelle
TXR (99 Zeichen)
Dieser Ausdruck erzeugt eine unendlich faule Liste von Zufallszahlen von 3 bis 5:
Der Rest der Logik ist eine einfache Schleife, die prüft, ob die ersten 18 Elemente dieser Liste 72 ergeben. Andernfalls wird ein Element entfernt und erneut versucht. Das
for
Schleife enthält einen impliziten Block, der aufgerufen wird,nil
und(return ...)
kann daher zum Beenden der Schleife und zum Zurückgeben des Werts verwendet werden.Beachten Sie, dass die Länge von 99 Zeichen eine abschließende neue Zeile enthält, die erforderlich ist.
quelle
APL 12
Beachten Sie, dass ich den Indexursprung auf 0 gesetzt habe, was bedeutet, dass Arrays bei 0 beginnen. Sie können dies mit festlegen
⎕IO←0
.quelle
R, 42 Bytes
sample
Zeichnet standardmäßig gleichmäßig unter den möglichen Werten (hier3 4 5
).r=T
steht fürreplace=TRUE
und ermöglicht Probe mit Ersatz.quelle
CJam,
1714 BytesCJam ist neuer als diese Herausforderung, aber dies ist ohnehin nicht die kürzeste Antwort, so dass das eigentlich egal ist.
Teste es hier.
Um die Gesamtzahl von 72 aufrechtzuerhalten,
3
muss jeder mit gepaart werden5
. So funktioniert es:quelle