O serii
To jest gościnny wpis do serii Random Golf of the Day.
Po pierwsze, możesz potraktować to jak każde inne wyzwanie związane z golfem i odpowiedzieć na nie, nie martwiąc się w ogóle serią. Istnieje jednak tabela wyników dla wszystkich wyzwań. Możesz znaleźć tabelę liderów wraz z kilkoma więcej informacji o serii w pierwszym poście .
Wejście
Brak danych wejściowych.
Wynik
Pojedyncza litera alfabetu (nie ma znaczenia wielkość liter), z opcjonalnym końcowym znakiem nowej linii. Każda litera musi mieć niezerowe prawdopodobieństwo wybrania, a wszystkie 26 prawdopodobieństw musi być odrębnych . Aby usunąć wszelką dwuznaczność: Wyraźny oznacza, że nie mogą istnieć dwa prawdopodobieństwa, które są sobie równe.
Punktacja
To jest kod golfowy. Najkrótszy kod w bajtach wygrywa.
Poprawny wpis to pełny program lub funkcja, która ma zerowe prawdopodobieństwo, że nie zostanie zakończona.
Alfabet
Aby uniknąć nieporozumień, należy użyć alfabetu łacińskiego:
Zarówno
ABCDEFGHIJKLMNOPQRSTUVWXYZ
lub
abcdefghijklmnopqrstuvwxyz
Możesz wybrać wyświetlanie dużych lub małych liter. Alternatywnie możesz wybrać wyświetlanie różnych przypadków w różnych przebiegach, jeśli to pomoże. Prawdopodobieństwo dla danej litery to prawdopodobieństwo pojawienia się litery w obu przypadkach (górnej lub dolnej).
Wyjaśnienie
Ponieważ wynik nie będzie wcale oczywisty, dołącz jasne wyjaśnienie, w jaki sposób osiągnąłeś 26 różnych prawdopodobieństw.
Tabela liderów
( stąd )
Pierwszy post z serii generuje również ogólną tabelę wyników.
Aby mieć pewność, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
(Język nie jest obecnie wyświetlany, ale fragment go wymaga i analizuje, a w przyszłości mogę dodać tabelę wyników według języków).
A
zamiast65
.Odpowiedzi:
Pyth, 5
Wypróbuj tutaj
Oblicza prefiksy alfabetu, więc:
["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]
. Następnie spłaszcza listę i wybiera równomiernie z niej losowy element. Oznacza to, że ponieważa
pojawia się 26 razy, ab
pojawia się 25 razy, aż doz
zaledwie jednego wyglądu, każda litera ma inną szansę pojawienia się. Łączny ciąg ma 351 znaków.źródło
MATL, 6 znaków
Wyjaśnienie:
Xr
Weź normalnie rozłożoną liczbę losową)
Użyj tego, aby indeksować do ...1Y2
AlfabetuRozkład jest symetryczny wokół 0, a translacja liczby na char jest symetryczna wokół 0,5. Jako takie prawdopodobieństwa powinny być wyraźne.
źródło
05AB1E , 6 bajtów
Kod
Wyjaśnienie
Mamy teraz następujący ciąg:
Następnie wybieramy losowy element za pomocą
.R
.Prawdopodobieństwa
Wypróbuj online! .
źródło
Galaretka , 5 bajtów
Wypróbuj online!
Jak to działa
tło
Niech L 0 , ..., L 25 oznacza litery alfabetu, w celu ich naturalnych i S 0 , ..., S 25 równomiernie losowo wybranych permutacji L . Zdefiniuj sekwencję skończoną M o M n = max (L n , S n ) .
Napraw n w 0,… 25 i zdefiniuj k jako indeks taki, że L n = S k .
Z prawdopodobieństwem 1/26 , l n = s n a n = k , tak M n = l n i L n occurrs raz M .
Z prawdopodobieństwem 25/26 , L n ≠ S n i n ≠ k . W takim przypadku dzieje się tak.
Z prawdopodobieństwem n / 25 , S n jest jednym z L 0 ,…, L n - 1 , więc L n > S n i M n = L n .
Niezależnie, również z prawdopodobieństwem n / 25 , k jest jednym z 0,… n - 1 , więc S k > L k i M k = S k = L n .
Zatem oczekiwana liczba wystąpień L n w M wynosi 1/26 + 25/26 · (n / 25 + n / 25) = (2n + 1) / 26 .
W końcu, jeśli teraz wybrać termin m o M równomiernie losowo litery L n , że wybiera się z prawdopodobieństwem (2N + 1) / 26/26 = (2n + 1) / 676 .
Daje to następujący rozkład prawdopodobieństw.
Możesz empirycznie zweryfikować dystrybucję, wywołując link 100 000 razy (zajmuje to kilka sekund).
źródło
MATL , 10 bajtów
Wypróbuj online!
Kod generuje jednolitą zmienną losową na przedziale (0,1) (
r
) i oblicza jej kwadrat (U
). Powoduje to nierównomierną, malejącą gęstość prawdopodobieństwa. Pomnożenie przez 26 (26*
) zapewnia, że wynik jest w przedziale (0,26), a zaokrąglenie w dół (k
) daje wartości 0,1, ..., 25 ze zmniejszającym się prawdopodobieństwem. Wartość jest używana jako indeks ()
) do wielkich liter alfabetu (1Y2
). Ponieważ MATL stosuje modułowe indeksowanie 1, 0 odpowiada Z, 1 do A, 2 do B itd.Jako ilustrację, że prawdopodobieństwa są różne, oto dyskretny histogram wynikający z 1000000 losowych realizacji. Wykres jest tworzony przez uruchomienie tego w Matlab:
źródło
k
! Zauważyłem, że podczas próby codegolf.stackexchange.com/a/89648/11159Java 7,
625756 bajtów5 bajtów dzięki Poke.
1 bajt dzięki trichoplax.
Ideone to!
Wykres częstotliwości (przebiegi 1e6, współczynnik skalowania 1/1000)
źródło
sqrt(x*y*y) = sqrt(x)*y
Perl, 24 bajty
-4 bajty dzięki @Martin Ender
-1 bajt dzięki @Dom Hastings
Potrzebuje
-M5.010
lub-E
uruchomić:Uruchomienie następującego kodu pokaże występowanie każdej litery:
Jak to działa : Myślę, że kod jest dość wyraźny, ale nadal: wybiera losową liczbę między
0
arand 26
. Istnieje więc znacznie większe prawdopodobieństwo, że wybrane zostaną liczby zbliżone do0
(literyA
).źródło
say+(A..Z)[rand rand 26]
(A..Z)[...]
i to nie zadziałało, więc pomyślałem, że mogę użyć takiej anonimowej tablicy, ale to tylko z powodusay
... dzięki! :)PHP,
44362927 bajtówPrzekreślone 44 jest nadal regularne 44; (
Dzięki inserttusernamehere, Petah i Crypto za całą pomoc
Wybiera liczbę losową z przedziału od 0 do 675 (= 26 2 -1), bierze pierwiastek kwadratowy i wykłada podłogę (
chr
funkcja przekształca argument na liczbę całkowitą). Ponieważ kwadraty mają różne odstępy między nimi, prawdopodobieństwo wybrania każdej liczby jest odrębne. Każdy n jest wybierany z prawdopodobieństwem (2n + 1) / 676.Dodanie 65 do tej liczby daje losową postać od
A
doZ
.Ideone kodu działającego 1 000 000 razy
źródło
range(A,Z)
.chr()
.<s> 44 </s>
<?=chr(65+sqrt(rand(0,675)));
R,
4027 bajtówSpowoduje to pobranie
1
liczby z26
liczb generowanych z rosnącym prawdopodobieństwem w kierunkuZ
, bez zamiany, i wyświetlenie litery, której indeksem jest ta liczba, z listy wielkich literLETTERS
.Argumenty
sample
funkcji to:źródło
> <> , 14 bajtów
> <> to toroidalny język 2D, a część prawdopodobieństwa po prostu dzieje się naturalnie ze względu na jedyne źródło losowości tego języka. Wypróbuj online!
Odpowiednie polecenia to:
Zatem prawdopodobieństwa wyjściowe wynoszą:
źródło
Python 2,
5857 bajtówObjaśnienie: generuje losową liczbę zmiennoprzecinkową w przedziale
[0, 676)
, pobiera pierwiastek kwadratowy, a następnie wprowadza go do podłogi. Następnie dodaje 65 (wartość ascii „A”), konwertuje go na char i drukuje.Daje to każdemu numerowi od 0 do 25 wyraźne prawdopodobieństwo. Aby zrozumieć dlaczego, pomyśl o tym w ten sposób. Ile liczb, ignorując liczby całkowite, gdy weźmiesz pierwiastek kwadratowy i piętro, dajesz 0? Tylko jedna liczba będzie (zero). Oznacza to, że zero ma prawdopodobieństwo
1/676
. Ile liczb da 1? 3 będzie, 1, 2 i 3. Oznacza to, że istnieje prawdopodobieństwo3/676
. Dwa mogą być produkowane z 4, 5, 6, 7 lub 8, co daje prawdopodobieństwo 5, trzy ma prawdopodobieństwo 7 itd., A ponieważ różnica między kolejnymi kwadratami stale rośnie o dwa, ten wzór jest kontynuowany przy każdym zwiększeniu liczby do 25 (Z).1 bajt zapisany dzięki nieszczelnej zakonnicy!
źródło
chr(int(65+randint(676)**.5))
chr(int(65+random()**.5*26))
. Jest to to samo algebraicznie, ponieważ 26 == √676. a teraz kolejność operacji jest po twojej stronie**2*26
można zastosować odwrotny rozkład.1/random()%26
powinien również działać.PowerShell v2 +,
3331 bajtówPrzyjmuje zakres od
65
do90
(tj. ASCIIA
doZ
), przepuszcza go przez pętlę. W każdej iteracji używamy operatora przecinka, aby utworzyć tablicę tego elementu razy tę liczbę. Na przykład spowoduje to 6565
s, 6666
s, 6767
s itd. Ta duża tablica jest podłączona do potoku, doGet-Random
której (jednolicie PRNG) wybierze jeden element. Ponieważ istnieją różne ilości każdego elementu, każda postać ma nieco wyraźną procentową szansę na wybranie. Następnie enkapsulujemy to w pareny i rzucamy jakochar
. Pozostaje to w potoku, a dane wyjściowe są niejawne.(Dzięki @LeakyNun za grę w golfa na kilka bajtów, jeszcze zanim został opublikowany.: D)
Prawdopodobieństwa
(niewielkie zaokrąglenie, dzięki czemu mógłbym zademonstrować
P
opcję-f
operatora ormat)źródło
gal
wyjściu ([char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random
) do 50 znaków, następnie 48, zmienił się na cyfry i dostał 42, a następnie 31 i zatrzymał się tam; spojrzałem na tabelę wyników, żeby zobaczyć, gdzie mnie to położy. Tutaj. Znak dla postaci identycznej. Welp, prawdopodobnie nie mogę tego pokonać.CJam,
211712 bajtówDzięki Martinowi Enderowi za uratowanie mnie 5 bajtów!
Nowa wersja
Tworzy tablicę ciągów poniższy wzór
A
,AB
,ABC
, i tak dalej. Spłaszcza go i wybiera losową postać. Ponieważ ten ciąg zawiera 26 A, 25 B, 24 C i tak dalej, każda litera ma wyraźne prawdopodobieństwo wyboru.Wypróbuj online!
Wyjaśnienie
Stara wersja
Pobiera różne prawdopodobieństwa, tworząc ciąg, w którym każda litera pojawia się kilka razy równa jej pozycji w alfabecie.
źródło
R, 23 bajty
Wystarczy „pobrać” próbkę z wbudowanego listu.
1:26
jest wektorem wag dając każda litera inny prawdopodobieństwa.źródło
1:26
jest wektorem wag dla każdej literyC, 35 bajtów
Ten program zakłada
RAND_MAX
(2 ^ 32/2) - 1 domyślnie na gcc. Skompiluj z-lm
flagą, aby połączyćsqrt
funkcję. Dane wyjściowe są zapisywane na stdout jako wielkie litery bez końcowych znaków nowego wiersza.Opcjonalnie, jeśli
RAND_MAX
jest (2 ^ 16/2) - 1, można użyć krótszej 32-bajtowej wersji:Dla zabawy stworzyłem również wersję, która nie używa tej
sqrt
funkcji ani nie wymaga dołączonej biblioteki matematycznej (ta musi miećRAND_MAX
jako (2 ^ 32/2) - 1), ale skończyła się na dłuższym czasie, chociaż myślałem, że to była całkiem fajne:Wyjaśnienie
[Pierwszy program]
Przy pierwszych dwóch zastosowaniach
sqrt
funkcja po prostu odwzorowuje zakres[0, RAND_MAX)
na[0, 25]
dzielenie przelotne, a następnie dodaje 65 (ASCIIA
) do wartości, aby przesunąć ją na alfabet ASCII przed wysłaniem.[Drugi program]
Drugi program jest nieco bardziej złożony, ponieważ ma podobną strategię, ale bez
sqrt
operatora. Ponieważ bity wykładnikowe zmiennoprzecinkowe są automatycznie obliczane po przypisaniu liczby całkowitej, można je skutecznie wykorzystać jako surowy sposób uzyskania logarytmu podstawowego 2 liczby.Ponieważ chcemy, aby zakres
RAND_MAX
do osiągnięcia zakodowanej wartości wykładniczej wynoszącej 25, obliczenia (2 ^ 32/2 - 1) / (2 ^ 25) dają nam tylko około 64, które jest używane podczas podziałurand
na mapowanie do tego nowego asortymentu. Dodałem również 1 do wartości, ponieważ reprezentacja zmiennoprzecinkowa 0 jest raczej dziwna i złamałaby ten algorytm.Następnie liczba zmiennoprzecinkowa jest wpisywana na liczbę całkowitą, aby umożliwić przesunięcie bitów i inne tego typu operacje. Ponieważ w liczbach zmiennoprzecinkowych IEEE 754 bity wykładnikowe są bitami 30–23, liczba jest następnie przesuwana w prawo o 23 bity, odcinając mantysę i umożliwiając odczytanie wartości surowego wykładnika jako liczbę całkowitą. Zauważ, że bit znaku również wykracza poza bity wykładnikowe, ale ponieważ nigdy nie ma żadnych negatywów, nie trzeba go maskować.
Zamiast dodawać 65 do tego wyniku, jak to robiliśmy wcześniej, wykładniki zmiennoprzecinkowe są reprezentowane jako liczba całkowita bez znaku 8 bitów od 0 do 255, gdzie wartość wykładnika 0 wynosi 127 (po prostu odejmij 127, aby uzyskać rzeczywistą „wykładnik” wartości wykładnika ). Ponieważ 127 - 65 wynosi 62, zamiast tego po prostu odejmujemy 62, aby zarówno przesunąć go z tego zakresu zmiennoprzecinkowego wykładnika, jak i do zakresu alfabetu ASCII w jednej operacji.
Dystrybucja
Nie jestem ekspertem od matematyki, więc nie mogę z całą pewnością powiedzieć dokładnej formuły dla tych rozkładów, ale mogę (i zrobiłem) przetestować każdą wartość w zakresie,
[0, RAND_MAX)
aby wykazać, że odległość między miejscem, w którym kończy się zakres jednej litery, a drugim zaczyna się, nigdy nie jest podobnie. (Uwaga: testy te zakładają losowe maksimum (2 ^ 32/2) - 1)[Pierwszy program]
[Drugi program]
źródło
char
jest to typ integralny w C, powinno to być dopuszczalne.Python 2, 72 bajty
Mnoży znak przez jego wartość ascii, a następnie wybiera losowo jeden znak z otrzymanego ciągu.
Oto prawdopodobieństwa dla każdej wybranej litery w procentach:
Wypróbuj: https://repl.it/Cm0x
źródło
Galaretka , 5 bajtów
(Równy wynik, ale inna metoda , niż istniejące rozwiązanie Jelly autorstwa Dennisa.)
Prawdopodobieństwo uzyskania każdej litery to indeks 1 w alfabecie podzielony przez 351 - 26 liczba trójkątna:
A
) = 1/351, P (B
) = 2/351, ..., P (Z
) = 26/351.Ponieważ 1 + 2 + ... + 26 = 351, P (litera) = 1.
Realizacja:
Przetestuj to na TryItOnline lub uzyskaj dystrybucję 100 000 przebiegów (kredyt do Dennisa)
źródło
q, 38 bajtów
Niezbyt krótki, ale ...
Dyskretną funkcją rozkładu skumulowanego jest sekwencja
0.9 ^ 26, 0.9 ^ 25, ..., 0.9 ^ 0
A my po prostu próbkujemy z dystrybucji.
źródło
JavaScript (ES6), 45 bajtów
Osiąga nierównomierny rozkład poprzez podniesienie do kwadratu wartości losowej.
Math.random()
zwraca liczbę zmiennoprzecinkową zakresu,[0,1)
więc wynik podniesienia do kwadratu zmierza w kierunku0
(luba
).Test
Pokaż fragment kodu
źródło
(n=Math.random(),10+26*n+n|0).toString(36)
Oracle SQL 11.2, 212 bajtów
Wykorzystanie pozycji znaku w alfabecie jako prawdopodobieństwa
Bez golfa
źródło
TI-Basic, 39 bajtów
rand
generuje jednolitą wartość w (0,1]. Daje to 26 ^ rand inne prawdopodobieństwo zrównania liczb całkowitych od 1 do 26.Starsza wersja, 45 bajtów
Ograniczona precyzja liczb całkowitych TI-Basic ogranicza rozkład normalny do generowania liczb w granicach µ ± 7,02σ (patrz
randNorm(
). Otrzymujemy więc wartość bezwzględną liczby losowej z µ 0 i σ 1, mnożąc ją przez cztery, aby zwiększyć wspomniany wcześniej praktyczny zakres do µ ± 28,08σ. Następnie doliczamy wartość dolną i dodajemy 1, ponieważsub(
jest indeksowana 1, co daje nam zakres od 1-29 z różnymi prawdopodobieństwami dla każdego z nich.źródło
PHP,
9284 bajtówTworzy ciąg wszystkich liter, powtarzając liczbę razy przez pętlę, którą jesteśmy, a następnie losowo wybiera literę z tego ciągu. W rezultacie litery później w alfabecie mają większe prawdopodobieństwo
Dzięki inserttusernamehere do golenia bajtów
prawdopodobieństwa wyniku (uporządkowane według%)
źródło
$x=0
co jest oczywiście konieczne. Oto wersja 84-bajtowa :for($i=65,$x=0;$i<91;$a.=str_repeat(chr($i++),$x))$x++;echo substr($a,rand(0,$x),1);
Czy kiedykolwiek udało ci się uzyskać wartość większą niżG
podczas uruchamiania kodu? W każdym razie zawsze możesz zignorowaćnotice
s podczas gry w golfa.strlen
Stanowi$a
to 351, ale odbierają tylko losowy charakter z pierwszych$x
(26) znaków. Można go naprawić i utrzymać prawdopodobieństw ze zmianą ostatecznej$x
Do350
do +1 bajt. Oto 77-bajtowa wersja, która rozwiązuje problem, ale jednocześnie znacznie zbliża prawdopodobieństwo:for($i=65;$i<91;$a.=str_repeat(chr($i),$i++));echo substr($a,rand(0,2014),1);
Befunge,
168164 bajtówBardziej kompaktowy niż pierwszy, z nieco innymi prawdopodobieństwami: pierwsze
?
mają 1/4 szansy wydrukowania A przy „pierwszej próbie”, 2/4 szansy na powrót do tego samego?
i 1/4 na przejście do Kolejny. Reszta?
każdego z nich ma 1/4 szansy wydrukowania litery pod nimi, 1/4 do ponownej próby, 1/4 przejścia do następnej litery, 1/4 przejścia do poprzedniej. Ponownie, prawdopodobieństwo wydrukowania A jest znacznie wyższe niż wydrukowanie Z.Befunge, 186 bajtów
Oczywiście nie wygra z tym, ale myślę, że to jednak interesująca odpowiedź :)
v
i>
steruje kursorem odpowiednio w dół i w prawo.?
Operator wysyła kursor się w jednym z czterech kierunków losowy. Pierwszym?
jest „zablokowany” przezv
i>
w dwóch kierunkach, tak że ma tylko dwie drogi: albo pójść do wydrukowania A lub w dół do następnej?
. Tak więc od samego początku?
istnieje 50% szans na wydrukowanie A.Następny
?
ma 1/3 szansy na wydrukowanie B, 1/3 powrotu i 1/3 dalszego spadku. Itd itd.Powinno być całkiem oczywiste, że wyższe litery mają znacznie większą szansę na wydrukowanie niż niższe, ale nie jestem do końca pewien, jakie są szanse każdej litery.
Będziemy wdzięczni za pomoc w dokładnej matematyce :)
Przynajmniej przy pierwszej próbie istnieje szansa 1/2 * 1/3 ^ 25, że kursor przesunie się w dół do litery Z. Nie jestem jednak pewien, jak szanse na przesuwanie kursora w górę i w dół wpływają na każdą literę.
,@
odciski i rezygnuje.źródło
J,
2018 bajtówTłumacz online
Duże litery.
Prawdopodobieństwo każdej litery jest indeksem 1 w alfabecie.
źródło
zsh, 63 bajty
działa, tworząc ten ciąg:
czyli 65 razy A, 66 razy B, 67 razy C ...
a następnie wybiera losową postać
źródło
A
w ascii. możesz zacząć od 1, ale wtedy wewnętrzna pętla staje się{65..$[#i]}
dłuższa o 1 charCJam, 11 bajtów
lub
Wypróbuj online!
To rozwiązanie jest podobne do pomysłu Luisa i tworzy nierównomierny rozkład, biorąc pierwiastek kwadratowy zmiennej losowej.
źródło
Partia, 116 bajtów
Działa poprzez wybranie większej lub mniejszej (zapominam która) dwóch zmiennych losowych.
źródło
Matlab, 22
Często zwraca wczesne litery, ale teoretycznie może je wszystkie dotknąć!
Bierze jedną podzieloną przez liczbę losową, ogranicza ją do 26 i zamienia na postać.
Oczywiście nie bardzo krótko, ale być może ta koncepcja może zainspirować inne odpowiedzi.
źródło
rand
zwraca wartość w [0, 1)? To znaczy, włączając zero, ale nie włączając jednego. Jeśli czasami powoduje to 1/0,min(1/0,26)
nadal zwróci 26 lub błąd?rand
zwraca wartość w (0,1), więc nie powinno być problemurand
zwrotu 0 w praktyce,min(1/0,26)
faktycznie zwraca 26.CJam, 10 bajtów
Podejście CJam # 3 ...
Wypróbuj online!
Spowoduje to utworzenie jednolicie losowej liczby
x
między 1 a 26, a następnie wykorzysta tę liczbę do utworzenia równomiernie losowej liczby między0
i dox-1
której zostanie dodanaA
. To tendencyjność prowadzi do mniejszych postaci.źródło
Labirynt , 19 bajtów
Wypróbuj online!
Jest to pętla, która przy każdej iteracji albo a) zwiększa licznik rozpoczynający się od zera lub b) kończy się, oba z prawdopodobieństwem 50%. Na końcu pętli licznik jest pobierany modulo 26 i dodawany do 65, aby dać literę między
A
iZ
.Daje to prawdopodobieństwo
A
nieco ponad 50%,B
nieco ponad 25% i tak dalej doZ
nieco ponad 1/2 26 . Teoretycznie istnieje możliwość takiego działania na zawsze, ale to zdarzenie ma zerowe prawdopodobieństwo zgodnie z wymaganiami wyzwania (w praktyce prawdopodobnie nie jest to możliwe, ponieważ PRNG zwróci oba możliwe wyniki w pewnym momencie w tym okresie).źródło