Wprowadzenie
W ścianie są 3 gwoździe. Masz kawałek sznurka, który jest przymocowany do ramy obrazu na obu końcach. Aby powiesić obraz, zaplątałeś sznurek w gwoździe. Ale zanim puścisz zdjęcie: czy możesz przewidzieć, czy obraz spadnie, po prostu patrząc na to, jak sznurek jest owinięty wokół paznokci?
W pierwszym przykładzie obraz nie spadnie. W drugim przykładzie obraz spadnie.
Wyzwanie
Biorąc pod uwagę ścieżkę sznurka wokół N
gwoździ, określ, czy zdjęcie spadnie, czy nie. Zwróć wartość zgodną z prawdą, jeśli obraz ma spaść, w przeciwnym razie wartość fałsz.
Detale
- Możesz założyć, że paznokcie i zdjęcie są ułożone w regularny
N+1
sposób, z obrazem na dole. - Można założyć, że w linie nie ma węzłów, tzn. Linę można bez przerwy łączyć z jednego z dwóch końców.
- Każdy gwóźdź jest wyliczany zgodnie z ruchem wskazówek zegara za pomocą litery alfabetu. Możesz założyć, że jest maksymalnie 26 gwoździ (AZ).
- Owinięcie w prawo wokół gwoździa jest oznaczone małą literą, owinięcie w lewo jest oznaczone wielką literą.
Pierwszy przykład z góry zostanie zakodowany jako BcA
, drugi przykład jest zakodowany jako CAbBac
.
Dla skłonnego czytelnika: ten problem jest równoważny z ustaleniem, czy elementem wolnej grupy - wygenerowanym przez zestaw gwoździ - jest tożsamość, czy nie. Oznacza to, że wystarczy kilkakrotnie anulować podciągi, takie jak aA
lub, Aa
aż do osiągnięcia określonego punktu. Jeśli stałym punktem jest pusty ciąg, jest to element neutralny, w przeciwnym razie nie jest.
Przykłady
Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla
Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja
Odpowiedzi:
Retina , 21 bajtów
Wypróbuj online!
Podobnie jak rozwiązanie flawr, to po prostu wielokrotnie usuwa sąsiednie pary wielkich / małych liter, a następnie sprawdza, czy wynik jest pusty, czy nie.
Jeśli chodzi o to, jak dopasować parę wielkich / małych liter:
źródło
MATLAB, 76 bajtów
Octave,827977 bajtówTo może być pierwszy raz, kiedy MATLAB jest rzeczywiście krótszy niż Octave (o cały bajt)!
Nowa odpowiedź w MATLAB:
Odpowiedź w oktawie:
Zapisane
trzypięć bajtów dzięki flawr.~nnz(c)
jest krótszy niżisempty(c)
i'Aa'
jest o dwa bajty krótszy niż[0,32]
.Wypróbuj wersję Octave online!
Wyjaśnienie:
c=input('')
pyta użytkownika o dane wejściowe. Definiujemyk='Aa'
jako tablicę znaków.while k++<1e5
: Pętla gdzie oba elementyk
są zwiększane każdej iteracjiAa
,Bb
,Cc
i tak dalej. Pętla będzie kontynuowana, aż pojawi się największy element1e5
, który powinien być wystarczająco wysoki dla większości łańcuchów. Można go zwiększyć do9e9
bez zwiększania liczby bajtów.Podejmiemy tę
strrep
funkcję krokami, zaczynając od środka.Korzystając z niego
mod(k,64)
, otrzymamy następujące informacje, gdy dotrzemy do końca alfabetu (jeśli przekonwertujemy zk
powrotem na znaki):Jak widać, pomiędzy nimi będą znajdować się pewne symbole, ale potem zawiną się i zaczną ponownie od alfabetu, ale teraz najpierw od małych liter. Jest to bardzo krótki sposób sprawdzenia zarówno
Aa
iaA
.['',65+mod(k,64)]
konkatenuje wartości liczbowe zmod
-call, z pustym łańcuchem, konwertując liczby na znaki.strrep
służy do usuwania elementów z łańcuchac
i zwracania go. Wyszuka wszystkie wystąpieniak
ciągu i zastąpi go pustym ciągiem.Po
1e5
iteracjach albo będziemy mieli pusty ciąg, albo niepusty ciąg. Sprawdzamy, czy wc
użyciu są jakieś elementynnz(c)
. Wracamynot(nnz(c))
, więc1
jeśli jest pusta i0
jeśli pozostały w niej postaciec
źródło
Minkolang 0,15 , 30 bajtów
Wypróbuj tutaj!
Wyjaśnienie
Wykorzystano tu toroidalną naturę Minkolanga, aby wyeliminować potrzebę zewnętrznej pętli. Ogólna idea polega na tym, aby sprawdzić, czy dwa górne elementy stosu są od siebie oddzielone o 32 jednostki (co oznacza, że są parą wielkich / małych liter), a jeśli tak, usuń oba z nich. Ponieważ odbywa się to „w czasie rzeczywistym”, że tak powiem, zagnieżdżanie par jest obsługiwane poprawnie.
źródło
Haskell, 62 bajty
Wypróbuj online
Kredyt dla flawr za
abs
i Laikoni nafromEnum
mapie .Funkcja pomocnicza
%
pobiera już uproszczony ciągl
i wstawia symbola
przed uproszczeniem wyniku. Jeślil
zaczyna się od znaku odwrotnego doa
, anuluje się. W przeciwnym raziea
jest po prostu poprzedzony. Należy pamiętać, że na tym etapie nie są potrzebne dalsze uproszczenia.Główna funkcja
f
poprzedza i upraszcza każdą postać kolejno za pomocąfoldr
. Następnie sprawdza, czy wynik jest pusty.Aby sprawdzić, czy dwa znaki są przeciwnymi literami i dlatego powinny zostać anulowane, sprawdź, czy ich wartości ASCII różnią się o 32. Każdy element jest przetwarzany
fromEnum
przed przekazaniem do%
.źródło
05AB1E , 17 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Haskell ,
98 97 8581 bajtówJest to po prostu naiwna implementacja, która wielokrotnie próbuje anulować sąsiednie litery, dopóki nie będzie więcej zmian, a następnie ustali z nich wynik.
Dzięki @nimi za -12 bajtów i @xnor za kolejne -4 bajty!
Wypróbuj online! lub Zweryfikuj wszystkie przykłady!
źródło
f=null.until(\a->r a==a)r.map fromEnum
powinien zapisać dwa bajty.(\a->r a==a)
może być((==)=<<r)
.=r l
, abyl
idea bycia wystarczy tylko zrobić jeden zastępstwo za metę.=<<
, wygląda na magiczną XD=<<
Jest podobny>>=
, ale z argumentami zamienione. Wyrażenie to często pojawia się w formie((==)=<<r)
oznaczającej „niezmiennik podr
”.Mathematica, 102 bajty
Nienazwana funkcja przyjmująca ciąg alfabetyczny jako dane wejściowe i zwracająca
True
lubFalse
.Sercem implementacji jest utworzenie funkcji, która usuwa dowolną parę anulującą, taką jak
"Pp"
lub"gG"
z łańcucha. Wyrażenie{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}
tworzy uporządkowaną parę list znaków, z których pierwsza to{"a","b",...,"Z"}
druga, a druga to{"A","B",...,"z"}
. Następnie#<>#2&~MapThread~
tworzy listę, w której odpowiadające elementy tych dwóch list zostały połączone, to znaczy{"aA","bB",...,"Zz"}
. Zabawne wyrażenie""|##&@@
(dzięki magii sekwencji argumentów##
) tworzy listę alternatyw"" | "aA" | "bB" | ... | "Zz"
; wreszcieStringDelete[...]
jest funkcją, która usuwa dowolne wystąpienie dowolnej z tych alternatyw z ciągu.Wystarczy teraz wielokrotnie stosować tę funkcję do ciągu wejściowego, aż wynik się nie zmieni, co jest osiągane przez
~FixedPoint~#
, a następnie sprawdzić, czy wynikiem jest pusty ciąg znaków""==
.źródło
JavaScript (ES6), 73 bajty
W przeciwieństwie do .NET, JavaScript nie ma możliwości wyłączenia rozróżniania wielkości liter w środku dopasowania, więc zamiast tego musimy znaleźć wszystkie podciągi powtarzających się liter bez rozróżniania wielkości liter, a następnie usunąć wszelkie niedopasowane pary sąsiednich znaków, które do tego momentu muszą być para wielka / mała.
źródło
Perl, 28 bajtów
Wyjaśnienie:
Perl pozwala na dołączenie dynamicznie generowanego wyrażenia regularnego do standardowego wyrażenia regularnego.
.
Pasuje wszystko.Jest
(??{
to początek wygenerowanego wyrażenia regularnego.$&
Zmienna będzie zawierać cały dopasowany ciąg tej pory, która w tym przypadku jest po prostu cokolwiek.
dopasowane.^
Operator ma albo xor lub ciąg liczbowy XOR, w zależności od wartości operandów. W tym przypadku będzie to ciąg xor.Jest
' '
to po prostu łańcuch zawierający spację, która dogodnie ma wartość ascii (lub Unicode!) Wynoszącą 32. Kiedy spacja jest zapisana za pomocą znaku z zakresu az lub AZ, zmieni się z wielkich na małe litery lub imadło versa.})
Jest koniec wygenerowanego regex.1 while s/whatever//
wielokrotnie wyszukuje wzór i zastępuje go pustym ciągiem.$_
jest zmienną domyślną. Ta zmienna jest tym, co Perl robi zabawne i ekscytujące rzeczy, gdy nie podajesz innej zmiennej. Tutaj używam go do zwrócenia wartości prawda lub fałsz, ponieważ ciąg o zerowej długości jest fałszywy, a ciąg o niezerowej długości, który nie"0"
jest równy, jest prawdziwy. Zakładam również, że łańcuch wejściowy został pierwotnie w nim umieszczony.Wypróbuj tutaj
źródło
!
przed finałem$_
. Jeśli trzymanie go w ten sposób jest w porządku, możesz zaoszczędzić 4 bajty, zmieniając go nas/.(??{$&^' '})//&&redo
+1 bajt dla-p
flagi. Nie będzie działać w podprogramie tak, jak teraz, ponieważ{ code }
tak naprawdę nie jest to pętla (a więc&&redo
nie będzie działać), ale-p
umieszcza ją wwhile
pętli.' '
go$"
. Spójrz na to, aby zobaczyć, jak wygląda kod.Prolog (SWI) , 151 bajtów
Dużo czasu zajmuje uruchomienie dłuższych fałszywych przypadków z powodu cofania się.
Wypróbuj online!
Nie golfił
źródło
MATL , 20 bajtów
Wypróbuj online! Lub zweryfikuj wszystkie przypadki testowe (zajmuje to chwilę).
Wyjaśnienie
źródło
Mathematica, 65 bajtów
źródło
JavaScript (Node.js) , 47 bajtów
Wypróbuj online!
źródło
Python 3 , 71 bajtów
Wypróbuj online!
źródło