Losowo wybierz postać w stylu plinko

27

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 więc wygrywa najmniej bajtów w każdym języku !

Skidsdev
źródło
Czy możemy założyć, że wbudowana funkcja losowa w naszym wybranym języku jest losowa?
Pan Xcoder,
@ Mr.Xcoder w rozsądku, tak.
Skidsdev,
Czyli dla jasności dane wejściowe mają zawsze dokładnie 4 znaki i należy przypisać każdemu prawdopodobieństwu zgodnie z dokładnie zapewnionym układem Plinko? Generowanie układów Plinko lub ich symulowanie jest całkowicie niepotrzebne, o ile prawdopodobieństwa są prawidłowe z dokładnością podaną przez losowe źródło?
Kamil Drakari,
1
@KamilDrakari poprawne.
Skidsdev,
2
Niezbyt przydatne ze względu na jego długość, ale dowiedziałem się, że wyrażenie ceil(abs(i - 6)/ 2.0)zamapuje indeks z 0-7na indeks 0-3z odpowiednim rozkładem ( 0 111 22 33) dla tego wyzwania ...
Socratic Phoenix,

Odpowiedzi:

14

Lean Mean Bean Machine , 55 43 42 bajty

-13 bajtów dzięki Alexowi Vargie

  O
  i
  ^
 ^ ^
\ ^ ^
 i / U
 ii
 ^
i U
U

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.

Skidsdev
źródło
Nie wiem, jak to przetestować, ale to może działać: gist.github.com/anonymous/e537edc8c89a72f3631ef765b352b98d
Alex Varga
@AlexVarga ooh, który działa
Skidsdev
9

Galaretka , 6 bajtów

Ḋṁ7;ḢX

Łą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?

Ḋṁ7;ḢX - Link: list of characters, s  e.g. ABCD
Ḋ      - dequeue s                         BCD
 ṁ7    - mould like 7 (implicit range)     BCDBCDB
    Ḣ  - head s                            A
   ;   - concatenate                       BCDBCDBA
     X - random choice                     Note that the above has 1*A, 3*B, 2*C, and 2*D
Jonathan Allan
źródło
Sprytna sztuczka z !
Erik the Outgolfer
9

Cubix , 39 24 22 21 19 bajtów

.<.^iD>D|@oioi.\i;U

Zobacz w tłumaczu online!

Odwzorowuje to na następującą sieć kostek:

    . <
    . ^
i D > D | @ o i
o i . \ i ; U .
    . .
    . .

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 na 1/4każdy sposób.

Możemy jednak użyć tego do wygenerowania prawidłowych ważonych probabilitów: używając Ddwukrotnie. Pierwszy Dma 1/4kierunek do drugiego D. Ta sekunda Dma jednak dwa kierunki zablokowane strzałkami ( > D <), które wysyłają wskaźnik instrukcji z powrotem Ddo wyboru innego kierunku. Oznacza to, że istnieją tylko dwa możliwe kierunki, z których każdy ma 1/8ogólną szansę na zaistnienie . Można to wykorzystać do wygenerowania poprawnego znaku, jak pokazano na poniższym schemacie:

Obraz przedstawiający prawdopodobieństwo każdego kierunku

(Zauważ, że w rzeczywistym kodzie strzałka po prawej stronie jest zastąpiona lustrem |).

Objaśnienie kodu

        . <
        . ^
IP> i D > D | @ o i
    o i . \ i ; U .
        . .
        . .

Wskaźnik instrukcji zaczyna się po prawej stronie, od znaku i, w prawo. Wykonuje to i, przyjmując pierwszy znak jako dane wejściowe, a następnie przechodzi do D, rozpoczynając pokazany powyżej losowy proces.

  • Char A: W przypadku, gdy pierwszy Dwysyła nas na wschód, a drugi na południe, musimy wydrukować postać A. To jest już na stosie od pierwszego i. Wykonano następujące czynności:

    • \ - Odbij adres IP, aby skierował się na wschód
    • i; - Wprowadź dane, a następnie wciśnij je ponownie (no-op)
    • U - Wykonaj zawracanie, dwukrotnie obracając IP w lewo
    • o - Wyjście TOS, znak A
    • @ - Zakończ program
  • Char B: Jeśli pierwsza lub druga Dgł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 B
    • o - Wyjście TOS, znak B
    • ; - Pop TOS
    • @ - Zakończ program
  • Char C: Jeśli pierwszy Dwysyła nas na zachód, wykonywane są następujące czynności:

    • i - Wprowadź kolejne dane, znak B
    • i - Wprowadź kolejne dane, znak C
    • o - Wyjście TOS, znak C
    • @ - Zakończ program
  • Char D: Jeśli pierwszy Dwysyła nas na południe, wykonywane są następujące czynności:

    • i - Wprowadź kolejne dane, znak B
    • .. - Dwa no-ops
    • i - 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.
