Jaki jest najkrótszy sposób generowania ciągu losowego o zadanej długości i przy użyciu tylko znaków alfanumerycznych?
- przykład ciągu losowego: przy N = 9 wynik byłby
aZua7I0Lk
- można założyć, że podana długość N jest zawsze większa niż 0
- w razie potrzeby można przyjąć 256 jako maksymalną wartość dla N, ale preferowane są rozwiązania z wyższymi wartościami granicznymi dla N i wciąż mające szybki czas obliczeń
- dozwolone znaki: 0-9, az i AZ
- znak może wystąpić więcej niż jeden raz w ciągu wyjściowym
- każdy możliwy ciąg znaków powinien być jednakowo prawdopodobny (z dokładnością do generatora liczb losowych w Twoim języku)
Odpowiedzi:
Galaretka , 4 bajty
Wypróbuj online!
Wyjaśnienie
Moc kartezjańska generuje w zasadzie całą listę o danej długości, którą można uformować z danego zestawu elementów; właśnie tego tutaj potrzebujemy.
źródło
Taxi , 2577 bajtów
Wypróbuj online!
Taxi jest bardzo nie w tej sprawie, ale może to zrobić! Spróbuję wyjaśnić, co dzieje się poniżej wersji bez gry w golfa.
Start: Zdobądź standardowe wejście
Podnieś standardowe wejście jako tekst, przekonwertuj je na liczbę i idź gdzieś, żeby poczekać.
Zaplanuj część 1:
zdobądź losową liczbę całkowitą 1-62 Zdobądź losową liczbę całkowitą, a następnie uzyskaj
62
liczbę. Zduplikuj zarówno losową liczbę całkowitą, jak i62
ponieważ będziemy jej później potrzebować. Można go nosić tylko 3 pasażerów na raz więc skończyć zrand
,rand
, i62
. (Drugi62
będzie czekać, aż wrócimy.) Przejdźrand
przez62
i obetnij wynik, aby uzyskać liczbę całkowitą. Wróć, aby pobrać drugą kopię62
i pomnóż ją przez obciętą liczbę całkowitą z podziału. Na koniec odejmij produkt od pierwszej kopiirand
. To daje nam liczbę 0-61. Teraz musimy wrócić do odbioru a1
i dodać go do wyniku, aby uzyskać liczbę 1-62. Tak, wszystkie te wiersze tekstu są po prostumod(rand(),62)+1
.Zaplanuj część 2: utwórz tablicę znaków, z której wybierzesz
Odbierz ciąg ze wszystkimi prawidłowymi znakami, a także jeden na końcu, którego nie chcemy (więcej o tym później).
63
Wybraliśmy wcześniejsze mecze to długość łańcucha. Przenieś go do Chop Suey, aby rozbił go na poszczególnych pasażerów.Plan B: Przesuń tablicę, abyśmy mogli wybrać postać
jeden po drugim, przenieś każdą postać do parku wąskiej ścieżki. To jedyny dostępny stos i jedyny sposób, aby nie dopuścić do sytuacji, w której pasażerowie pozostali. Cała reszta w Townsburgu to FIFO, więc musiałbym wracać i oczyszczać wszystkich pasażerów przy każdej iteracji ogólnej pętli. W ten sposób mogę po prostu zostawić je w parku, a za każdym razem 63 nowe postacie zostaną zepchnięte z drogi. Pierwszy
A
prawdopodobnie nigdy nie ucieknie .Plan C: Przygotuj się do wyboru postaci
To naprawdę tylko kilka przystanków, które nie musiały znajdować się w planie D. Zmień położenie taksówki w przygotowaniu.
Plan D: Zbierz wszystkie znaki, których nie chcemy.
Rozpoczynając od pierwszego znaku w odwróconej „tablicy” (jest to 63 znak, którego nie chcemy), zbieraj i konkatenuj znaki, odliczając od wyniku
mod
funkcji w planie A. Gdy osiągniesz zero, następną postacią jest ta, którą chcesz.Plan E: Utop te, których nie chcesz i zwróć wybranemu.
„Pasażerowie [P] wysadzeni na Riverview Bridge wydają się zawsze spadać za burtę i do rzeki…” Cóż, to pozbywa się tego połączonego szeregu przegranych. Idź podnieś następną postać i wyślij ją na standardowe wyjście. Na koniec sprawdźmy, ile znaków wydrukowaliśmy do tej pory. Wróć do Sunny Skies, aby podnieść wartość standardu, którą zostawiliśmy tak dawno temu. Odejmij jeden, a jeśli wynik jest większy niż zero, odeślij go z powrotem, aby poczekał i zacznij od nowa w planie A.
źródło
code-bowling
i została poprawiona. Najdłuższącode-golf
odpowiedzią, jaką mogłem znaleźć, jest oryginalne przesłanie Brain-Flak dotyczące podstawowego wyzwania quine. Pochodzi z 9,5 * 10 ^ 580 bajtów. Najdłuższą aktualną odpowiedzią, jaką znalazłem, był główny tester w Unary : 1,65 * 10 ^ 56 bajtów.C (gcc) ,
575552 bajtówDzięki 2501 za wskazówki ...
Wypróbuj online!
źródło
rand()%74
powinno byćrand()%75
&&putchar(i)
zamiast operatora trójskładnikowego.Galaretka , 5 bajtów
Pominięto lewę - patrz 4 bajt ais523
Wypróbuj online!
W jaki sposób?
źródło
Shell + pwgen , 13 bajtów
Próbka wyjściowa
źródło
Java 8,
1831499788 bajtówWypróbuj online.
-9 bajtów przez przeniesienie odpowiedzi C na 2501 , więc pamiętaj, aby go również głosować!
Stara odpowiedź, 97 bajtów
Wypróbuj online.
Wyjaśnienie:
źródło
C, 60 bajtów
Zobacz, jak to działa tutaj .
Zobacz dystrybucję tutaj .
Jest równomiernie rozłożony, przy założeniu, że
rand() % 62
daje jednolity rozkład. Ponieważ 62 zwykle nie dzieli równomiernie RAND_MAX, istnieje bardzo małe odchylenie.źródło
Bałwan , 58 bajtów
Wypróbuj online!
Jest to podprogram, który przyjmuje na wejściu liczbę całkowitą i zwraca losowy ciąg.
źródło
((}#`""*:48vn58nR|65vn91nR,aC|97vn123nR,aCAsH1AaL#aC*;bR))
.PowerShell,
5854 bajtów-4 dzięki Andrei Odegovowi - rzutowanie na tablicę char zamiast zapętlania w celu utworzenia tablicy char.
generuje zakres
1..2+4..5 = 1,2,4,5
wszystkich dopuszczalnych kodów charachtera, a następnie$args
losowo wybiera liczbę elementówrandom -Count
- powstałe elementysą zapętlonesą rzutowane na tablicę znaków za pomocą|%{}
i zamieniane w[char]
s,[char[]]
- następnie całość jest umieszczana w nawiasach i-join
edytowana razem.Nie działa dla wejścia 0, ponieważ
Get-Random
akceptuje tylko liczby powyżej 1 dla-Count
parametru.źródło
-join[char[]](65..90+97..122+48..57|random -C "$args")
PHP, 56 bajtów
Wersja online
ctype_alnum
źródło
05AB1E , 6 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Perl 5 , 41 bajtów
40 bajtów kodu +
-p
flaga.Wypróbuj online!
(a..z,A..Z,0..9)
tworzy tablicę zawierającą wszystkie litery i cyfry,[rand 62]
zwraca losowy element tej tablicy, który jest append (.=
)$\
, który jest domyślnie drukowany na końcu dzięki-p
znacznikowi z}{
.Lub, dla tego samego bajtu, ale używając parametrów zamiast standardowego wejścia:
Wypróbuj online!
źródło
R, 51 bajtów
Ta sama długość co druga odpowiedź R, ale inne podejście.
letters
iLETTERS
oba są wbudowanymi zmiennymi zawierającymi odpowiednio wszystkie małe i wielkie litery. Dodając0:9
do tego, mamy cały zestaw znaków alfanumerycznych.źródło
R,
54525149 bajtówWyjaśnienie:
scan()
c(65:90,97:122,48:57)
sample(c(65:90,97:122,48:57),scan(),T)
intToUtf8
źródło
JavaScript (ES6),
6154395264 bajtówTo prawie jak golf zwrotny! Wziął duży hit w liczbie bajtów, zapewniając, że zostanie wykorzystany pełny zakres znaków ze wszystkich trzech grup.
Spróbuj
źródło
[0-5w-z]
wyłącznie postacie .btoa(String.fromCharCode(Math.random()*248))[0]
równomierne objęcie całego zakresu.toString
a następnie zakodować), aby zagwarantować pełny zakres znaków ze wszystkich 3 grup.014589ABEFIJMNQRUVYZcdghklopstwx
(i nie jednolite).Alice , 24 bajty
Wypróbuj online!
Ten układ jest już znacznie lepszy niż pierwotnie miałem (32 bajty), ale jestem pewien, że nie jest jeszcze optymalny ...
Wyjaśnienie
źródło
Python + exrex , 81 bajtów
źródło
Python 2,
798379 bajtów+4 bajty (nie uwzględniono powtórzeń)
-4 bajty (Podziękowania dla @Rod za sugestię użycia
printable[:62]
)źródło
(s.letters+s.digits)*x
zamiasts.letters+s.digits
`r.sample(...)`[2::5]
zamiast''.join(r.sample(...))
zapisać bajt (tylko Pythona 2) i(s.letters+s.digits)*x
może być włączony dos.printable[:62]*x
zapisać 4 bajtyprintable
, nie mogłem dostać się[2::5]
do pracy (może robiłem to źle?)r.sample()
backtickami``
trochę informacji na ten tematBrachylog , 14 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
MATL , 8 bajtów
Wypróbuj online!
źródło
Partia, 175 bajtów
s
spełnia tutaj podwójną funkcję, ponieważ zawiera zarówno listę alfanumeryczną, jak i losowo wybrane znaki. Po wydrukowaniu wyniku kod przechodzi do podprogramu, którego wynik jest ignorowany.źródło
Pyke , 4 bajty
Wypróbuj online!
źródło
MemoryError
Pyth,
711 bajtówWypróbuj online
Wyjaśnienie
źródło
C # - 121 bajtów
źródło
APL (Dyalog) z AGL , 17 bajtów
Wypróbuj online!
(
...)[
...]
wskaźnik do⎕A,∆a,⎕D
wielkie litery, następnie małe litery, a następnie cyfryza pomocą
62
(liczba możliwych symboli⍴
przekształcony przez⎕
oceniane wejście ( n )?
zmień każde 62 na liczbę losową z zakresu 1… 62APL (APLX) , 17 bajtów
źródło
Bash , 43 bajty
Wypróbuj online!
źródło
Pip , 13 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 63 tokenizowane bajty BASIC
W ZX81 nie ma małych liter bez użycia asemblera lub jakiejś pamięci ROM UDG lub czegoś takiego, a na razie tylko wyjściowy
A-Z
. Jeśli zostanie wprowadzone zero, program zatrzyma się i powróci do trybu bezpośredniego.źródło
Japt ,
128 bajtówSpróbuj
źródło
Skumulowane , 33 bajty
Wypróbuj online! Pobiera dane wejściowe z góry stosu i pozostawia dane wyjściowe na górze stosu.
źródło