Input-Output:
Eingabe : Eine gleichmäßig zufällige, unendlich lange Folge von '0' und '1', entnommen aus stdin. Es wird angenommen, dass die Zeichenfolge wirklich zufällig und nicht pseudozufällig ist. Es ist insofern einheitlich, als jedes Zeichen gleich wahrscheinlich eine '0' oder '1' ist.
Vorsichtig! Die Eingabe ist unendlich lang, sodass Sie nicht alles mit einer Funktion wie raw_input () in Python im Speicher speichern können. Wenn ich mich nicht irre, schlägt Golfscript mit unendlicher Eingabe fehl, da es die gesamte Eingabe vor dem Ausführen auf den Stapel schiebt.
Ausgabe : Ein gleichmäßig zufällig gemischtes Standarddeck ohne Joker. Es ist insofern einheitlich, als alle Bestellungen gleich wahrscheinlich sind.
Jede Karte in der Ausgabe hat den Rang A, 2-9, T, J, Q oder K, der mit der Farbe c, d, h oder s verknüpft ist. Zum Beispiel ist die 10 PikTs
Die Karten des Decks sollten durch Leerzeichen getrennt sein.
Sie dürfen keine integrierten Zufallsbibliotheken oder Funktionen verwenden, da diese nicht wirklich zufällig sind, sondern nur pseudozufällig.
Beispiel Eingabe
Sie können das folgende Python-Skript verwenden, um Eingaben in Ihr Programm zu leiten:
import sys, random
try:
while True:
sys.stdout.write(str(random.randint(0,1)))
except IOError:
pass
Wenn Sie das Skript als rand.py speichern, testen Sie Ihr Programm mit python rand.py | your_program
In Python 3 läuft es wie erwartet, aber in Python 2.7 wird nach der Ausgabe meines Programms eine Fehlermeldung angezeigt, jedoch erst, nachdem alles erledigt ist. Ignorieren Sie einfach die Fehlermeldung.
Beispielausgabe:
So sollte das Deck gedruckt werden, wenn es zufällig in eine sortierte Reihenfolge gemischt wird:
Ac 2c 3c 4c 5c 6c 7c 8c 9c Tc Jc Qc Kc Ad 2d 3d 4d 5d 6d 7d 8d 9d Td Jd Qd Kd Ah 2h 3h 4h 5h 6h 7h 8h 9h Th Jh Qh Kh As 2s 3s 4s 5s 6s 7s 8s 9s Ts Js Qs Ks
Wertung:
Dies ist ein Code Golf. Der kürzeste Code gewinnt.
Beispielprogramm:
Hier ist eine Python 2.7-Lösung, die nicht Golf spielt.
import sys
def next():
return int(sys.stdin.read(1))==1
def roll(n):
if n==1:
return 0
if n%2==0:
r=roll(n/2)
if next():
r+=n/2
return r
else:
r=n
while(r==n):
r=roll(n+1)
return r
deck = [rank+suit for suit in 'cdhs' for rank in 'A23456789TJQK']
while len(deck)>0:
print deck.pop(roll(len(deck))),
Antworten:
Ruby,
8987 ZeichenBearbeiten: vorherige Version
quelle
Python 122
Erläuterung:
Nicht verwendete Karten werden in D gespeichert. Dadurch wird einfach der nächste gültige Zufallsindex aus dem Eingabestream abgerufen und dieses Element aus D entfernt.
Wenn mir nichts fehlt, sollte es keine Voreingenommenheit geben. Das Skript wirft alle ungültigen Indizes aus>
len(D)
, dies führt jedoch nicht zu einer Verzerrung für niedrigere Zahlen, da jedes aufeinanderfolgende Pop den Index jedes vergangenen Elements als i reduziert.quelle
Perl, 80 Zeichen
Hier ist eine weitere Implementierung, die nicht unter der Verzerrung leidet und zwei Zeichen kürzer ist:
alte Implementierung (82 Zeichen):
alte Implementierungsbeschreibung:
quelle
sort
, was zu einer Tendenz zur alphabetischen Reihenfolge führt.C,
197178161 ZeichenBEARBEITEN : Verwenden einer neuen Zufallsfunktion, die viel kürzer ist - liest eine 4-stellige Ganzzahl
s
und verwendets%64
. Jede 6-stellige Dezimalzahl, die nur aus 0 und 1 besteht,%64
führt zu einem eindeutigen Ergebnis, sodass die Zufälligkeit gut ist.Dieser Ansatz verbraucht viel mehr zufällige Bits, ist jedoch erheblich kürzer.
Die grundlegende Logik ist einfach: Initialisieren Sie ein Array von 52 Zoll mit 0..51, mischen Sie (ersetzen Sie das Element x zufällig durch ein anderes aus dem Bereich 0..x), drucken Sie es formatiert (n / 4 = Rang, n% 4 = Farbe). .
Eine Schleife, die 104 Mal ausgeführt wird, führt die Initialisierung (erste 52 Läufe), das Mischen und Drucken (die letzten 52 Läufe) durch.
Eine Zufallszahl wird durch Ziehen von
n
Zufallsbits erzeugt , bis1<<n
mindestens das gewünschte Maximum erreicht ist. Wenn das Ergebnis mehr als das Maximum ist, versuchen Sie es erneut.quelle
s>7?"ATJQK"[s-8]:s+50
ist länger als das Einfache"A23456789TJQK"[s]
. Zweitens können Siet/4
undt%4
anstelle vont%13
und verwendent/13
.t
bei der Ausgabe nicht immer noch in das Array zurückkehrenUnix Shell ~ 350
Dies ist weder kurz noch hübsch, noch ist es effizient, aber ich habe mich gefragt, wie schwierig es wäre, dies mit Standard-Unix-Shell-Dienstprogrammen zu tun.
Diese Antwort zerlegt die unendliche Binärzeichenfolge in 6 Bitlängen und wählt nur diejenigen aus, die im richtigen Bereich (1-52) liegen. Hier wird die unendliche Binärzeichenfolge durch urandom und xxd simuliert:
Das Hacken und Auswählen erfolgt mit Fold, Sed und BC:
Dies erzeugt Linien wie:
Welches kann in bc gerichtet werden.
Aus diesem Zahlenstrom wird die Reihenfolge des Decks wie folgt ausgewählt (ich verwende zsh, aber die meisten modernen Shells sollten daran anpassbar sein):
Die zufällige Zahlenfolge muss nun in Kartennamen geändert werden. Die Kartennamenfolge kann einfach mit GNU parallel generiert werden:
Kombinieren Sie die Ausgabe der letzten beiden Befehle mit Einfügen und Sortieren der Zahlen:
Das Ganze als ein monströser Einzeiler (nur in zsh getestet):
Bearbeiten - Bash-Version hinzugefügt
Hier ist eine Version, die in Bash funktioniert. Ich habe die In-Shell entfernt
{ }
und die Array-Indizes basieren auf Null. Die Array-Leere wird mit einer etwas effizienteren Parametererweiterung überprüft und auch im obigen Beispiel übernommen.quelle
K & R c - 275
char
Literale durchint
Literale zu ersetzenGolf:
Ziemlich brutale Gewalt hier. Ich habe gerade neun Bits von der Eingabe gelesen, um eine minimale RNG-Ausgabe zu bilden, und die übliche Reduzierung des Moduls am Ende vorgenommen, wenn die nicht verwendeten Werte am Ende reduziert werden, um eine gleichmäßige Ausgabe für eine Auswahlmischung zu erhalten.
Diese Version ohne Golf unterscheidet sich darin, dass die Eingabe
/dev/urandom
eher vom als vom beschriebenen Eingabeformat stammt.quelle
"TJQKA"
und"cdhs"
?int
s. Ich verstehe es. Könnte sich trotzdem lohnen, alle Satzzeichen zu speichern. Könnte sogar daschar
Ausgetchar
undputchar
mit einem verrückten pastösen Makro#define N
und enden mit einem Newline , dass zählt als ein Zeichen und das ist 11, plus die Bit Sie ersetzen. Es gibt sicherlich noch ein paar Zeichen, wenn einige oder alle Zeichenliterale durch int-Literale ersetzt werden, aber hier ist es spät ... vielleicht mache ich es ein anderes Mal.PHP, 158 Zeichen
Es wurden Zeilenumbrüche hinzugefügt, um zu verhindern, dass der Codeblock Bildlaufleisten erhält. Sie können sicher entfernt werden.
Bevor ich aufgefordert werde, ein hinzuzufügen
<?php
, lassen Sie es wissen, dass Sie PHP ohne dieses Tag ganz einfach aufrufen können, indem Sie:cat golf.php | php -a
Entgolf und kommentiert:
Es gibt zwei erwartete Fehler, die sich nicht auf die Ausgabe des Programms auswirken.
Der erste Grund
$a
ist, dass nicht initialisiert wird, aber NULL in 0 konvertiert wird und das Programm fortgesetzt wird.Der zweite Grund ist, dass der Zeichenstrom von irgendwoher eine neue Zeile zu bekommen scheint, auch wenn er nicht bereitgestellt wird (gutes altes PHP), und das ist ein undefinierter Index im Array. Es ist das letzte Zeichen der Eingabe und hat keinen Einfluss auf die Ausgabe.
quelle