FlipTack
źródło
2
To jest spektakularne! Nie mogę uwierzyć, że udało ci się dopasować odpowiednie prawdopodobieństwa i wszystkie cztery ścieżki do kostki wielkości 2. Zastanawiam się, czy mogę zasubskrybować kanał z odpowiedziami Cubix, aby ich nie przegapić ...
ETHproductions
@ETHproductions Dziękuję, jestem pewien, że istnieje sposób na odcięcie jednego lub dwóch bajtów, ale jestem również dość dumny z tej odpowiedzi :)
FlipTack
8

Python , 50 bajtów

lambda x:choice(x[:2]+x[1:]*2)
from random import*

Nienazwana funkcja przyjmująca i zwracająca ciągi (lub listy znaków).

Wypróbuj online!

W jaki sposób?

random.choicewybiera 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".

Jonathan Allan
źródło
I znaleźli sposób na rozwiązanie mojego golfa a następnie realizowany jest identyczny do Ciebie, tylko w odwrotnej kolejności: /
Pan Xcoder
6

R , 31 bajtów

sample(scan(,''),1,,c(1,3,2,2))

Odczytuje znaki z stdinoddzielonych spacjami. samplelosuje próbki z pierwszego wejścia w ilości drugiego wejścia (so 1), (opcjonalny argument zastępczy), z wagami podanymi przez ostatni argument.

Wypróbuj online!

Spróbuj nrazy!

W tym ostatnim kodzie próbuję nczasy (ustawione nw nagłówku) z zamiennym ustawionym na True (domyślnie jest to fałsz), zestawiam wyniki i dzielę według, naby zobaczyć względne prawdopodobieństwa danych wejściowych.

Giuseppe
źródło
6

PHP, 28 bajtów

<?=$argn[5551>>2*rand(0,7)];

Uruchom jako potok z -nR.

01112233w bazie-4 jest 5551dziesiętnie ...

Tytus
źródło
108 możliwych wartości o tej samej długości ... 7030należy do moich ulubionych.
Tytus
5

Java 8, 53 44 bajty

s->s[-~Math.abs((int)(Math.random()*8)-6)/2]

Jest 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, Ci D).

Ogólna idea jest tu znaleźć jakiś sposób, aby mapować 0-7do 0-3, na przykład, że 0na wyświetlaczu pojawi się 1/8czas, 1pojawia 3/8razy, 2pojawia 2/8razy i 3pojawia 2/8razy. round(abs(k - 6) / 2.0))działa w tym przypadku, gdzie kjest losową liczbą całkowitą w zakresie [0,8). Powoduje to następujące mapowanie:

k -> k - 6 -> abs(k-6) -> abs(k-6)/2 -> round(abs(k-6)/2)

0 -> -6 -> 6 -> 3   -> 3
1 -> -5 -> 5 -> 2.5 -> 3
2 -> -4 -> 4 -> 2   -> 2
3 -> -3 -> 3 -> 1.5 -> 2
4 -> -2 -> 2 -> 1   -> 1
5 -> -1 -> 1 -> 0.5 -> 1
6 -> 0  -> 0 -> 0   -> 0 
7 -> 1  -> 1 -> 0.5 -> 1

Która, jak widać, wyniki w indeksach 0 111 22 33, co daje pożądany prawdopodobieństwa 1/8, 3/8, 2/8i 2/8.

Ale poczekaj! Jak na świecie -~Math.abs(k-6)/2osiąga ten sam wynik (ponownie, gdzie kjest losowa liczba całkowita w zakresie [0,8])? To rzeczywiście bardzo proste ... (x+1)/2(podział całkowita) jest tym samym, co round(x/2)i x + 1jest to samo, co -~x. Chociaż x+1i -~xmają tę samą długość, w powyższej funkcji lepiej jest użyć, -~xponieważ -~ma ona pierwszeństwo, a zatem nie wymaga nawiasów.

