Masz monetę, która produkuje 0
lub 1
. Ale podejrzewasz, że moneta może być stronnicza , co oznacza, że prawdopodobieństwo 0
(lub 1
) niekoniecznie wynosi 1/2.
Dobrze znana procedura „przekształcić” tendencyjnego monety do sprawiedliwego monety (czyli uzyskanie równie prawdopodobnych wyników), w wersji zaproponowanej przez von Neumanna, jest następująca. Wytwarzaj (nie zachodzące na siebie) bloki dwóch rzutów monetą, aż dwie wartości bloku będą się różnić; i wypisz pierwszą wartość w tym bloku (druga wartość też by zrobiła, ale dla celów tego wyzwania wybieramy pierwszą). Intuicyjnie 1
może być bardziej prawdopodobne 0
, ale 01
i 10
równie prawdopodobne.
Na przykład dane wejściowe 1110...
odrzuciłyby pierwszy blok, a następnie wygenerowałyby 1
z drugiego bloku, ...
Ta procedura jest droga , ponieważ do wygenerowania jednego wyniku zużywa się kilka rzutów monetą.
Wyzwanie
Weź skończoną sekwencję zer i jedynek, reprezentujących rzuty oryginalnej monety, i uzyskaj maksymalną liczbę wyników zgodnie z powyższą procedurą, aż do wyczerpania całego wkładu.
Ostatni blok może być niekompletny, jeśli liczba wartości wejściowych jest nieparzysta. Na przykład sekwencja wejściowa 11111
nie dałaby rezultatu (pierwsze dwa bloki mają równe wartości, a trzeci blok jest niekompletny).
Zasady
Dane wejściowe mogą mieć dowolną nieujemną liczbę wartości, niekoniecznie dodatnią, a nawet parzystą.
Format wejściowy może być:
- tablica zer i jedynek;
- ciąg zer i jedynek z opcjonalnym separatorem.
Format wyjściowy może być:
- ciąg zer i jedynek, z separatorami lub bez;
- tablica zer i jedynek;
- ciągi zawierające pojedyncze zero lub jeden, oddzielone znakami nowej linii;
- każdy podobny, rozsądny format, który pasuje do twojego języka.
Kod golfa. Wygrywa najmniej bajtów.
Przypadki testowe
Zakłada się, że dane wejściowe i wyjściowe są ciągami.
Input --> Output
'1110' --> '1'
'11000110' --> '01'
'1100011' --> '0'
'00' --> ''
'1' --> ''
'' --> ''
'1101001' --> '0'
'1011101010' --> '1111'
Odpowiedzi:
Galaretka, 6 bajtów
Wypróbuj online!
Jak to działa
źródło
Siatkówka ,
1614 bajtówWypróbuj online!
Wyjaśnienie
To jest dość proste. Kod definiuje pojedyncze podstawienie wyrażenia regularnego, które zastępuje wszystkie (nie nakładające się) dopasowania
(.)\1|(.)?.
dowolną przechwyconą drugą grupą. Łączy to trzy różne przypadki w jeden:Jeśli dwie powtarzające się cyfry są równe, usuwamy je z łańcucha (ponieważ grupa 2 nie jest używana).
W przeciwnym razie, jeśli uda nam się dopasować dwa znaki, usuń drugi, zastępując oba z nich pierwszym. Jeśli tak nie
?
jest, grupa pominie:Dzieje się tak tylko wtedy, gdy występuje sparowany znak końcowy, który również jest usuwany.
źródło
Labirynt ,
2112 bajtówRzadki przykład kompaktowego programu Labirynt, który również nie ma żadnych operacji.|
W poprzedniej wersji było całkowicie zbędne, a usunięcie go znacznie zmniejszyć rozmiar programu. W rzeczywistości laboratorium bije siatkówkę!Wypróbuj online!
Lewy dolny róg
"
może również być spacją, ale umieszczenie go tam znacznie upraszcza wyjaśnienie.Wyjaśnienie
Ten jest trochę trudniejszy, więc towarzyszą mu obrazy. Ale najpierw szybki podkład:
Ustawiać
Program rozpoczyna się w lewym górnym rogu
"
, co oznacza brak operacji . Następnie wykonujemy:To pozostawia stos z pojedynczym 0, co jest tak dobre, jak puste dla celów Labiryntu.
Odczytywanie danych wejściowych i terminacji
,
odczytuje karbonizatu z wejściem, powrót do 48 lub 490
lub1
odpowiednio, -1 i EOF. Ponieważ jest to niezerowe, tak czy inaczej zamieniamy się w:
, który duplikuje górę stosu.:
Jest przy ślepej uliczce, więc zawrócić i wykonać,
jeszcze raz. Teraz jeśli ostatni wejście było EOF, a następnie skręcamy w lewo i kończą się@
, w przeciwnym razie możemy skręcić w prawo, ze stosu wygląda jak[a a b]
(gdziea
,b
to dwa znaki).Interpretacja rzutu monetą
Jeśli nie zakończymy, naszym następnym ruchem jest wykonanie ponownie
$
(bitowe xor) ponownie. Daje to 0, jeśli znaki wejściowe były takie same, w przeciwnym razie 1. Następnie mnożymya
z tym wynikiem, dając albo 0, alboa
. Od czasu*
jest na skrzyżowaniu, ta górna wartość stosu określa, co będzie dalej.W przypadku 0 idziemy przed siebie i wykonujemy trzy operacje
"
no-op, zanim wykonamy(
dekrementację. Podobnie jak konfiguracja, powoduje to, że obracamy się i wykonujemy"*$
, pozostawiając nas gotowymi do przeczytania kolejnych znaków.W przeciwnym razie
a
na skrzyżowaniu skręcamy w prawo, ponieważa
jest dodatni (48 lub 49)..
wyprowadza char, pozostawiając stos pusty, i(
zmniejsza jego górną część, zmieniając wartość z 0 na -1. Ponownie powoduje to, że skręcamy w lewo, wykonując"*$
jak w konfiguracji, pozostawiając nam także gotowość do przeczytania większej ilości danych wejściowych.źródło
(
wtedy wykonywać.
, generując char 255 (-1 modulo 256). Więc już jest źle zaczynając od tego, niestety: PCJam,
108 bajtówSprawdź to tutaj.
Wyjaśnienie
Jest to bardzo proste rozwiązanie: w każdej parze usuń wszystkie wystąpienia ostatniej postaci. Powtarzane cyfry i niesparowane cyfry końcowe zostaną usunięte, podobnie jak druga cyfra w dowolnej parze nierównych cyfr:
Pozostawia to tylko cyfry, których szukamy. Oto jak to oblicza kod:
Gdy lista jest automatycznie drukowana na końcu programu, puste ciągi znaków są po prostu pomijane.
źródło
Perl,
191817 bajtów@Martin Büttner Rozwiązanie Retina zainspirowało 2 bajty
Obejmuje +1 dla
-p
Uruchom z wejściem na STDIN, np
perl -p fair.pl <<< 11000110
fair.pl
:Nie wiele do wyjaśnienia, ponieważ jest to (pośrednie) tłumaczenie specyfikacji:
(.)\1
Jeśli pierwsze 2 cyfry są takie same, upuść je.\K.
W przeciwnym razie dwie pierwsze cyfry są różne. Keep (\K
) pierwszy.?\K.
Tyle że pierwszy.
jest opcjonalny. Pozwala to na pojedyncze dopasowanie na końcu łańcucha, które następnie zostaje odrzucone, ponieważ zachowana część jest pustaźródło
Mathematica, 36
38bajtów-2 po kradzieży funkcji @ LegionMammal978 w celu ustalenia, czy lista 2-elementowa to {0,1} czy {1,0}
Argument ma być listą liczb całkowitych.
źródło
Sześciokąt ,
2321 bajtówRozłożony:
To kończy się błędem, ale komunikat o błędzie trafia do STDERR.
Wypróbuj online!
Sądząc po liczbie luster, może być prawie możliwe zmieszczenie go w bocznej długości 3, ale jak dotąd nie miałem szczęścia.
Wyjaśnienie
Oto zwykły schemat wygenerowany za pomocą HexagonyColorer Timwi :
Program używa tylko trzech krawędzi pamięci, oznaczonych tutaj A , B i C (schemat dzięki uprzejmości Timoter's EsotericIDE ):
Wykonanie rozpoczyna się na niebieskiej ścieżce. To
/
tylko mirrory, które przekierowują wskaźnik instrukcji (IP), rzeczywisty kod to:,
Ustawi krawędź-1
zamiast kodu znaków jeśli mamy hit EOF. Ponieważ zwiększamy oba dane wejściowe, nie zmienia to, czy są one równe, czy nie, ale zmienia EOF w0
.Używamy modulo celu sprawdzenia równości, bo to albo
1
lub49
(pozytywny) na nierównych znaków i0
na równych znaków. Służy również jako koniec programu, ponieważ kiedy mamy0
z EOF, próba dzielenia przez zero spowoduje błąd.Teraz
<
odróżnia zera od pozytywnych wyników. Prosty pierwszy: jeśli znaki są równe, adres IP podąża czerwoną ścieżką._
jest lustrem,\
jest także lustrem, ale zostaje zignorowane i>
odchyla adres IP tak, że owija się wokół krawędzi i zaczyna od nowa od góry. Jednak w tej iteracji role A , B i C są cyklicznie zamieniane ( C przyjmuje teraz rolę A i tak dalej).Jeśli postacie są różne, zamiast tego wybierana jest zielona ścieżka. Ten jest nieco bardziej chaotyczny. Najpierw przeskakuje przez brak op
$
, a następnie owija się do/
lewej krawędzi, następnie przechodzi od drugiego do ostatniego rzędu od prawej do lewej, a na koniec ponownie wprowadza interesującą część kodu źródłowego na{
. Jest zasadniczo liniowy kawałek kodu, który wyjaśnię za sekundę, zanim$
IP przeskoczy nad,>
aby ponownie połączyć dwie ścieżki.Oto ten liniowy fragment kodu:
Zauważ, że w tym przypadku role krawędzi dla następnej iteracji są również wymieniane cyklicznie, ale B przyjmuje rolę A i tak dalej.
źródło
Haskell,
714429 bajtówEkstremalne golfa przez Nimi .
źródło
> <> , 11 bajtów
> <> całkiem dobrze nadaje się do takich wyzwań, jak czytanie char-at-a-time :) Wypróbuj online!
Wszystko to dzieje się w pętli, ponieważ wskaźnik instrukcji otacza się, gdy osiągnie koniec linii.
źródło
>
lub<
Python, 42 bajty
Zabawa z rekurencją i bitową xor. Pobiera na wejściu listę 1 i 0.
źródło
JavaScript (ES6), 33 bajty
Jak to działa
źródło
Preludium , 12 bajtów
Zakłada się, że interpreter odczytuje i drukuje znaki. Możesz spróbować w Internecie. Ale ten interpreter wypisuje liczby całkowite, więc dla każdego
0
dostaniesz48
i dla każdego1
dostaniesz49
zamiast tego (i linefeed).Wyjaśnienie
Bardzo rzadko można napisać nietrywialny program w jednym wierszu w Preludium (ponieważ Prelude wymaga więcej niż jednego wiersza, aby Turing-complete).
źródło
Perl,
2721 bajtówDodano bajt dla
-n
flagi.Test:
Dzięki @TonHospel za 6 bajtów!
źródło
say grep$_-chop,/../g
Befunge 93 , 16 bajtów
Jednowarstwowa dla zwartości. Testowane przy użyciu tego internetowego tłumacza .
Ostatnia część wykorzystuje fakt, że wyskakiwanie z pustego stosu Befunge-93 daje 0 .
Jeśli
a != b
wykonamyW przeciwnym razie
a == b
wykonujemy:źródło
Pyth
109 bajtówAlgorytm bezwstydnie skradziony z galaretki Dennisa .
źródło
Python 2, 48 bajtów
Wypróbuj online
Podziękowania dla Dennisa i vaultah za wskazanie rzeczy, które mi umknęły
źródło
zip(*[iter(n)]*2)
Mathematica,
4139 bajtówMniej skomplikowane i krótsze niż druga odpowiedź. Pole jest znakiem transponującym.
źródło
JavaScript (ES6), 33 bajty
Nudny port odpowiedzi Retina.
źródło
sed,
3433 bajtyTest:
źródło
fold(1)
polecenia, aby podzielić na pary. To również wyszło w wieku 34 lat!fold -s2|sed 's+01+0+p;s+10+1+p;d'
fold -s2
jest równoważnefold -2
, co sprawia, że 33 bajty ... do tego właśnie właśnie grałem w czyste rozwiązanie sed. : Ps/../& /g;s/00\|11\|.\b\| //g
Labirynt , 31 bajtów
Nie tak krótkie i schludne jak rozwiązanie Sp3000, ale pomyślałem, że i tak opublikuję to jako inne podejście:
Wyjaśnienie
Pierwsza pętla jest po prostu
który odczytuje dwa znaki na raz (
"
nie ma operacji ). Po EOF,
powróci-1
, ale sprawdza EOF tylko co drugi znak. Oznacza to, że w każdym razie górna część stosu będzie wtedy-1
a wartość poniżej to albo-1
lub jakiś kod znakowy, który nas nie obchodzi, ponieważ jest to niesparowany rzut monetą.Następnie
)*
zamienia-1
poniższe wartości i w jeden,0
którego potrzebujemy a), aby pozbyć się tych dwóch wartości i b), aby poprawnie przejść do następnej pętli. Ta następna pętla jest po prostuKtóry przenosi wszystkie wartości na stos pomocniczy. Jest to konieczne, ponieważ chcemy rozpocząć przetwarzanie par, które najpierw czytamy. Teraz ostatnia pętla:
Po
)
prostu zwiększa wartość manekina, aby upewnić się, że jest dodatnia, a wskaźnik instrukcji skręca na północ.{
przeciąga pierwszą cyfrę następnej pary i:
kopiuje ją. Teraz, gdy skończymy przetwarzanie, będzie to0
od dołu stosu pomocniczego. Inaczej to albo48
albo49
. W przypadku zera wychodzimy z pętli i kończymy@
, w przeciwnym razie IP skręca na wschód.{
przesuwa drugą cyfrę bieżącej pary.$
bierze XOR między nimi. Jeśli jest to 0, tzn. Dwa są równe, IP po prostu kontynuuje przemieszczanie się na południe,;
odrzuca zero, a IP zmienia się na zachód w następną iterację. Jeśli XOR był1
, tzn. Były różne, IP skręca na zachód, odrzuca1
z;
i drukuje pierwszą cyfrę z.
.źródło
MATL ,
1198 bajtówDane wejściowe i wyjściowe są liczbami oddzielonymi znakami nowej linii. Kończy się błędem (domyślnie dozwolonym), gdy wszystkie dane zostaną wykorzystane.
Wypróbuj online!
Stare podejście, 11 bajtów
Dane wejściowe to ciąg znaków. Dane wyjściowe to liczby oddzielone znakami nowej linii.
Wypróbuj online!
źródło
Rubinowy, 46 bajtów
Oddziela
l[0]
,l[1]
il[2..{end}]
wa
,b
ic
. Następnie tworzy ciąg znaków z,a
jeślia!=b
lub w''
inny sposób, af[c]
jeślic[0]
istnieje lub w''
inny sposób.Nie golfowany:
źródło
pieprzenie mózgu, 33 bajty
W porównaniu z Javą jest to bardzo kompaktowe, ale obawiam się, że odpowiem na głupców. I nie krępuj się wspomnieć, jeśli występuje błąd. Zakładając, że EOF wynosi 0, dane wejściowe nie zawierają nieprawidłowych danych wejściowych, komórka początkowo wynosi zero, a zakres wartości komórki jest skończony i cykliczny. Nie ma innych założeń.
Wyjaśnienie:
Mapa komórek pamięci
Instrukcja
źródło
Mathematica, 41 bajtów
Anonimowa funkcja, która wprowadza i wyprowadza listy zer i jedynek.
źródło
#&@@a
jest o 1 bajt krótszy niża[[1]]
.RuleDelayed
.Transpose
:(Pyth, 10 bajtów
Zestaw testowy
źródło
!q
,n
a następnie filtrowaćfnFT
wedługnF#
. (hMnF#cz2
; o tym pomyślałem, kiedy zobaczyłem wyzwanie, ale twoje jest wystarczająco blisko, abym nie opublikował go osobno)1
C, 66 bajtów
Zarozumiały
sizeof(int) == sizeof(char *)
„sprytne” rozwiązanie -
8481 bajtówDziała na maszynie little-endian przy założeniu, że
short
ma 2 bajty. Dane wejściowe są przekazywane jako argument. Program iteruje po parach znaków i wypisuje 0 dla 0x3130 i 1 dla 0x3031. Na grubokońcej zostanie odwrócony wynik (zamiast48|c&1
z49^c&1
to naprawić).źródło
C, 57 bajtów
Wstępnie kopiujemy znak z danych wejściowych
p
do wynikur
, ale przesuwamyr
wskaźnik tylko wtedy, gdy różni się on od następnego znaku. Jeśli nie, zastąpimy go przy następnej niedopasowanej parze lub za pomocąNUL
na końcu.Program testowy:
Wyjście testowe:
źródło
Befunge-93 , 40 bajtów
Możesz spróbować tutaj . Wklej kod w spację pod przyciskiem „pokaż”, naciśnij „pokaż”, zdefiniuj dane wejściowe, naciśnij „uruchom”. Używamy przycisku „krok”, aby zobaczyć, jak działa program.
źródło
Pakiet DOS / Windows,
201162 bajtówDane wejściowe to na przykład ciąg oddzielony spacją
1 0 0 1 1
. Zacznij od cmd, w przeciwnym razie ekran natychmiast się wyłączyźródło
wosk ,
4535 bajtówMogłem golfa o 10 bajtów - nieźle.
Wziąłem czytania pełny ciąg rzuca monetą podejście , co czyni program bardzo duża. Sam odczyt pojedynczych liczb całkowitych jeden po drugim sprawiłby, że program byłby mniejszy - może około 22 bajtów lub mniej więcej - ale również bardzo niewygodny w użyciu.
Przykłady:
Moje repozytorium GitHub wosku pszczelego.
Moje przykłady wosku pszczelego na temat kodu Rosetta.
źródło