Załóżmy funkcję która pobiera ciąg znaków i usuwa wszystkie pary sąsiednich identycznych znaków. Na przykład
Zauważ, że gdy dwie pary zachodzą na siebie, usuwamy tylko jedną z nich.
Wywołamy łańcuch idealnie sparowany, jeśli powtarzająca się aplikacja ostatecznie zwróci pusty łańcuch. Na przykład ciąg powyżej nie jest idealnie sparowany, ponieważ jeśli zastosujemy ponownie , nadal otrzymamy . Jednak ciąg taki jak jest idealnie sparowany, ponieważ jeśli zastosujemy f trzy razy, otrzymamy pusty ciąg
Twoim zadaniem jest napisanie idealnie sparowanego kodu komputerowego, który pobiera ciąg (drukowalnego ASCII) i decyduje, czy jest idealnie sparowany. Bajtowanie źródła musi samo w sobie być idealnie sparowanym ciągiem , chociaż kod niekoniecznie musi być ograniczony do drukowalnego ASCII.
Możesz wyprowadzić dwie różne wartości: jedną dla przypadku, w którym dane wejściowe są idealnie sparowane, a drugiego dla przypadków, w których nie jest.
To jest pytanie w golfa kodu, więc odpowiedzi będą oceniane według wielkości w bajtach źródła, przy czym mniej bajtów jest lepszych.
Przypadki testowe
źródło
Odpowiedzi:
Haskell,
146124 bajtówBez komentarza. Zwraca albo
True
alboFalse
.Wypróbuj online!
Edycja: -22 bajtów dzięki @Cat Wizard
źródło
Python 2 , 94 bajty
Wypróbuj online!
Cały krok aktualizacji
ss=[cc+ss,ss[1:]][cc==ss[:1]]
anuluje się do just=[+,[
.źródło
05AB1E ,
26 24 22 2018 bajtów-2 bajty dzięki ovs . Zwraca 0, jeśli łańcuch jest idealnie sparowany, w przeciwnym razie 1 .
Wypróbuj online!
Poprzednie wersje
Ten opiera się wyłącznie na niezdefiniowanym zachowaniu (więc nie ma „martwego kodu”) i zwraca [['0']] dla idealnie sparowanych ciągów i [['1']] dla niedopasowanych ciągów:
I 22-bajtowa wersja, wyjaśniona, która jest tylko powyższym, ale nie nadużywającym UB, i dająca rozsądne wartości.
źródło
Cubix , 54 bajty
Nie wyprowadza nic, jeśli łańcuch jest idealnie sparowany i
1
inaczej.Wypróbuj tutaj
Cubified
Wyjaśnienie
Większość znaków to wypełniacze potrzebne do idealnego sparowania kodu. Zastępujemy je
.
(no-op), otrzymujemyMożna to podzielić na trzy etapy:
i
i lewy?
).źródło
V ,
20, 18 bajtówWypróbuj online!
Hexdump:
Wyprowadza 0 dla prawdy, 1 dla fałszu. Dzięki nmjcman101 za pośrednie oszczędzanie 2 bajtów.
źródło
^$
z.
i zwraca 0 dla truthy, niczego innego dla falsy? Jestem trochę mglisty, jeśli nie robię tego przez jakiś czas.R ,
142126 bajtówŚcisła logika i niektóre bajty komentowane przez golfa @Giuseppe
Wypróbuj online!
Oryginalny:
Wypróbuj online!
Funkcja detektora rekurencyjnego, po której następuje komentarz ze wszystkimi znakami w funkcji w odwrotnej kolejności.
źródło
APL (Dyalog) , 38 bajtów
Wypróbuj online!
źródło
Retina ,
2826 bajtówWypróbuj online!
Wyjścia
`C1\).(`+0`C1\).(`+
dla falsy i`C1\).(`+1`C1\).(`+
dla truthy przypadkach.źródło
Brain-Flak ,
228200 bajtówWypróbuj online!
To jest trochę dowód koncepcji. Prawdopodobnie może być krótszy. Nie używa jednak żadnych komentarzy.
Wyprowadzane,
0,0
jeśli wejście jest idealnie sparowane, a0,1
jeśli wejście nie jest.źródło
sed 4.2.2 , 34 bajty
Wypróbuj online!
Sparowane ciągi dają pusty wynik, niesparowane dają
ct:
Trywialna wersja palindromowa ma 32 lata
:;ss(.)\1ss;t;/./cc/./;t;1\).(;:
. Stare rozwiązanie zostało:;ss((..??\??))\1ss1;t;;/./cc/./t:
(zmienione, ponieważ obecnec
mniej nadużywa , edytuj: tak, teraz jest tylko 1 znak poc
: D)(zwróć uwagę, że
;
jest to separator instrukcji):
deklaruje pustą etykietę:t
deklaruje etykietęt
ss((..??\??))\1ss1
jest podstawieniem, w sed możesz zmienić separator na podstawienie, i to właśnie zrobiłem, zmieniając nas
, więc to, co robi, zastępuje pierwszy (jak oznaczono1
na końcu)dopasowanie
((..??\??))\1
.
dowolna postać.??
a następnie opcjonalny opcjonalny znak\??
i opcjonalnie?
z niczym
Teraz podstawienie jest sparowane ze sobą, więc
;
s przed i po nim również zostaną anulowanet
i zapętlić z powrotem do etykiety, aż nie będzie już udanych podmiany/..?/
if.
(znak wieloznaczny), po którym następuje.?
znak opcjonalnycc
zmień bufor nac
źródło
Brain-Flak ,
112 110108 bajtówWypróbuj online!
Jest to oparte na mojej odpowiedzi z Czy nawiasy są dopasowane? .
Próbowałem nie używać komentarzy, ale utknąłem próbując sparować pop nilads (
{}
). Problem polega na tym, że najłatwiejszym sposobem na sparowanie pary wsporników jest otoczenie ich inną parą tego samego rodzaju. Chociaż jest to łatwe dla innych nilad,{...}
monada tworzy pętle. Aby wyjść z pętli, musisz nacisnąć 0, ale po wyjściu z pętli musisz zerować 0, co komplikuje problem.66-bajtowe wstępnie sparowane rozwiązanie to:
Wypróbuj online!
Wyjścia
1
lub1,0
jeśli wejście jest idealnym parowaniem,0,0
jeśli nie.Brak wersji komentarza, 156 bajtów
Wypróbuj online!
Jak zauważył Cat Wizard, pierwsza odpowiedź nie działa dla wszystkich tłumaczy, ponieważ nie wszystkie obsługują
#
komentarze. Ta wersja nie zawiera komentarzy.źródło
Japt,
2422 bajtówWyjścia
false
dla truthy itrue
dla falsey.Spróbuj
źródło
«e"(.)%1
zadziała?«
.Brain-Flak , 96 bajtów
Wypróbuj online!
Nie wyprowadza nic, jeśli dane wejściowe są idealnie sparowane, i
0
inaczej.Niezupełnie sparowana (oryginalna) wersja:
Wypróbuj online!
źródło
Haskell , 66 bajtów
Wypróbuj online!
Kreator Cat zapisał 6 bajtów.
źródło
Dodaj ++ , 146 bajtów
Wypróbuj online!
Ciekawostka: na długo przed uruchomieniem wyjaśnienia było 272 bajty, teraz pokonuje Javę.
Wyjścia
True
dla idealnie zbalansowanych ciągów znaków iFalse
nie tylkoKu mojej wielkiej satysfakcji pokonuje nudną wersję palindromize o 2 bajty, aby zapobiec dwukrotnemu wydrukowaniu wyniku. Starałem się również mieć jak najmniej martwego kodu, ale wciąż jest kilka skomentowanych sekcji, a kod wychodzi z kodem błędu 1 , po wydrukowaniu poprawnej wartości.
NB : błąd z
BF
poleceniami została ustalona podczas gdy ta odpowiedź była w rozwoju.Jak to działa
Kod zaczyna się od zdefiniowania dwóch kluczowych funkcji,f f i sol . These two functions are used to calculate the next step in the process of removing pairs, and work entirely from ff i.e. only ff is called from the main program, never g . If we define the input string as S , ff(S) modifies S in the following way:
First, identical adjacent characters inS are grouped together. For an example of abbbaabacc , this yields the array [[a],[bbb],[aa],[b],[a],[cc]] . Over each of the sublists (i.e. the identical groups), we run the function g , and replace the sublists with the result of the function.
Jak widziszx wskazuje, ile kolejnych znaków chcemy zachować. W przypadku prostych par usuwamy je całkowicie (uzyskując 0 następnego znaku), w przypadku samotnych postaci pozostawiamy je nietknięte lub dajemy 1 z nich, a dla grup, w którychx>2 , we want x−2 of the character. In order to generate x of the character, we repeat the character with
*
, and the function naturally returns the top element of the stack: the repeated string.Afterg(s) has been mapped over each group s , we splat the array to the stack to get each individual result with g , this essentially removes them, as the empty string concatenated with any string r results in r . Anything after the two
BF
. Finally, the^
flag at the function definition (D,ff,@^^,
) tells the return function to concatenate the strings in the stack and return them as a single string. For pairs, which yielded the empty string from;;
is a comment, and is thus ignored.Pierwsze dwa wiersze definiują dwie funkcje,f f i sol , ale nie wykonuj f f jeszcze Następnie pobieramy dane wejściowe i przechowujemy je w pierwszej z naszych 4 zmiennych. Te zmienne to:
Jak widać, wszystkie zmienne i funkcje (opróczsol ) mają nazwy dwuliterowe, co pozwala dość szybko usunąć je z kodu źródłowego, zamiast komentarza ze znaczną ilością x y a b . sol nie robi tego z jednego głównego powodu:
Jeśli operator, taki jaka b c , należy zawrzeć nazwę funkcji sol , g g , kod dlaf f i sol musiałby zmienić na
€
, zostanie przejechany przez funkcję zdefiniowaną przez użytkownika{...}
, aby operator mógł pobrać całą nazwę. Jeśli jednak nazwa jest pojedynczym znakiem, takim jak{...}
można pominąć. W takim przypadku, jeśli nazwa funkcji toktóry jest 4 bajty dłuższy.
Ważnym terminem, który należy teraz wprowadzić, jest zmienna aktywna . Wszystkie polecenia oprócz przypisania przypisują swoją nową wartość do zmiennej aktywnej, a jeśli aktywna jest zmienna aktywna, można ją pominąć w argumentach funkcji. Na przykład, jeśli aktywną zmienną jestx = 5 , a następnie możemy ustawić x = 15 przez
Aktywna zmienna tox domyślnie, ale można to zmienić za pomocą
`
polecenia. Podczas zmiany aktywnej zmiennej należy pamiętać, że nowa aktywna zmienna nie musi wcześniej istnieć i jest automatycznie przypisywana jako 0.Po zdefiniowaniuf f i sol , przypisujemy dane wejściowe do x x z x x jest pusty. Dlatego przypisujemy prawdziwą wartośćaa z 1 . Następnie przypisujemy prawdziwośćx x do b b z dwiema liniami
xx:?
. Następnie musimy bardzo nieznacznie manipulować warunkami pętli. Po pierwsze, chcemy się upewnić, że wejdziemy w pętlę while, chyba żeaa:1
najkrótszą taką wartościąKtóry pierwszy robib b aktywna zmienna, a następnie uruchamia komendę boolean x x . Odpowiednie wyborya a : = 1 i b b : = ¬¬ x x materia, jak pokażemy później.
Następnie wchodzimy do naszej pętli while:
Pętla while jest konstrukcją w Add ++: działa bezpośrednio na kodzie, a nie na zmiennych. Konstrukty pobierają szereg instrukcji kodu, oddzielonych za pomocą
,
których działają. Instrukcje while i if przyjmują również warunek bezpośrednio przed pierwszym,,
który składa się z jednej poprawnej instrukcji, takiej jak polecenie infiksowe ze zmiennymi. Należy zauważyć: aktywnej zmiennej nie można pominąć w warunku.Pętla while składa się z warunkuaa i b b są prawdomówni. Najpierw tworzy treść koduy y aktywna zmienna w celu przechowywania wyniku f f (x) . Odbywa się to za pomocą
aa*bb
. Oznacza to zapętlenie podczas gdy obaNastępnie aktywujemy warunek pętliaa . Mamy dwa warunki do ciągłego zapętlania:
Jedną z największych wad Add ++ jest brak instrukcji złożonych, co wymaga posiadania drugiej zmiennej pętli. Przypisujemy dwie zmienne:
Z kodem
Gdziex x zmienna ma być y y zmienna z
|
jest operatorem nierówności iB
konwertuje na wartość logiczną . Następnie aktualizujemyxx:yy
, w przygotowaniu do następnej pętli.Ta pętla while ostatecznie redukuje dane wejściowe do jednego z dwóch stanów: pustego ciągu lub stałego ciągu, nawet gdy jest zastosowanyf f . Kiedy tak się stanieaa lub b b skutkują False, wyłamując się z pętli.
Po przerwaniu pętli może ona zostać zerwana z jednego z dwóch powodów, jak wspomniano powyżej. Następnie wyprowadzamy wartośćaa . Jeśli pętla została przerwana z powodux = y , a następnie zarówno dane wyjściowe, jak i aa są fałszywe. Jeśli pętla została przerwana, ponieważy y był więc równy pustemu ciągowi znaków b b jest falsy i aa a wyniki są zgodne z prawdą.
We then reach our final statement:
Program może teraz znajdować się w jednym z trzech stanów, w których znajduje się aktywna zmiennab b :
Jak widzisz,b b jest równy oczekiwanemu wynikowi (aczkolwiek odwrócony od logicznej odpowiedzi), więc po prostu go wysyłamy. Ostatnie bajty, które pomagają nam pokonać Javę, pochodzą właśnie z tegob b jest aktywną zmienną, więc można ją pominąć w argumencie, pozostawiając nam wyjście T R U e lub F a l s e , w zależności od tego, czy sygnał wejściowy jest idealnie zbalansowany, czy nie.
źródło
JavaScript (ES6), 76 bajtów
Zwraca wartość logiczną.
Wypróbuj online!
Sugerowane przez @Shaggy: 58 bajtów poprzez zwrócenie pustego łańcucha w celu idealnego sparowania lub zgłoszenie błędu w inny sposób.
źródło
Wolfram Language (Mathematica) ,
7064 bajtówWypróbuj online!
Bez komentarzy, 92 bajty
Wypróbuj online!
źródło
Lua , 178 bajtów
Wypróbuj online!
Choć jest to strasznie długie rozwiązanie, w dużym stopniu wykorzystuje dziwactwa charakterystyczne dla Lua. Jest to właściwie algorytm zminimalizowanego stosu sił. Program komplikuje fakt, że wzorce Lua nie pozwalają na zamianę par, a wyrażenie regularne nie jest wbudowane.
Wyjaśnienie:
źródło
Gol> <> , 30 bajtów
Wypróbuj online!
Wszystko po pierwszym
B
jest kodem nadmiarowym i nie jest wykonywane. Funkcja, która zwraca górę stosu, tak1
jakby wejście było idealnym parowaniem, w0
przeciwnym razie.Wyjaśnienie:
źródło
Cubix , 30 bajtów
Wypróbuj online!
Wyjścia
1
jeśli łańcuch jest idealnie sparowany i nic innego.Cubified
Uproszczony
Logika i ogólna struktura są takie same jak w odpowiedzi Mnemonica, ale bez wyraźnego sprawdzenia pustego ciągu.
źródło
Haskell , 92 bajty
Wypróbuj online!
Odpowiedź @ nich jest całkiem fajna, nie używa żadnych komentarzy. Ten jest krótszy, ale używa komentarza.
Odpowiedź @ xnora jest również całkiem fajna, wykorzystuje komentarze i jest krótsza niż ta.
źródło
Python 2 , 114 bajtów
Wypróbuj online!
Zwraca
True
za idealnie sparowane ciągi,False
przeciwnym razie.(W rzeczywistości nie weryfikuje się, ponieważ
(.)
nie pasuje do nowych linii w kodzie! Ale @Cat Wizard powiedział, że jest to w porządku, ponieważ nowe linie nie są drukowalnymi znakami ASCII, więc mój program nie musi ich obsługiwać).To jest idealnie sparowana wersja:
dla których „leniwsze” doskonalenie
code + '##' + f(code[::-1])
dałoby 120 bajtów. (Oznacza to zmianę nazwy zmiennych itp., Aby wprowadzić więcej zwiniętych par wewnątrz komentarza, w połowie kodu zapisano 6 bajtów.)źródło
Galaretka ,
26 2422 bajtówWypróbuj online!
Dziwnie wydaje się działać bez przenoszenia wstecznego kodu na nieużywany link.
Zwraca 0, jeśli wejście jest idealnie sparowane, 1 przeciwnym razie .
Aktywny kod:
źródło
Attache , 82 bajty
Wypróbuj online!
Nic niesamowitego tutaj.
Fixpoint
funkcja, która usuwa kolejne pary.źródło
Java 8,
158156154 bajtówZwraca wartość logiczną (
true
/false
).-2 bajty dzięki @raznagul .
Wypróbuj online.
Wyjaśnienie:
źródło
s
, abyn
i dodanie drugiego miejsca doreturn s.isEmpty
można usunąćs n
z komentarzem, oszczędzając 2 bajty w sumie.