Socratic Phoenix
źródło
Wiem, że minęło trochę czasu, ale możesz zagrać w golfa dwa bajty, zmieniając położenie rzutowania liczb całkowitych (ponieważ Math.absakceptuje również podwajanie jako parametr): s->s[-~(int)Math.abs(Math.random()*8-6)/2]( 42 bajty ).
Kevin Cruijssen
5

APL, 14 bajtów

(?8)⊃1 3 2 2\⊢

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

Uriel
źródło
Czy mógłbyś przejrzeć moją odpowiedź J i dać mi znać, czy można ją poprawić?
Jonasz
17 bajtów
Adám
@Uriel Wypróbuj online!
Adám
@Uriel Nie ma takiego kodowania. Albo przejdziesz do pełnego UTF-8, albo policzysz każdy znak jako dwa bajty (UTF-16), albo dodasz 5 bajtów dla ⎕U2378.
Adám
@ Adám oh, rozumiem. to niech Dyalog zastąpi niektóre z tych niepotrzebnych liter europejskich z akcentami dla nowych symboli, aby zaoszczędzić bajty! ;)
Uriel
4

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).

Neil
źródło
4

Pyth , 8 7 bajtów

O+@Q1t+

Używa dokładnie tego samego algorytmu, co w mojej odpowiedzi w języku Python.

Wypróbuj tutaj!

Pyth , 10 8 bajtów

O+<Q2*2t

Uż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.
    • *2tPodwoj pełny ciąg ( *2) z wyjątkiem pierwszego znaku ( t).

Zastosowanie tego algorytmu do ABCD:

  • <Q2bierze AB.
  • *2ttrwa BCDi 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)

Pan Xcoder
źródło
>Q1staje się tQ, co się staje t.
Leaky Nun
Można zapisać bajt w drugim roztworze zastępując *2ze +i za pomocą wejścia niejawny dwukrotnie.
@Mnemonic Dzięki, myślę, że go nie użyłem, bo pomyślałem yzamiast tego, co nie działa na łańcuchy ...
Pan Xcoder
3

C # (.NET Core) , 76 55 bajtów

s=>(s+s[1]+s[1]+s[2]+s[3])[new System.Random().Next(8)]

Wypró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.

Charlie
źródło
Twój program powinien pobrać znaki jako dane wejściowe ze STDIN
Skidsdev
@Mayube naprawione, choć może być jeszcze gra w golfa ...
Charlie,
3

JavaScript 35 bajtów

Pobiera ciąg znaków ABCDjako dane wejściowe, generuje A1/8 czasu, B3/8 czasu, C1/4 czasu i D1/4 czasu.

x=>x[5551>>2*~~(Math.random()*8)&3]

Wyjaśnienie

x=>x[                     // return character at index
    5551                  // 5551 is 0001010110101111 in binary
                          // each pair of digits is a binary number 0-3
                          // represented x times
                          // where x/8 is the probability of selecting
                          // the character at the index 
    >>                    // bitshift right by
    2 *                   // two times
    ~~(                   // double-bitwise negate (convert to int, then 
                          // bitwise negate twice to get the floor for
                          // positive numbers)
        Math.random() * 8 // select a random number from [0, 8)
    )                     // total bitshift is a multiple of 2 from [0, 14]
    &3                    // bitwise and with 3 (111 in binary)
                          // to select a number from [0, 3]
]
asgalant
źródło
3

05AB1E , 5 bajtów

¦Ćì.R

Wypróbuj online!

Wyjaśnienie

¦Ćì.R   Argument s                      "ABCD"
¦       Push s[1:]                      "BCD"
 Ć      Enclose: Pop a, Push a + a[0]   "BCDB"
  ì     Pop a, Concatenate a and s      "ABCDBCDB"
   .R   Random pick
kalsowerus
źródło
3

> <> , 25 22 19 bajtów

i_ixio;o
ox</;
;\$o

Wypró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żdy iwczytuje znak ze STDIN do stosu i _jest poziomym lustrem, które ryba ignoruje teraz). Następnie osiąga x.

Jeśli xryba wyśle ​​rybę w prawo, wczyta jeszcze jedną postać (trzecią), wydrukuje ją oi 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 innego x.

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ę xw 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.

Nie drzewo
źródło
2

05AB1E , 8 bajtów

ìD1è0ǝ.R

Wypróbuj online!

         # Implicit input                            | [A,B,C,D]
ì        # Prepend the input to itself               | [A,B,C,D,A,B,C,D]
 D1è     # Get the second character                  | [A,B,C,D,A,B,C,D], B
    0ǝ   # Replace the first character with this one | [B,B,C,D,A,B,C,D]
      .R # Pick a random character from this array   | D
