Twierdzenie o nieskończonej małpie mówi, że w nieskończonym czasie maszyna wysyłająca nieskończony strumień losowych znaków zawsze będzie pisać dowolny tekst.
To brzmi dla mnie jak świetny pomysł na wyzwanie.
Proces
Aby małpować ciąg A, należy wykonać następujące kroki:
- Weź pusty ciąg. Nazwiemy ten ciąg B.
- Wybierz jednolicie losowy znak ASCII do wydrukowania (znaki w zakresie
0x20
do0x7E
) i dodaj ten znak do B. - Jeśli A jest podciągiem B, B jest naszym ciągiem małpy. W przeciwnym razie powtarzaj krok 2, aż A będzie podciągiem B.
Ten proces jest tylko przykładem, w zależności od języka mogą istnieć łatwiejsze metody. Nie musisz dokładnie stosować tej metody, o ile osiągnięty zostanie taki sam rozkład wyników.
Wyzwanie
Napisz program lub funkcję, która, biorąc pod uwagę niepuste ciągi znaków w dowolnym rozsądnym formacie , zwraca zmultipleksowaną wersję tego ciągu.
Twój program musi praktycznie działać tylko dla danych wejściowych o długości 3 lub mniejszej. W przypadku dłuższych danych wejściowych dozwolone jest wcześniejsze zakończenie z lub bez wysyłania czegokolwiek.
Przykład
Niestety, trudno jest stworzyć przykłady tego pytania ze względu na losowość i duże wyniki.
Mogę jednak podać jeden przykład danych wejściowych hi
na Hastebin.
Punktacja
Ponieważ jest to gra w golfa , wygrywa przesyłanie z najmniejszą liczbą bajtów.
B
bezpośrednio, przygotowując do nieujemnej liczbyn
losowych znakówA
. Jedyny prawdziwy problem to znajomość rozkładun
(stawiam na rozkład geometryczny).W!}zH+ZOrd\k
, wyglądają bardzo podobnie do tego, co napisała małpa.Odpowiedzi:
C, 192 bajty
Wypróbuj online!
Teraz jest bałagan, ale przynajmniej działa nawet w narożnych skrzyniach ...
C,636261 bajtówDzięki @Jonathan Frech za uratowanie bajtu!
Wypróbuj online!źródło
i
staje się wystarczająco duży, cos[i]
odnosi się do zerowego terminatora łańcucha (znak 0).ababc
a małpa generuje,!!abababc
czy Twój program się zatrzyma?Python , 79 bajtów
Wypróbuj online!
Jest to teoretycznie poprawne, ale zawiesi się wcześnie z powodu limitów rekurencji Pythona (możesz ustawić je dalej, aby uzyskać dłuższe wyniki)
Python, 84 bajty
Wypróbuj online!
Ten powinien działać na relatywnie dłuższe łańcuchy, ponieważ nie polega na rekurencji, kosztem 5 bajtów.
źródło
s+'randint(32,126)'
randint(32,126)
wygeneruje ciąg liczby, a nie mapowanie znaków asciiOhm v2 , 10 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
GNU sed + coreutils, 75 + 1 (flaga r) = 76 bajtów
Wypróbuj online! (Uzyskanie odpowiedzi dla danych wejściowych o długości 2 wymaga wielu przebiegów, ponieważ w większości przypadków kończy się dozwolony czas obliczeń TIO.)
Wyjaśnienie:
Benchmark: przybliżony, wyłącznie do celów skalowania
źródło
Funky , 64 bajty
Wykorzystuje kilka sztuczek, których chciałem użyć w Funky, takich jak nazwa zmiennej po słowie kluczowym jak w
whileS
i wykorzystując fakt, że ciągi domyślnie nadrzędne dostring
biblioteki.Bez golfa
Wypróbuj online!
źródło
Haskell , 100 bajtów
Wypróbuj online!
Podstawową ideą jest wygenerowanie nieskończonej listy znaków
randomRs
i zatrzymanie jej po znalezieniu łańcucha.źródło
isPrefixOf
nie jest w standardowym Preludium…C # (.NET Core) , 86 bajtów
Nie podoba mi się, ile
Random
zajmuje tworzenie instancji, ale nie sądzę, aby można było to obejść.Wypróbuj online!
źródło
Random.Next(Int32,Int32)
jest do wyłączności, a więc nie jest jedną z generowanych liczb. Można to naprawić, zastępując126
przez127
.Random
, możesz usunąć deklarację zmiennej! 79 bajtówPerl 5, 31 +2 (-pa) bajtów
Wypróbuj online
źródło
\E$
jest obcyJapt , 26 bajtów
Wypróbuj online!
źródło
R ,
797675 bajtów-3 bajty dzięki MickyT za zmianę losowego samplera
-1 bajt podziękowania dla Robina Rydera za ponowne poprawienie losowego samplera
Wypróbuj online!
źródło
intToUtf8(runif(1,32,127))
32+95*runif(1)
jako swój losowy próbnik.Węgiel drzewny,
151412 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 2 bajty ze względu na kolejną naprawę błędu w Charcoal. Wyjaśnienie:
źródło
Rubin , 42 bajty
Wypróbuj online!
źródło
Pyth - 14 bajtów
Wypróbuj online tutaj .
źródło
W!}Qk=+kpOrd\
ma również 14 bajtów, SE nie radzi sobie z formatowaniem z powodu braku możliwości wydruku, ale zakres jest generowany w ten sam sposóbMathematica, 65 bajtów
Wypróbuj online!
-3 bajty od Jonathana Frecha
źródło
FromCharacterCode[RandomInteger@94+32]
jest odpowiednikiem krótszegoRandomChoice@CharacterRange[32,126]
.Lua ,
99102 bajtówWypróbuj online!
źródło
MATL ,
1716 bajtówWypróbuj online!
-1 bajt dzięki Giuseppe
źródło
Oktawa , 62 bajty
Wypróbuj online!
Wyjaśnienie:
Ogromne podziękowania dla Luisa Mendo za edycję!
źródło
isvector
przeznnz
? Istrfind
przezregexp
. Możesz także użyćrandi(95)+31
, a może zastąpić całesprintf
zdanie przezo=[o,randi(95)+31];
(niejawna konwersja na char)Japt ,
161411 bajtówSpróbuj
źródło
Alice , 21 bajtów
Wypróbuj online!
Wyjaśnienie
Jest to struktura dla programów głównie liniowych, które działają całkowicie w trybie Ordinal (przetwarzanie łańcuchów). Adres IP dwukrotnie odbija się po przekątnej w górę iw dół przez program, co oznacza, że rzeczywisty kod jest nieco dziwnie przeplatany. Polecenia w kolejności, w jakiej są wykonywane, to:
Przejdźmy przez to:
źródło
Perl 6 , 39 bajtów
Wypróbuj online!
(...)[*-1]
zwraca ostatni element zdefiniowanej sekwencji...
, z czego:""
jest pierwszym elementem;* ~ (" " .. "~").pick
generuje następny element poprzez dołączenie losowego znaku z odpowiedniego zakresu do poprzedniego elementu; i* ~~ /$_/
to warunek końcowy, to znaczy, że bieżący element pasuje do argumentu wejściowego funkcji głównej$_
jako dosłowny podłańcuch.źródło
*~~
za -3 tio.run/##K0gtyjH7n1upoJamYPu/…Java 8,
817978 bajtów-1 bajka dzięki @ OlivierGrégoire za wskazanie mi (dużego>. <) Błędu, który popełniłem ..
Wyjaśnienie:
Wypróbuj tutaj.
źródło
32+Math.random()*95
. Tam ... błąd naprawiony i bajt zapisany! ;-)05AB1E ,
109 bajtów (-1 @ Emigna)Wypróbuj online!
Zrób ze mną małpę.
źródło
Ω
zamiast.R
.QBIC , 33 bajty
Wyjaśnienie
Przykładowy przebieg:
źródło
PHP, 55 + 1 bajtów
Uruchom jako potok z
-nR
. Nie nadaje się do TIO z powodu prawdopodobnego przekroczenia limitu czasu.Wstaw spację między znakami cudzysłowu dla PHP starszego niż 7.1.
Ta wersja 51 + 1 bajtów zakończy się niepowodzeniem, jeśli dane wejściowe to
0
:źródło
Javascript 74 bajty
zadzwoń tak:
źródło
~b.search
zamiastb.includes
.Julia 0.6 , 53 bajty
Wypróbuj online!
źródło
Natrętny ,
2018 bajtówWypróbuj online!
Program utrzymuje stos
len(input)
długi znaków i stale usuwa pierwszy i dołącza nowy losowy znak, aż do osiągnięcia początkowego ciągu wejściowego. Każda postać jest drukowana w miarę dodawania, tworząc pożądany efekt.Wyjaśnienie:
źródło
Brachylog , 17 bajtów
Wypróbuj online!
Może losowo przepełnić stos. Wykorzystuje to dwie ostatnio dodane funkcje Brachylog: zmienne globalne i metapredykat „zastosuj do ogona”
ᵗ
.źródło
Pyth, 13 bajtów
gdzie znak niedrukowalny to 0x7F.
Test
źródło
Bash 94 bajty
Wypróbuj online
źródło