Musisz wygenerować losowe 18-dołkowe pole golfowe.
Przykładowe dane wyjściowe:
[3 4 3 5 5 4 4 4 5 3 3 4 4 3 4 5 5 4]
Zasady:
- Twój program musi wypisać listę długości otworów dla dokładnie 18 otworów
- Każdy otwór musi mieć długość 3, 4 lub 5
- Długości otworów muszą sumować się do 72 dla całego kursu
- Twój program musi być w stanie wygenerować każdą możliwą konfigurację otworu z pewnym prawdopodobieństwem różnym od zera (prawdopodobieństwo każdej konfiguracji nie musi być równe, ale w takim przypadku możesz śmiało domagać się dodatkowego uznania)
4
, a jedyne możliwości są3
,4
albo5
, zajęcia możliwe rozwiązania są {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
}. Można to obliczyć za pomocąnCr(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
. Oznacza to, że w przybliżeniu11.4%
wszystkie możliwe kombinacje są poprawnymi rozwiązaniami(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)
daje44152809L
Odpowiedzi:
k (
18 1716 znaków)Wracając do pierwotnego podejścia, uznanie dla CS za ulepszenie.
Inne podejście (17 znaków), ta sama metoda co rozwiązanie J, H / T do CS
Stara wersja:Niewrażliwy na przepełnienie stosu i działa w ustalonej ilości miejsca.
źródło
K, 28
źródło
J,
201817 znakówDziała to w taki sam sposób, jak poprzednia odpowiedź, z tym wyjątkiem, że 9 losowych cyfr ma wartość 0 lub 1 i są negowane przed dodaniem. Oznacza to, że jest ich tyle,
-1
ile jest1
. Dodanie 4 daje mi listę3
S,4
S i5
S, które sumują się do 72 za każdym razem.Poprzednia odpowiedź:
Generuje pierwsze 9 dołków losowo
?9#3
, a następnie kopiuje i odwraca je(,2-])
(zamienia 3 w 5, a 5 w 3), aby wygenerować końcową 9. To gwarantuje, że suma wyniesie 72 (ponieważ każde 3 będzie miało pasujące 5 średnia suma na dołek wyniesie 4 i 4x18 = 72). Następnie losowo tasuje wynik,({~?~@#)
aby upewnić się, że każda kombinacja jest możliwa.źródło
16-bitowy kod maszynowy x86 w systemie MS-DOS - 45 bajtów
Hexdump:
Kod binarny Base64:
Rzeczywisty kod źródłowy z kilkoma komentarzami:
Skompiluj
nasm 18h.asm -o 18h.com
i uruchom pod MS-DOS (lub Dosbox) lub NTVDM z 32-bitowej wersji Windows.Przykładowe dane wyjściowe:
źródło
Mathematica
71 68 6660Z 6 znakami zapisanymi według sugestii Tally.
Wszystkie możliwe wyniki są możliwe, ale nie są równie prawdopodobne.
Analiza
produkuje wszystkie 10 możliwych partycji (kombinacje, nie permutacje) 72 na 18 elementów składających się z 3, 4 i 5.
RandomChoice
wybiera jeden z nich.RandomSample
zwraca permutację tego wyboru.źródło
R - 41
Algorytm jest podobny do @ sgrieve's.
źródło
GolfScript (26 znaków)
Istnieją pewne oczywiste podobieństwa z rozwiązaniem Ilmari, ale także pewne oczywiste różnice. W szczególności wykorzystuję fakt, że średnia wartość par wynosi 4.
źródło
{;0{3.rand+.@+}18*])72-}do
siebie, ale nie mogłem wymyślić, jak to zrobić dalej. +1.Python 77
Kod
Wynik
Import naprawdę zabija to rozwiązanie. Używa numpy do generowania 18 liczb między 3 a 5 i ciągle generuje listy, dopóki suma listy nie wyniesie 72.
źródło
GolfScript, 27 znaków
Używa tej samej metody próbkowania odrzucenia, co rozwiązanie Pythona w sgrieve. Zatem każde prawidłowe wyjście jest równie prawdopodobne.
źródło
Q (25 znaków)
Oryginał (27)
Próbka wyjściowa
Nieznacznie krótszy (25)
źródło
JavaScript,
666461 znakówMocno zainspirowany TwoScoopsofPig (PHP) i Joe Tuskan (JS).
źródło
s!=72
możnas-72
uratować jeden znak. Ostatni środkowy dwukropek;a
nie jest też potrzebny na kolejny znak.for(i=x;i;i--)
przedtem nie widziałem , żeby oszczędził 2 znakifor(i=0;i<x;i++)
, dzięki stary!Python 2, 70 bajtów
edytować:Oto kolejny, podobny do rozwiązania sgrieve:
Python 2, 73 bajty + równe prawdopodobieństwo
źródło
JavaScript,
1169965 bajtówfor(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
źródło
i is not defined
.Python,
128120116 znakówimport
instrukcje wciąż są zabójcami długości (23 znaków tylko w celu zaimportowania 2 funkcji w przestrzeni nazw)Mam nadzieję, że nie będziesz potrzebować wyniku w najbliższej przyszłości, ponieważ ten kod najpierw ocenia wszystkie możliwe rozwiązania, zanim wybierzesz jedno losowo. być może najwolniejsze rozwiązanie tego problemu.
Zgłaszam dodatkowe podziękowania za równe prawdopodobieństwo każdej konfiguracji ...
źródło
import random,itertools
import random as r,itertools as i
następnie użyjr
ii
zamiastrandom
iitertools
. Użyj18*[0]
zamiastrange(18)
i[3,4,5,6]
zamiastrange(3,6)
:)choice()
funkcją. to również powoduje, że ten kod jest tak wolny ...PHP - 77 znaków
Podobnie jak w przypadku rozwiązania sgrieve, buduje listę 18 dołków, sprawdza całkowitą wartość par i drukuje ją lub odrzuca i próbuje ponownie. Co dziwne, nasze dwa rozwiązania są tej samej długości.
Dosyć denerwujące jest to, że PHP nie oferuje funkcji tablicowych o zwięzłej nazwie. Zabijają mnie Array_sum i print_r. Sugestie mile widziane.
źródło
+=
.<?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);
{}
(ponieważ składnia PHP wyraźnie na to pozwala).Ruby 1.9 (62 znaki)
Szyny (55 znaków)
W
$ rails c
REPL (w dowolnym folderze Rails):Uwaga: Działa z Ruby 1.8, jeśli używasz
shuffle[0]
zamiastsample
.źródło
(1..18).map{rand(3)+3}
aby uzyskać losową tablicę;)Lisp (
7869 znaków)(do ((c () (mapcar (lambda (x) (+ 3 (random 3))) (make-list 18)))) ((= (Apply '+ c) 72) c))Jest raczej podobny do rozwiązania Pythona w sgrieve.
Zacznij od c jako NIL, sprawdź sumę 72,
do
„funkcja inkrementacji” dla c generuje listę 18 liczb od 3 do 5, sprawdź ponownie 72, spień, spłucz, powtórz.Oglądanie
do
iloop
fajna gra w golfa jest odświeżające .źródło
C (123 znaki) - wysiłek na rzecz wydajności
Przeciągnij przez wc, a wygeneruje wszystkie 44152809 rozwiązania w ciągu 10 sekund ...
No cóż - nie przeczytałem poprawnie pytania - ale biorąc pod uwagę, że generujemy wszystkie rozwiązania, wybranie losowego z jednakowym prawdopodobieństwem jest ćwiczeniem skryptowym: P
źródło
Clojure - 55
Całkiem fajna sztuczka .... wykorzystuje matematyczną strukturę problemu, że musi być dokładnie tyle samo 3 dołków, co 5 dołków.
źródło
Python 83
Jak rozwiązanie sgrieve, ale bez numpy
Gra w golfa Adrien Plisson: 120-> 108 znaków
MATLAB 53
Wyjście :
źródło
randi([3,5],1,18)
zamiast3+floor(rand(1,18)*3)
Java (61 znaków)
Przykładowe dane wyjściowe:
źródło
C (94 znaki)
s=0
Na linii 1, nie może być wymagane, bo jakie są szanse niezainicjowany int będzie równa 72? Po prostu nie lubię odczytywać niezainicjowanych wartości w prostej C. Ponadto prawdopodobnie wymaga to uruchomieniarand()
funkcji.wynik
źródło
Skrypt powłoki Bash (65 znaków)
( shuf pochodzi z pakietu coreutils GNU. Również dzięki Gareth.)
źródło
C # (143 spacje):
źródło
new Guid()
tworzy pusty GUID. Aby faktycznie wygenerować unikalny identyfikator GUID, musisz wywołać metodę statycznąGuid.NewGuid
.Math.Random
, to jestSystem.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 znaków.źródło
[1..n]>>[r]
jest nieco krótszy niżreplicate n$r
.sequence
namapM
.Perl, 74
Alternatywne rozwiązanie:
źródło
TXR (99 znaków)
To wyrażenie generuje nieskończoną leniwą listę liczb losowych od 3 do 5:
Reszta logiki to prosta pętla, która sprawdza, czy pierwszych 18 elementów tej listy sumuje się do 72. Jeśli nie, usuwa element i próbuje ponownie.
for
Pętla zawiera ukryte blok nazwienil
więc(return ...)
mogą być stosowane do zakończenia pętli i wartość.Zauważ, że długość 99 znaków zawiera końcowy znak nowej linii, który jest wymagany.
źródło
APL 12
Zauważ, że mam indeks pochodzenia ustawiony na 0, co oznacza, że tablice zaczynają się od 0. Możesz ustawić to za pomocą
⎕IO←0
.źródło
R, 42 bajty
sample
, domyślnie rysuje równomiernie wśród możliwych wartości (tutaj3 4 5
).r=T
oznaczareplace=TRUE
i pozwala na próbkę z wymianą.źródło
CJam,
1714 bajtówCJam jest nowszy od tego wyzwania, ale i tak nie jest to najkrótsza odpowiedź, więc to naprawdę nie ma znaczenia.
Sprawdź to tutaj.
Aby utrzymać łącznie 72, każdy
3
musi być sparowany z5
. Oto, jak to działa:źródło