Zobaczmy, jak dobry jest Twój wybrany język przy przypadkowej losowości.
Podane 4 znaków, A
, B
, C
, i D
, lub ciąg 4 znaków ABCD
jako wejścia , jedno wyjście z bohaterów z następującymi prawdopodobieństw:
A
powinien mieć szansę wyboru 1/8 (12,5%)B
powinien mieć szansę wyboru 3/8 (37,5%)C
powinien mieć szansę wyboru 2/8 (25%)D
powinien mieć szansę wyboru 2/8 (25%)
Jest to zgodne z następującym układem maszyny Plinko :
^
^ ^
^ ^ ^
A B \ /
^
C D
Twoja odpowiedź musi podjąć prawdziwą próbę przestrzegania opisanych prawdopodobieństw. Odpowiednie wyjaśnienie, w jaki sposób obliczane są prawdopodobieństwa w twojej odpowiedzi (i dlaczego uwzględniają specyfikacje, pomijając problemy z pseudolosowością i dużymi liczbami) jest wystarczające.
Punktacja
To jest golf golfowy, więc wygrywa najmniej bajtów w każdym języku !
ceil(abs(i - 6)/ 2.0)
zamapuje indeks z0-7
na indeks0-3
z odpowiednim rozkładem (0 111 22 33
) dla tego wyzwania ...Odpowiedzi:
Lean Mean Bean Machine ,
554342 bajty-13 bajtów dzięki Alexowi Vargie
Mam nadzieję, że nie macie nic przeciwko, żebym odpowiedział na moje pytanie po zaledwie 2 godzinach, ale bardzo wątpię, czy ktokolwiek planował opublikować odpowiedź w LMBM.
To dosłownie odzwierciedla układ Plinko pokazany w OP, obrócony w poziomie, aby zmniejszyć niepotrzebne białe znaki.
źródło
Galaretka , 6 bajtów
Łącze monadyczne, zawierające listę czterech znaków i zwracającą jeden z opisanym rozkładem prawdopodobieństwa.
Wypróbuj online!
W jaki sposób?
źródło
ṁ
!Cubix ,
3924222119 bajtówZobacz w tłumaczu online!
Odwzorowuje to na następującą sieć kostek:
Implementacja dystrybucji losowej Objaśnienie
Cubix to język, w którym wskaźnik instrukcji porusza się po powierzchniach sześcianu, wykonując napotkane polecenia. Jedyną formą losowości jest polecenie
D
, które wysyła adres IP w losowym kierunku: równa szansa na1/4
każdy sposób.Możemy jednak użyć tego do wygenerowania prawidłowych ważonych probabilitów: używając
D
dwukrotnie. PierwszyD
ma1/4
kierunek do drugiegoD
. Ta sekundaD
ma jednak dwa kierunki zablokowane strzałkami (> D <
), które wysyłają wskaźnik instrukcji z powrotemD
do wyboru innego kierunku. Oznacza to, że istnieją tylko dwa możliwe kierunki, z których każdy ma1/8
ogólną szansę na zaistnienie . Można to wykorzystać do wygenerowania poprawnego znaku, jak pokazano na poniższym schemacie:(Zauważ, że w rzeczywistym kodzie strzałka po prawej stronie jest zastąpiona lustrem
|
).Objaśnienie kodu
Wskaźnik instrukcji zaczyna się po prawej stronie, od znaku
i
, w prawo. Wykonuje toi
, przyjmując pierwszy znak jako dane wejściowe, a następnie przechodzi doD
, rozpoczynając pokazany powyżej losowy proces.Char A: W przypadku, gdy pierwszy
D
wysyła nas na wschód, a drugi na południe, musimy wydrukować postać A. To jest już na stosie od pierwszegoi
. Wykonano następujące czynności:\
- Odbij adres IP, aby skierował się na wschódi;
- Wprowadź dane, a następnie wciśnij je ponownie (no-op)U
- Wykonaj zawracanie, dwukrotnie obracając IP w lewoo
- Wyjście TOS, znak A@
- Zakończ programChar B: Jeśli pierwsza lub druga
D
głowa skieruje się na północ, musimy wygenerować znak B, który będzie następnym wejściem. Obie ścieżki wykonują następujące polecenia:^
- Idź na północ<
- Kieruj się na zachód, owijając się wokół ...i
- Wprowadź kolejne dane, znak Bo
- Wyjście TOS, znak B;
- Pop TOS@
- Zakończ programChar C: Jeśli pierwszy
D
wysyła nas na zachód, wykonywane są następujące czynności:i
- Wprowadź kolejne dane, znak Bi
- Wprowadź kolejne dane, znak Co
- Wyjście TOS, znak C@
- Zakończ programChar D: Jeśli pierwszy
D
wysyła nas na południe, wykonywane są następujące czynności:i
- Wprowadź kolejne dane, znak B..
- Dwa no-opsi
- Wprowadź kolejne dane, znak C|
- To lustro odbija wschód-zachód, ale IP kieruje się na północ, więc przechodzimy przez niego.^
- Łączy się to ze ścieżką wybraną dla znaku B. Jednakże, ponieważ podjęliśmy już dwa dane wejściowe, czwarty znak (znak D) zostanie wydrukowany.źródło
Python , 50 bajtów
Nienazwana funkcja przyjmująca i zwracająca ciągi (lub listy znaków).
Wypróbuj online!
W jaki sposób?
random.choice
wybiera losowy element z listy, więc funkcja tworzy ciąg z poprawnym rozkładem, to znaczy podanym"ABCD"
,"ABCD"[:2] = "AB"
plus"ABCD"[1:]*2 = "BCD"*2 = "BCDBCD"
który jest"ABBCDBCD"
.źródło
R , 31 bajtów
Odczytuje znaki z
stdin
oddzielonych spacjami.sample
losuje próbki z pierwszego wejścia w ilości drugiego wejścia (so1
), (opcjonalny argument zastępczy), z wagami podanymi przez ostatni argument.Wypróbuj online!
Spróbuj
n
razy!W tym ostatnim kodzie próbuję
n
czasy (ustawionen
w nagłówku) z zamiennym ustawionym naT
rue (domyślnie jest to fałsz), zestawiam wyniki i dzielę według,n
aby zobaczyć względne prawdopodobieństwa danych wejściowych.źródło
PHP, 28 bajtów
Uruchom jako potok z
-nR
.01112233
w bazie-4 jest5551
dziesiętnie ...źródło
7030
należy do moich ulubionych.Java 8,
5344 bajtyJest to
Function<char[], Character>
.Wypróbuj online! (Program testu przebiega powyższa funkcja 1000000 razy i wysyła doświadczalne prawdopodobieństw wyboru
A
,B
,C
iD
).Ogólna idea jest tu znaleźć jakiś sposób, aby mapować
0-7
do0-3
, na przykład, że0
na wyświetlaczu pojawi się1/8
czas,1
pojawia3/8
razy,2
pojawia2/8
razy i3
pojawia2/8
razy.round(abs(k - 6) / 2.0))
działa w tym przypadku, gdziek
jest losową liczbą całkowitą w zakresie[0,8)
. Powoduje to następujące mapowanie:Która, jak widać, wyniki w indeksach
0 111 22 33
, co daje pożądany prawdopodobieństwa1/8
,3/8
,2/8
i2/8
.Ale poczekaj! Jak na świecie
-~Math.abs(k-6)/2
osiąga ten sam wynik (ponownie, gdziek
jest losowa liczba całkowita w zakresie[0,8]
)? To rzeczywiście bardzo proste ...(x+1)/2
(podział całkowita) jest tym samym, coround(x/2)
ix + 1
jest to samo, co-~x
. Chociażx+1
i-~x
mają tę samą długość, w powyższej funkcji lepiej jest użyć,-~x
ponieważ-~
ma ona pierwszeństwo, a zatem nie wymaga nawiasów.źródło
Math.abs
akceptuje również podwajanie jako parametr):s->s[-~(int)Math.abs(Math.random()*8-6)/2]
( 42 bajty ).APL, 14 bajtów
Wprowadź jako ciąg.
W jaki sposób?
1 3 2 2\⊢
- powtórz każdą literę x razy ('ABCD'
→'ABBBCCDD'
)⊃
- weź element pod indeks ..(?8)
- losowo 1-8źródło
⎕U2378
.Węgiel drzewny , 11 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu, chociaż prawie go nie potrzebujesz;
‽
wybiera losowy element,⟦⟧
tworzy listę, a zmiennymi są te, które otrzymują odpowiednie litery wejściowe (w odwrotnej kolejności, bo tak mi się podobało).źródło
Pyth ,
87 bajtówUżywa dokładnie tego samego algorytmu, co w mojej odpowiedzi w języku Python.
Wypróbuj tutaj!
Pyth ,
108 bajtówUżywa dokładnie tego samego algorytmu, co odpowiedź Pythona Jonathana Allana.
Wypróbuj tutaj!
Wyjaśnienie
O
- Pobiera losowy element ciągu wykonanego przez dodanie (z+
):<Q2
- Pierwsze dwa znaki ciągu.*2t
Podwoj pełny ciąg (*2
) z wyjątkiem pierwszego znaku (t
).Zastosowanie tego algorytmu do
ABCD
:<Q2
bierzeAB
.*2t
trwaBCD
i podwaja go:BCDBCD
.+
łączy dwa ciągi:ABBCDBCD
.O
przyjmuje losową postać.-2 dzięki Leaky Nun (drugie rozwiązanie)
-1 dzięki mnemonic (pierwsze rozwiązanie)
źródło
>Q1
staje siętQ
, co się stajet
.*2
ze+
i za pomocą wejścia niejawny dwukrotnie.y
zamiast tego, co nie działa na łańcuchy ...Galaretka , 8 bajtów
Wypróbuj online!
Usuń,
X
aby zobaczyć"ABBBCCDD"
.X
Wybiera element losowy.źródło
C # (.NET Core) ,
7655 bajtówWypróbuj online!
Moja pierwsza odpowiedź napisana bezpośrednio w TIO przy użyciu mojego telefonu komórkowego. Podnieść do właściwego poziomu!
Objaśnienie: jeśli oryginalny ciąg znaków to „ABCD”, funkcja tworzy ciąg „ABCDBBCD” i pobiera z niego losowy element.
źródło
JavaScript 35 bajtów
Pobiera ciąg znaków
ABCD
jako dane wejściowe, generujeA
1/8 czasu,B
3/8 czasu,C
1/4 czasu iD
1/4 czasu.Wyjaśnienie
źródło
05AB1E , 5 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
> <> ,
252219 bajtówWypróbuj online! lub obejrzyj na placu zabaw dla ryb !
Krótki przegląd> <>: jest to język 2D z rybą, która przepływa przez kod, wykonując instrukcje w miarę upływu czasu. Jeśli dojdzie do krawędzi kodu, zawija się na drugą stronę. Ryba zaczyna się w lewym górnym rogu, poruszając się w prawo. Losowość jest trudna w> <>: jedyną losową instrukcją jest to
x
, która losowo określa kierunek ryby z góry, dołu, lewej i prawej (z jednakowym prawdopodobieństwem).Na początku programu ryba wczytuje dwa znaki wejściowe za pomocą
i_i
(każdyi
wczytuje znak ze STDIN do stosu i_
jest poziomym lustrem, które ryba ignoruje teraz). Następnie osiągax
.Jeśli
x
ryba wyśle rybę w prawo, wczyta jeszcze jedną postać (trzecią), wydrukuje jąo
i zatrzyma się na;
. Lewy kierunek jest podobny: ryba odczytuje dwie kolejne postacie (więc jesteśmy do czwartej), owija się w prawo, drukuje czwartą postać i zatrzymuje się. Jeśli ryba płynie, zawija i drukuje drugą postać, zanim zostanie odbita/
i zatrzymana. Jeśli płynie w dół, odbija się w lewo/
i uderza w innegox
.Tym razem dwa kierunki po prostu wysyłają rybę z powrotem do
x
(w prawo ze strzałką<
i w górę z lustrem_
). Ryba ma zatem 1/2 szansy na ucieczkęx
w każdym z pozostałych dwóch kierunków. Leftwards drukuje górny znak na stosie, który jest drugi, ale najpierw w dół zamienia dwa elementy na stosie$
, więc w tym kierunku drukuje się pierwszy znak.Podsumowując, drukowany jest trzeci i czwarty znak z prawdopodobieństwem 1/4; pierwszy znak ma prawdopodobieństwo 1/2 x 1/4 = 1/8; a drugi znak ma prawdopodobieństwo 1/4 + 1/2 x 1/4 = 3/8.
źródło
05AB1E , 8 bajtów
Wypróbuj online!
źródło
MATL ,
1210 bajtówWypróbuj online! Lub uruchom go 1000 razy (nieco zmodyfikowany kod) i sprawdź, ile razy pojawia się każdy znak.
Wyjaśnienie
Zmiany w zmodyfikowanym kodzie:
1000:"Gl3HH4$vY"1Zr]vSY'
1000:"...]
to pętla powtarzania1000
czasów.G
upewnia się, że dane wejściowe są wypychane na początku każdej iteracji.v
Musi więc zostać zastąpiony przez, aby połączyć4$v
tylko najwyższe4
liczby.v
konkatenuje1000
wyniki w wektor,S
sortuje go iY'
koduje w czasie wykonania. Daje to cztery litery i liczbę ich pojawienia się.źródło
05AB1E , 6 bajtów
Wypróbuj online!
Wyjaśnienie
Działa zarówno z listami, jak i łańcuchami.
źródło
C (gcc) ,
5049 bajtówWypróbuj online!
źródło
ABCD
to przykładowe wejście, twój kod powinien przyjmować 4 znaki (lub ciąg długości 4) jako dane wejścioweRubin,
34332927 bajtówZaoszczędź 2 bajty dzięki @Value Inc
Wprowadź jako cztery znaki
konstruuj tablicę
[B,B,C,D,A,B,C,D]
i próbkuj ją.spróbuj online!
spróbuj
n
razy! (Przekształciłem go w funkcję, aby łatwiej go powtarzać, ale algorytm jest taki sam)źródło
$*
jest pseudonimem dlaARGV
.Pyth, 7 bajtów
Zestaw testowy
O8
generuje liczbę losową od 0 do 7.| ... 1
stosuje logiczne lub z 1, konwertując 0 na 1 i pozostawiając wszystko inne takie same. Liczba na tym etapie to 1/2/8 czasu i 2, 3, 4, 5, 6, 7 lub 8 1/8 czasu.@z
indeksuje do ciągu wejściowego w tej pozycji. Indeksowanie odbywa się modulo na długości łańcucha, więc 4 indeksuje na pozycji 0, 5 na pozycji 1 i tak dalej.Prawdopodobieństwa to:
Pozycja 0: Liczba losowa 4. 1/8 czasu.
Pozycja 1: Losowa liczba 0, 1 lub 5. 3/8 czasu.
Pozycja 2: Losowa liczba 2 lub 6. 2/8 czasu.
Pozycja 3: Losowa liczba 3 lub 7. 2/8 czasu.
źródło
JavaScript,
3130 bajtów / 23 bajtyWidząc wcześniejszą odpowiedź asgallanta na Javascript, pomyślałem o JS. Tak, jak powiedział:
Mój jest:
Wyjaśnienie:
Od
Math.random()*8&7
tego dzieli się w następujący sposób:Wersja 2, 23 bajty
Ale potem dzięki Arnauldowi, który napisał po mnie, kiedy powiedział:
co, jeśli jest to rzeczywiście dozwolone, doprowadziło mnie do:
w którym
new Date%8
zastosowano tę samą tabelę podziału jak powyżej.I
%8
może też być&7
; wybierz swój. Jeszcze raz dziękuję, Arnauld.źródło
ngn / apl, 10 bajtów
?2 4
wybiera losowo parę liczb - pierwszą spośród 0 1 i drugą spośród 0 1 2 3⌈/
to „maksymalne zmniejszenie” - znajdź większą liczbę⎕a
to wielkie litery[ ]
indeksowaniezanotuj tabelę dla maks. (a, b), gdy a∊ {0,1} i b∊ {0,1,2,3}:
jeśli a i b są wybrane losowo i niezależnie, możemy podstawić 0123 = ABCD, aby uzyskać pożądany rozkład prawdopodobieństwa
źródło
Python 3 ,
64 5551 bajtów-9 bajtów dzięki @ovs
Wypróbuj online!
Wyjaśnienie
random.choice()
pobiera losowy znak ciągu, a jednocześnie(s*2)[1:]+s[1]
tworzyBCDABCDB
dane wejścioweABCD
, które mają 1/8A
s, 2/8C
s, 2/8D
s i 3/8B
s.źródło
random.choice
dla 55 bajtów:lambda s:choice((s[0]+s[1:]*3)[:8])
choice()
.QBIC , 27 bajtów
Wyjaśnienie
źródło
> <>, 56 bajtów
Wypróbuj online!
źródło
Chip , 60 bajtów
Wypróbuj online!
Każda trójka
?
wytwarza losowy bit. W pierwszym cyklu te bity są przepuszczane przez przełączniki powyżej (/
i\
) w celu ustalenia, którą wartość wyprowadzimy z tej tabeli:(gdzie
_
mogą być0
albo1
). Następnie przechodzimy wzdłuż wejścia w razie potrzeby, drukując i kończąc, gdy zostanie osiągnięta poprawna wartość.Duży alfabet na końcu jest kopiowany hurtowo z programu cat, to rozwiązanie po prostu tłumi dane wyjściowe i kończy działanie, aby uzyskać zamierzony efekt.
źródło
Rubinowy, 32 bajty
Całkiem proste ..?
Wypróbuj online!
źródło
Applesoft,
29ups, 32 bajtyMały przykład „retrocomputing”. Bądź ze mną, jestem w tym zupełnie nowy. Rozumiem, że to, co jest określane jako „dane wejściowe”, nie musi być liczone bajtowo. Jak stwierdzono w PO, dane wejściowe byłyby podawane jako „ABCD”. (Początkowo nie zdawałem sobie sprawy, że muszę określić otrzymywane dane wejściowe, które dodały 4 bajty, a resztę grałem w golfa.)
Pojęcia INPUT, RND, PRINT i MID $ są zakodowane wewnętrznie jako tokeny jednobajtowe.
Po pierwsze, X ma przypisaną losową wartość z zakresu 0 <X <4. Służy do wyboru jednego ze znaków z I $, zgodnie z (X <.5) + X + 1. Wartość pozycji znaku przyjmuje się jako okrojona ocena wyrażenia. X <.5 dodaje 1, jeśli X był mniejszy niż .5, w przeciwnym razie dodaj 0. Wyniki z X dzielą się następująco:
źródło
Common Lisp , 198 bajtów
Wypróbuj online!
Czytelny:
źródło