Wejście wyjście:
Wejście : jednolicie losowy, nieskończenie długi ciąg „0” i „1”, wzięty ze standardowego wejścia. Zakłada się, że ciąg znaków jest naprawdę losowy, a nie pseudolosowy. Jest jednolity, ponieważ każda postać może być równa „0” lub „1”.
Ostrożny! Dane wejściowe są nieskończenie długie, więc nie można przechowywać wszystkiego w pamięci za pomocą funkcji takiej jak raw_input () w pythonie. Jeśli się nie mylę, golfscript zakończy się niepowodzeniem z nieskończonym wejściem, ponieważ wypycha całe wejście na stos przed uruchomieniem.
Wyjście : jednolicie losowo tasowana standardowa talia, bez żartów. Jest jednolity, ponieważ wszystkie zamówienia są jednakowo prawdopodobne.
Każda karta na wyjściu ma swoją rangę, A, 2-9, T, J, Q lub K połączoną z jej kolorem, c, d, h lub s. Na przykład 10 pik toTs
Karty z talii powinny być oddzielone spacjami.
Nie możesz używać wbudowanych losowych bibliotek lub funkcji, ponieważ nie są one tak naprawdę losowe, tylko pseudolosowe.
Przykładowe dane wejściowe
Możesz użyć następującego skryptu python, aby potokować dane wejściowe do swojego programu:
import sys, random
try:
while True:
sys.stdout.write(str(random.randint(0,1)))
except IOError:
pass
Jeśli zapiszesz skrypt jako rand.py, przetestuj swój program za pomocą python rand.py | your_program
W Pythonie 3 działa zgodnie z oczekiwaniami, ale w Pythonie 2.7 pojawia się komunikat o błędzie po wyjściu mojego programu, ale dopiero po wszystkim, więc po prostu zignoruj komunikat o błędzie.
Przykładowe dane wyjściowe:
Oto, jak należy wydrukować talię, jeśli zdarzyło się, że została przetasowana w uporządkowanej kolejności:
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
Punktacja:
To jest golf golfowy. Najkrótszy kod wygrywa.
Przykładowy program:
Oto rozwiązanie Python 2.7, nie gra w golfa.
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))),
Odpowiedzi:
Rubin,
8987 znakówEdycja: poprzednia wersja
źródło
Python 122
Wyjaśnienie:
Nieużywane karty są przechowywane w D. To po prostu pobiera następny prawidłowy losowy indeks ze strumienia wejściowego i wyskakuje ten element z D.
Jeśli czegoś mi nie brakuje, nie powinno być stronniczości. Skrypt wyrzuci wszelkie nieprawidłowe indeksy>
len(D)
, ale nie spowoduje to odchylenia dla niższych liczb, ponieważ każde kolejne pop zmniejszy indeks każdego elementu obok i.źródło
Perl, 80 znaków
oto kolejna implementacja, która nie cierpi z powodu błędu i ma dwa znaki krótsze:
stara implementacja (82 znaków):
stary opis wdrożenia:
źródło
sort
, co spowoduje odchylenie w kierunku kolejności alfabetycznej.C,
197178161 znakówEDYCJA : Używając nowej funkcji losowej, która jest znacznie krótsza - odczytuje 4-cyfrową liczbę całkowitą
s
i używas%64
. Każda 6-cyfrowa liczba dziesiętna złożona tylko z 0 i 1,%64
daje unikalny wynik, więc losowość jest dobra.Takie podejście zużywa znacznie więcej losowych bitów, ale jest znacznie krótsze.
Podstawowa logika jest prosta - zainicjuj tablicę 52 liczb całkowitych za pomocą 0..51, losuj (losowo zamień element x na inny z zakresu 0..x), sformatuj wydruk (n / 4 = pozycja, n% 4 = kolor) .
Jedna pętla, która działa 104 razy, wykonuje inicjalizację (pierwsze 52 przebiegi), tasowanie i drukowanie (ostatnie 52 przebiegi).
Liczba losowa jest generowana przez ciągnięcie
n
losowych bitów, dopóki1<<n
nie osiągnie przynajmniej pożądanego maksimum. Jeśli wynik jest większy niż maksymalny - spróbuj ponownie.źródło
s>7?"ATJQK"[s-8]:s+50
jest dłuższe niż proste"A23456789TJQK"[s]
. Po drugie możesz użyćt/4
it%4
zamiastt%13
it/13
.t
powrotem do tablicy podczas wysyłaniapowłoka unix ~ 350
Nie jest to ani krótkie, ani ładne, ani wydajne, ale zastanawiałem się, jak trudno byłoby to zrobić za pomocą standardowych narzędzi powłoki Unix.
Ta odpowiedź dzieli nieskończony ciąg binarny na 6 bitów i wybiera tylko te, które są w prawidłowym zakresie (1-52), tutaj nieskończony ciąg binarny jest symulowany przez urandom i xxd:
Siekanie i selekcja odbywa się za pomocą fold, sed i bc:
Powoduje to utworzenie linii takich jak:
Które można skierować do bc.
Z tego strumienia liczb sekwencja talii jest wybierana w następujący sposób (używam zsh, ale większość współczesnych powłok powinna być przystosowana do tego):
Losowa sekwencja numerów musi teraz zostać zmieniona na nazwy kart. Sekwencję nazw kart można łatwo wygenerować za pomocą GNU równolegle:
Łączenie danych wyjściowych z dwóch ostatnich poleceń z wklejaniem i sortowaniem według liczb:
Całość jako jeden monstrualny jednowarstwowy (testowany tylko w Zsh):
Edytuj - dodana wersja bash
Oto wersja, która działa w bash. Usunąłem powłokę,
{ }
a indeksy tablic są oparte na zerach. Pustość tablicy jest sprawdzana za pomocą rozszerzania parametrów, nieco bardziej wydajna, a także stosowana w powyższym przykładzie.źródło
K&R c - 275
char
literałówint
literałamiGra w golfa:
Bardzo brutalna siła tutaj. Właśnie odczytałem dziewięć bitów z wejścia, aby utworzyć minimalne wyjście RNG i dokonałem zwykłej redukcji modułu przerysowania, jeśli nieużywane wartości na końcu, aby uzyskać jednolity wynik, aby zasilić losowe wybieranie.
Ta wersja bez gry w golfa różni się tym, że pobiera dane wejściowe z
/dev/urandom
opisanego formatu wejściowego, a nie z niego.źródło
"TJQKA"
i"cdhs"
?int
s. Rozumiem. Może nadal warto, aby zapisać wszystkie znaki interpunkcyjne. Może nawet czynnikchar
out ofgetchar
aputchar
z szalonej postaci pasty makro ...#define N
i kończyć nową linią, która liczy się jako postać i to 11, plus kawałek, który zastępujesz. Z pewnością jest kilka innych znaków zastępujących niektóre lub wszystkie literały znakowe literałami int, ale tutaj jest już późno ... może zrobię to innym razem.PHP, 158 znaków
Dodano nowe linie, aby blok kodu nie zyskał pasków przewijania, można je bezpiecznie usunąć.
Zanim dostanę polecenie dodania a
<?php
, daj znać, że możesz łatwo wywołać PHP bez tego znacznika, używając:cat golf.php | php -a
Grał w golfa i skomentował:
Występują dwa oczekiwane błędy, które nie wpływają na wynik programu.
Po pierwsze, ponieważ
$a
nie został zainicjowany, ale wartość NULL jest konwertowana na 0, a program kontynuuje działanie.Drugi polega na tym, że strumień znaków wydaje się skądś otrzymywać nową linię, nawet jeśli nie jest dostarczony (dobry stary PHP), i jest to niezdefiniowany indeks w tablicy. Jest to ostatni znak wejścia i nie wpływa na wynik.
źródło