Riley
źródło
2

MATL , 12 10 bajtów

l3HHvY"1Zr

Wypróbuj online! Lub uruchom go 1000 razy (nieco zmodyfikowany kod) i sprawdź, ile razy pojawia się każdy znak.

Wyjaśnienie

l3HH   % Push 1, 3, 2, 2
v      % Concatenate all stack contents into a column vector: [1; 3; 2; 2]
Y"     % Implicit input. Run-length decode (repeat chars specified number of times)
1Zr    % Pick an entry with uniform probability. Implicit display

Zmiany w zmodyfikowanym kodzie: 1000:"Gl3HH4$vY"1Zr]vSY'

  • 1000:"...]to pętla powtarzania 1000czasów.
  • G upewnia się, że dane wejściowe są wypychane na początku każdej iteracji.
  • Wyniki są gromadzone na stosie między iteracjami. vMusi więc zostać zastąpiony przez, aby połączyć 4$vtylko najwyższe 4liczby.
  • Na końcu pętli vkonkatenuje 1000wyniki w wektor, Ssortuje go i Y'koduje w czasie wykonania. Daje to cztery litery i liczbę ich pojawienia się.
Luis Mendo
źródło
Tak, wygląda na to, że zostanie to naprawione
Skidsdev,
@Mayube Dzięki za zauważenie!
Luis Mendo,
2

05AB1E , 6 bajtów

«À¨Ć.R

Wypróbuj online!

Wyjaśnienie

Działa zarówno z listami, jak i łańcuchami.

«       # concatenate input with itself
 À      # rotate left
  ¨     # remove the last character/element
   Ć    # enclose, append the head
    .R  # pick a character/element at random
Emigna
źródło
2

C (gcc) , 50 49 bajtów

i[8]={1,1,1,2,2,3,3};f(char*m){m=m[i[rand()%8]];}

Wypróbuj online!

cleblanc
źródło
1
ABCDto przykładowe wejście, twój kod powinien przyjmować 4 znaki (lub ciąg długości 4) jako dane wejściowe
Skidsdev
2

Rubin, 34 33 29 27 bajtów

Zaoszczędź 2 bajty dzięki @Value Inc

Wprowadź jako cztery znaki

a=$**2
a[0]=a[1]
p a.sample

konstruuj tablicę [B,B,C,D,A,B,C,D]i próbkuj ją.

spróbuj online!

spróbuj nrazy! (Przekształciłem go w funkcję, aby łatwiej go powtarzać, ale algorytm jest taki sam)

alexanderbird
źródło
$*jest pseudonimem dla ARGV.
Wartość tuszu
2

Pyth, 7 bajtów

@z|O8 1

Zestaw testowy

O8generuje liczbę losową od 0 do 7. | ... 1stosuje 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.

@zindeksuje 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.

isaacg
źródło
2

JavaScript, 31 30 bajtów / 23 bajty

Widząc wcześniejszą odpowiedź asgallanta na Javascript, pomyślałem o JS. Tak, jak powiedział:

Pobiera ciąg znaków ABCDjako dane wejściowe, generuje A1/8 czasu, B 3/8 czasu, C1/4 czasu i D1/4 czasu.

Mój jest:

x=>(x+x)[Math.random()*8&7||1]

Wyjaśnienie:

x=>(x+x)[                 // return character at index of doubled string ('ABCDABCD')
         Math.random()*8  // select a random number from [0, 8]
         &7               // bitwise-and to force to integer (0 to 7)
         ||1              // use it except if 0, then use 1 instead
        ]

Od Math.random()*8&7tego dzieli się w następujący sposób:

A from 4      = 12.5% (1/8)
B from 0,1,5  = 37.5% (3/8)
C from 2,6    = 25%   (1/4)
D from 3,7    = 25%   (1/4)

Wersja 2, 23 bajty

Ale potem dzięki Arnauldowi, który napisał po mnie, kiedy powiedział:

Jeśli dozwolona jest formuła zależna od czasu, możemy po prostu zrobić:

co, jeśli jest to rzeczywiście dozwolone, doprowadziło mnie do:

x=>(x+x)[new Date%8||1]

w którym new Date%8zastosowano tę samą tabelę podziału jak powyżej.

I %8może też być &7; wybierz swój. Jeszcze raz dziękuję, Arnauld.

Alan Rat
źródło
2

ngn / apl, 10 bajtów

