Problem
Zaczynając od n=2
kości:
- Rzuć
n
kośćmi, przy czym każda liczba od 1 do 6 jest równie prawdopodobna na każdej kości. - Sprawdź, czy ich suma jest równa najbardziej prawdopodobnej sumie
n
kości3.5*n
.- Jeśli są równe, zakończ.
- W przeciwnym razie wydrukuj
n
i powtórz od początku zn+2
kostkami
Twój kod nie musi dokładnie wykonywać tej procedury, ale powinien dać losowy wynik probabilistycznie równoważny, w oparciu o naszą definicję losowości .
Twój program powinien wypisać wszystkie liczby we własnej linii; na przykład, jeśli program uzyskał do 8 kości i rzucił najbardziej prawdopodobną liczbę za pomocą 8 kości, wynik byłby następujący:
2
4
6
Przykładowy bieg
Na 2 kościach 7
jest najbardziej prawdopodobna suma. Powiedzmy, że wyrzucono liczby 2
i 3
. Następnie wydrukowałbyś 2
.
Na 4 kościach 14
jest najbardziej prawdopodobna suma. Powiedzmy, że numery były walcowane 3
, 4
, 2
, i 5
. Zatem suma jest 14
, więc program zakończyłby się tutaj.
Ostateczne wyjście w tym przypadku to "2"
.
Zasady
- golf-code, więc najkrótsze rozwiązanie w bajtach wygrywa
- Obowiązują standardowe luki
- Definicja meta losowości dotyczy
- Możesz korzystać zarówno z funkcji, jak i programów
2, 4, 6, 8, ...
każdym razem wyrzucać tyle kości, aż trafię w najbardziej prawdopodobną liczbę dla tej iteracji?Odpowiedzi:
Python 2 , 70 bajtów
Wypróbuj online!
Sztuczka polega na obliczeniu sumy przez
eval
wprowadzenie łańcucha, który wyglądaz
n
kopiami wyrażenia połączonymi. Dorandrange(6)
wyjścia z liczbą losową[0,1,2,3,4,5]
, która jest przesunięta w dół przez2.5
mieć średnią0
. Gdy suma if0
,while
warunek kończy się niepowodzeniem i pętla kończy się.Alternatywne użycie
map
było 4 bajty dłuższe:Znalazłem kilka wyrażeń o takiej samej długości dla kości przesuniętej do zera, ale nie krótszej
źródło
MATL , 13 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Galaretka ,
1914 bajtów-5 bajtów z pomocą Dziurawej Zakonnicy (przejście od zliczania do rekurencji)
Pełny program drukujący wyniki oddzielone znakami nowej linii (drukowana jest również dodatkowa spacja i znak nowej linii oraz błędy programu na końcu).
Wypróbuj online! - za każdym razem, gdy 6 kości zostanie przekroczonych, TIO zabija to z powodu zużycia pamięci, ale działa w zasadzie - zajmuje to również około 40 sekund.
Bardziej przyjazna wersja 15 bajt, który nie trwa tak długo albo wymagają tak dużo pamięci jest dostępny tutaj .
W jaki sposób?
Rekurencyjnie rzuca 2 dodatkowymi kośćmi, aż suma twarzy zmniejszonych o 3,5 wynosi zero, wypisując liczbę kostek w miarę ich przesuwania, gdy osiągnie zero, próbuje użyć znaku spacji, powodując błąd typu.
źródło
n
s. OK, może to da się uratować. Myślałem, że masz na myśli sumy :)TI-BASIC, 28 bajtów
Wyjaśnienie
randInt(1,6,N)
generuje listę N liczb losowych od 1 do 6mean(randInt(1,6,N)-3.5
zostaje obniżona średnia z rzutów o 3,5While
trwa do momentu, aż średnie wyrażenie wyniesie zero (najbardziej prawdopodobna suma)źródło
R , 49 bajtów
sample(6,n,T)
generujen
(pseudo) losowe próbki z zakresu1:6
z zamiennikiem. Odejmowanie 3,5 od każdego elementu daje wynik, którysum
wynosi 0 (falsey) wtedy i tylko wtedy, gdy jest to najczęstsza wartość.Wypróbuj online!
Pomija rzuty nieparzystymi kośćmi.
źródło
Java 8,
123149113108 bajtówLub 107 bajtów , jeśli używamy jak nieużywany parametr zamiast.
Object null
+26 bajtów na usunięcie błędu, poprawnie wskazane przez @Jules w komentarzach.
-41 bajtów dzięki wspaniałemu myśleniu @ OliverGrégoire !
Wyjaśnienie:
Wypróbuj tutaj.
źródło
r
jest równy,3.5*n
program powinien zakończyć się bezpośrednio. Ale jeśli dobrze zrozumiem funkcję, wydrukuje sięn
ostatni raz przed zakończeniem.n
o 2. Więc zawierał dwa błędy (1-12 zamiast 2-12; i rzucanie kostkami jak 2 -> 2 -> 4 -> 6 -> ..., zamiast 2 -> 4 -> 6 -> ...). Jednak drukował poprawnie, ponieważ nie poszedłby,System.out.println(n),n+=2
gdybyr
był rzeczywiście równy3.5*n
.()->{for(int n=2,s=0,e=7,i;s!=e;n+=2,e+=7){for(i=n,s=n;i-->0;)s+=Math.random()*6;if(s!=e)System.out.println(n);}}
. Popraw także w odniesieniu do komentarza Julesa i mojego wyjaśnienia.n
jest kostką,s
jest sumą,e
oczekuje się,i
jest indeksem. Wreszcie, suma zaczyna się od,n
aby uniknąć+1
,n
razy is!=e
jest powtarzana, ponieważ po prostu nie wiem, jak uniknąć tego przypadku.()->{for(int i=0,s=1,j;s!=i*7;){for(j=s=++i*2;j-->0;)s+=Math.random()*6;if(s!=i*7)System.out.println(i*2);}}
05AB1E ,
2220 bajtów-2 bajty dzięki Emignie
Wypróbuj online!
Wyjaśnienie
źródło
O
po.R
można usunąć)
is
.R,
484442 bajtów5-bajtowa poprawa odpowiedzi Giuseppe .
To (ab) wykorzystuje fakt, że
F
jest to zmienna domyślnie przypisana, doFALSE
której wymusza się0
i może być następnie zwiększana, co oszczędza nam potrzeby inicjalizacji zmiennej przeciwnej.źródło
sample(6)
zamiast,sample(1:6)
ale wykreślono 44 to wciąż 44 .... codegolf.stackexchange.com/a/82343/67312PHP , 75 bajtów
Wypróbuj online!
źródło
5^2/++$i*$d+=rand()%6
jest nieco krótszym warunkiem dla pętli. Wydaje mi się również, że bieżąca pętla niepoprawnie wychodzi z gry, jeśli pierwsza rzucona „kostka” ma wartość „1” (generuje 0 na początku$d
).GolfScript , 41 bajtów
Wypróbuj online!
źródło
Mathematica, 47 bajtów
-5 bajtów z LLlAMnYP
źródło
05AB1E , 17 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Partia, 109 bajtów
Raczej denerwująco
random
jest magiczną zmienną środowiskową, więc zastępuje ją ona losową wartością podczas ekspansji środowiska, co zwykle dzieje się przed uruchomieniem pętli for.call
sprawia, że dzieje się to za każdym razem przez pętlę, ale następnie należy podwoić%
znaki, aby zapobiec rozszerzeniu przed pętlą. Zabawa zaczyna się, ponieważ chcemy modulować wynik o 6, co wymaga prawdziwego%
znaku, który teraz należy podwoić dwukrotnie. Wynik to sześć kolejnych%
sekund.źródło
JavaScript (ES2015),
7578 bajtówWysyła ciąg wyników oddzielonych znakami nowej linii
Edycja: zapisano bajt dzięki Shaggy, dodano 4 bajty, aby uruchomić funkcję o 2
Wyjaśnienie
źródło
'\n'
.n=2
, zamiast tego musisz podać początkową liczbę kości, gdy funkcja jest wywoływana.php - 89 znaków
źródło
$r=0;
użyciaecho
zamiastprint
$n."
pisać jako"$n
i dla pętli zamiast, podczas gdy pozwala zrobić coś w pętli po lub wcześniej, aby zaoszczędzić trochę bajtówC (gcc) ,
8480797775807876 bajtówWypróbuj online!
źródło
Haskell
133132 bajtyPodziękowania dla @Laikoni za sugestie w komentarzach poniżej.
źródło
return()
mogą być skracanepure()
iputStrLn$show
mogą być skracaneprint
.div k 2 then
może byćdiv k 2then
ido print k;s(k+2)
jestprint k>>s(k+2)
.Oktawa 55 bajtów
Zainspirowany odpowiedzią Andrewarchiego. Jeśli ktoś ma jakieś wskazówki, aby go nawet skrócić, są mile widziane.
źródło
Pyth , 20 bajtów
Wypróbuj online!
źródło
QBIC , 40 bajtów
Ta postawa dosłownie robi to, o co prosi wyzwanie; wydaje się najkrótszą drogą do prawidłowej dystrybucji.
Wyjaśnienie
źródło
Rexx (Regina) , 78 bajtów
Wypróbuj online!
źródło
JavaScript (ES6) - 69 znaków
Objaśnienie :
i:
źródło
Oblicz2 0,7,
119118111 bajtówbez golfa:
Mógłbym obejść się bez Math.Int (), ale niestety w 0.7 funkcje Random (). Next () mają błąd, w którym wszystkie zwracają podwójne zamiast ints. Zostało to naprawione, ale dopiero po opublikowaniu tego pytania. Nic nie wygram, ale hej, niezły dowód koncepcji.
Edytować:
Edycja2:
usunięto var r i utwórz nowy Losowo tam, gdzie jest potrzebny (-4 bajty)
zmieniono i = 0, d = 0 na i = d = 0 (-2 bajty)
inkrementowane i po sprawdzeniu (-1 bajt)
źródło
Ruby , 52 bajty
Wyjaśnienie
Wypróbuj online!
źródło
s=0
na przód pętli i użyciex.times
. Oznacza to, że suma jest resetowana za każdym razem, a następniex
rzucane są kości, co powinno mieć prawidłowy rozkład. Napiszę wyjaśnienie mojego kodu.JavaScript, 87 znaków
Test ze
console.log
zamiastalert
:źródło
lua, 102 bajty
Lub bardziej czytelna wersja
Bardziej cheatyczna wersja na 96 bajtów
To działa prawie tak samo jak pierwsze, ale ponownie wykorzystuje rzutki z wcześniejszych połączeń. Z tego powodu mogę usunąć pętlę for. Oba są testowane w lua 5.2
źródło
Perl 6 , 48 bajtów
źródło
PHP, 51 bajtów
źródło