[A [⌈ /? 2 4]

?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

[ ] indeksowanie


zanotuj tabelę dla maks. (a, b), gdy a∊ {0,1} i b∊ {0,1,2,3}:

    ┏━━━┯━━━┯━━━┯━━━┓
    ┃b=0│b=1│b=2│b=3┃
┏━━━╋━━━┿━━━┿━━━┿━━━┫
┃a=0┃ 0 │ 1 │ 2 │ 3 ┃
┠───╂───┼───┼───┼───┨
┃a=1┃ 1 │ 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

ngn
źródło
1

Python 3 , 64 55 51 bajtów

-9 bajtów dzięki @ovs

lambda s:choice((s*2)[1:]+s[1])
from random import*

Wypróbuj online!


Wyjaśnienie

random.choice()pobiera losowy znak ciągu, a jednocześnie (s*2)[1:]+s[1]tworzy BCDABCDBdane wejściowe ABCD, które mają 1/8 As, 2/8 Cs, 2/8 Ds i 3/8 Bs.

Pan Xcoder
źródło
Użyj random.choicedla 55 bajtów:lambda s:choice((s[0]+s[1:]*3)[:8])
dniu
@ovs Znaleziono krótszą drogę ^. Dzięki za to choice().
Pan Xcoder,
1

QBIC , 27 bajtów

?_s;+;+B+B+;+C+;+D,_r1,8|,1

Wyjaśnienie

?           PRINT
 _s         A substring of
   ;+       A plus
   ;+B+B+   3 instances of B plus
   ;+C+     2 instances of C plus
   ;+D      2 instances of D plus
   ,_r1,8|  from position x randomly chosen between 1 and 8
   ,1       running for 1 character
Steenbergh
źródło
1

Chip , 60 bajtów

)//Z
)/\Z
)\/^.
)\x/Z
)\\\+t
|???`~S
|z*
`{'AabBCcdDEefFGghH

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:

000 a
01_ b
0_1 b
10_ c
11_ d

(gdzie _mogą być 0albo 1). 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.

Phlarx
źródło
1

Applesoft, 29 ups, 32 bajty

Mał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.)

INPUTI$:X=RND(1)*4:PRINTMID$(I$,(X<.5)+X+1,1)

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:

A from .5 ≤ X < 1           = 12.5%
B from X < .5 or 1 ≤ X < 2  = 37.5%
C from 2 ≤ X < 3            = 25%
D from 3 ≤ X < 4            = 25%
Alan Rat
źródło
Witamy w Programowaniu zagadek i Code Golf! Wymagamy, aby zgłoszenia tutaj były rozgrywane w golfa tak często, jak to możliwe, przynajmniej w sposób trywialny, co obejmuje usuwanie niepotrzebnych białych znaków (przepraszam, jeśli biała przestrzeń jest niezbędna). Ponadto nie jestem pewien standardów Applesoft, ale nie sądzę, abyś mógł założyć, że te operatory są tokenami jednobajtowymi, chyba że wewnętrzna reprezentacja jest jednym bajtem. Ponadto nie można zakładać, że dane wejściowe są przechowywane w zmiennej; raczej musisz wziąć to jako dane wejściowe, argument wiersza poleceń lub parametr funkcji. Dzięki!
HyperNeutrino
@HyperNeutrino Żadna biała spacja nie była konieczna, chociaż spacja po „INPUT” i „PRINT” poprawiłaby czytelność. Zdarzyło się, że w tych zabytkowych miejscach w języku cybertańskim tradycyjnie pokazywano miejsca, w których je miałem. W przypadku tokenów, o których wspomniałem, jest prawdą, że „wewnętrzna reprezentacja jest jednym bajtem”. Tymczasem grałem w golfa kod, który miałem bajt.
Alan Rat
1

Common Lisp , 198 bajtów

(setf *random-state*(make-random-state t))(defun f(L)(setf n(random 8))(cond((< n 1)(char L 0))((and(>= n 1)(< n 4))(char L 1))((and(>= n 4)(< n 6))(char L 2))((>= n 6)(char L 3))))(princ(f "ABCD"))

Wypróbuj online!

Czytelny:

(setf *random-state* (make-random-state t))
(defun f(L)
    (setf n (random 8))
    (cond 
            ((< n 1) 
                (char L 0))
            ((and (>= n 1)(< n 4))
                (char L 1))
            ((and (>= n 4)(< n 6))
                (char L 2))
            ((>= n 6)
                (char L 3))
    )
)
(princ (f "abcd"))
Cheldon
źródło