Większość smartfonów z Androidem pozwala użytkownikowi użyć wzoru machnięcia, aby otworzyć telefon:
Niektóre wzorce są uzasadnione, a inne niemożliwe. Biorąc pod uwagę wzorzec przesunięcia wejściowego, zwróć prawdę lub fałsz wskazujący, czy dany wzorzec wejściowy jest zgodny z prawem, czy nie.
Wejście
Siatka jest oznaczona wierszami od 1 do 9:
1 2 3
4 5 6
7 8 9
Dane wejściowe to liczba składająca się z węzłów odwiedzanych od pierwszego do ostatniego. Na przykład powyższy wzór machnięcia to 12357.
Dane wejściowe mogą być liczbą dziesiętną, łańcuchem lub listą liczb. Nie będzie zawierać 0, ponieważ nie ma węzła 0.
Poprawka: indeksowanie 0–8 jest dozwolone, ponieważ wiele języków indeksuje od 0. Jeśli używasz 0–8, konieczne będzie wskazanie jako takie na początku odpowiedzi i odpowiednie dostosowanie przypadków testowych.
Zasady
Każdy węzeł zaczyna się jako niezaproszony na początku i można go odwiedzić tylko raz. Każdy wzorzec, który odwiedza węzeł więcej niż jeden raz, jest fałszem.
Prawdziwy wzór musi zawierać co najmniej jedno przesunięcie, a więc co najmniej 2 węzły.
Nie można pominąć nieoczekiwanego węzła bezpośrednio z innym. Na przykład 13 jest fałszem, ponieważ 2 nie jest odwiedzane i jest bezpośrednio w linii.
Możliwe jest jedynie pominięcie odwiedzonego węzła. 42631 jest tego przykładem.
W przeciwnym razie linie mogą się krzyżować. Na przykład 1524 jest prawdą.
Załóżmy, że szerokości węzłów są nieznaczne i ignorują problemy praktyczne (grubość palca itp.). Tak więc 16 jest prawdą, chociaż w rzeczywistości może być nieco trudniejsze do osiągnięcia.
Przypadki testowe
1 -> false
12 -> true
13 -> false
16 -> true
31 -> false
33 -> false
137 -> false
582 -> true
519 -> true
1541 -> false
12357 -> true
15782 -> true
19735 -> false
42631 -> true
157842 -> true
167294385 -> true
297381645 -> false
294381675 -> true
To jest golf golfowy , więc wygrywa najmniejsza liczba bajtów.
źródło
Odpowiedzi:
JavaScript (ES6), 64 bajty
Pobiera dane wejściowe jako tablicę liczb. Wartości Falsy to 0 lub NaN . Prawdziwe wartości są ściśle dodatnimi liczbami całkowitymi.
Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Preambuła
Dwie cyfry są naprzeciw siebie w pionie, w poziomie lub po przekątnej, jeżeli:
LUB oba są parzyste, a ich suma wynosi 10 (rysunek 2)
Poza tym cyfra stojąca między dwiema przeciwnymi cyframi n i p jest równa (n + p) / 2 .
Sformatowany kod źródłowy
Śledzenie poprzednich cyfr
Flagi dla odwiedzanych cyfr są przechowywane pod ujemnymi indeksami w tablicy wejściowej a , aby nie kolidowały z jej oryginalnymi elementami.
Jeśli p jest ustawione na -n :
Jeśli bieżąca cyfra n nie była wcześniej wybrana,
a[-n] ^= -n
ustawi flagę i pozwolievery()
pętli przejść do następnej iteracji. W przeciwnym razie wyczyści flagę i zmusi pętlę do natychmiastowego niepowodzenia.Jeśli p jest ustawione na niezdefiniowany :
a[undefined] ^= undefined
daje w wyniku 0 , co również powoduje uszkodzenie pętli.Wykrywanie przeciwnych cyfr
Poniższe wyrażenie służy do sprawdzenia, czy bieżąca cyfra n i poprzednia cyfra -p są cyframi przeciwnymi, zgodnie z definicją w preambule:
co jest równoważne z:
Uwaga: W JS wynik modulo ma taki sam znak jak dywidenda.
Można to interpretować jako:
Dlatego wyrażenie to zwraca 1 wtedy i tylko wtedy, gdy n i -p są cyframi przeciwnymi lub są tymi samymi cyframi nieparzystymi. Ponieważ cyfra nie może być wybrana dwukrotnie, ten drugi przypadek jest właściwie załatwiony.
Jeśli to wyrażenie zwraca 1 , testujemy [p / 2] (gdzie p jest teraz równe negowanej sumie cyfr), aby dowiedzieć się, czy „cyfra pośrednia” była wcześniej odwiedzana. W przeciwnym razie testujemy [0], który z pewnością jest prawdziwy.
O pierwszej iteracji
Pierwsza iteracja jest szczególnym przypadkiem, ponieważ nie ma poprzedniej cyfry i chcemy, aby odniosła bezwarunkowy sukces.
To osiągnąć poprzez uruchomienie s do 1 , gdyż dla każdej n w [1 .. 9] :
(1 * n) % 5
nie może być negatywne~(1 - n)
nie może być równe 9Oryginalna odpowiedź, 90 bajtów
Usunięto z tego postu, aby nie stał się zbyt gadatliwy. Możesz to zobaczyć tutaj .
źródło
!!a[1]&
wa[1]&&
to, że każdy wartości truthy można zawrócića[1]*
jest jeszcze krótszy.)has a node directly in line
, ale nie zdawałem sobie sprawy, że byłoby to takie proste ...?a[-n]^=1:0
z&&a[-n]^=1
do -1, nie można przetestować (na telefon)x86 32-bitowy kod maszynowy,
6260 bajtówHexdump:
Pobiera długość listy
ecx
i wskaźnik do pierwszego elementu wedx
, i zwraca wynik wal
:Istnieje 8 linii, które zawierają węzeł pośrodku:
Pogrupowałem je według różnicy między większą a mniejszą liczbą.
Następnie przekonwertowałem to na tabelę wyszukiwania 2D zindeksowaną połową różnicy i mniejszą liczbą:
To tworzy „magiczną” bitmapę o 32 bitach. Aby go zindeksować, kod wypycha go na stos. Następnie wyodrębnia jeden bajt za pomocą jednego indeksu i z tego bajtu wyodrębnia jeden bit za pomocą drugiego indeksu. Wszystko to za pomocą jednej instrukcji:
Jeśli mapa bitowa wskazuje, że na środku jest węzeł, łatwo to obliczyć - dodaj połowę różnicy do mniejszej liczby.
Źródło zestawu:
źródło
bt byte ptr [esp + eax], ebx
.cdq
zamiastxor edx, edx
aseax
zero. Możesz również złożyćdec eax
do,bt [esp + eax - 1], ebx
który ma taką samą długość, ale następnie pozwala usunąćinc ebx
później. Powinno to zaoszczędzić dwa bajty.Python 2 ,
14013111410499 bajtów-2 bajty dzięki Jonathan Frech
-5 bajtów dzięki Chas Brown
Wypróbuj online!
Wyjaśnienie:
Wypróbuj online!
Tylko 8 par węzłów ma między nimi węzeł. Formuła zawiera dwa węzły jako jedną liczbę całkowitą
2^a-2^b-1
. Liczbę tę można skrócić powtarzając moduł:(2**n+~2**l)%21%15%9==5
najpierw sprawdza, czy taka para jest obecna, a następniev-{l+n>>1}==v
sprawdza, czy węzeł pomiędzy, który jest podany przez(a+b)/2
, nie był jeszcze odwiedzany iq
wywołuje błąd NameError. Przy użyciu porównania łańcuchowego między tymi parami następne porównanie jest wykonywane tylko wtedy, gdy poprzednie zostało zwróconeTrue
.źródło
Galaretka ,
24 22 1918 bajtów-2, ponieważ nie jesteśmy już zobowiązani do obsługi pustej listy
-1 przełączanie z łączenia,
j@
na konkatenację;
(brakujący element nie musi być spotykany w środku dla zastosowanej metody, będąc na początku trio jest w porządku )-2 przejście od
P¬aSH
celuoSH
(aby spowodować dwie ponieważ spłaszczenie połowa1
jest0.5
, który odsącza się, i tak, posiadające wiele jednakowych wyników nie ma wpływu na sposób stosować albo)-1 Dzięki p Xcoder (0 indeksowane wejście jest dozwolone)
Monadyczny link pobierający listę liczb całkowitych
[0,8]
i zwracający prawdziwą wartość (1
), jeśli jest legalna, i falsey (0
), jeśli nie.Wypróbuj online! lub zobacz zestaw testowy .
W jaki sposób?
Patrzy na każdą sąsiednią parę zindeksowanych węzłów na liście wejściowej. Jeśli dzielenie liczb całkowitych przez trzy z dwóch różni się o 2, są one w górnym i dolnym rzędzie, jeśli moduł przez trzy z dwóch różni się o 2, znajdują się w lewej i prawej kolumnie. Suma takich par podzielona przez dwa to albo środkowy węzeł o indeksie 0 trzy-węzłowej linii, albo wartość niecałkowita - więc te wartości są najpierw wstawiane przed parą indeksowanych 0, a następnie dowolne fałszywe węzły (jak
0.5
lub3.5
) są usuwane, wynikowa lista list jest spłaszczana, a następnie usuwana z duplikatów (w celu uzyskania zachowanych, unikatowych wpisów) i ostatecznie porównywana z danymi wejściowymi - w przypadku legalnego przeciągnięcia wszystko to zakończy się brakiem działania, chociaż będzie nielegalne te dodadzą brakujące węzły środkowe i / lub usuwają zduplikowane węzły (zauważ, że dla listy danych wejściowych o długości 1 nie jest wymagana specjalna obudowa, ponieważ nie ma ona par sąsiednich):Poprzednia metoda
Galaretka ,
3635 bajtówWypróbuj online! lub zobacz zestaw testowy .
W jaki sposób?
Podobnie do powyższego, ale konstruuje wszystkie możliwości linii trzech węzłów i wykonuje wyszukiwanie (zamiast sprawdzania, jak to robi za pomocą divmod do testowania i połowy sumy dla środkowego węzła).
Po pierwsze, budowa listy linii trzech węzłów:
Teraz podejmowanie decyzji:
źródło
Stax , 28 bajtów
Uruchom
Daje 0 dla false, a dodatnie liczby całkowite dla true. Odpowiada to reprezentacji ascii tego samego programu.
Ogólną ideą jest obliczenie kilku niezbędnych warunków dla legalnych wzorców machnięcia i pomnożenie ich wszystkich razem.
źródło
Y
rejestru.v
i dołączyć1
jako wartość fałszowania.2
a powyżej są prawdą.JavaScript, 112 bajtów
Może jakiś język oparty na wyrażeniach regularnych powinien być krótszy. Ale nie wiem.
Pokaż fragment kodu
Dzięki Neilowi zmień,
)(?!
aby|
zapisać 3 bajty.źródło
144
.Retina 0.8.2 , 98 bajtów
Pod wpływem odpowiedzi tsh . Próbowałem „przeformułować” to odwrotnie, dopasowując nieprawidłowe przesunięcia, a następnie Anti-grepping.
Wypróbuj online
źródło
Łuska ,
2520 bajtówPobiera listę liczb całkowitych z indeksowaniem opartym na 0. Zwraca 0 lub 1. Wypróbuj online!
Wyjaśnienie
Ukradłem kilka pomysłów z odpowiedzi Jonathana Allana na galaretkę . Pomysł jest taki sam: wstaw nowy „średni węzeł” między każdą sąsiednią parą, odfiltruj te, które nie są rzeczywistymi węzłami, usuń duplikaty i porównaj z oryginalną listą. Jeśli oryginalna lista zawiera duplikaty, wynikiem jest fałsz. Jeśli lista pomija nieoczekiwany węzeł, to jest obecna na przetworzonej liście między odpowiednią parą, a wynikiem jest fałsz. Jeśli dane wejściowe są singletonem, przetworzona lista jest pusta, a wynikiem jest fałsz. W przeciwnym razie jest to prawda.
źródło
C ++,
267256 bajtówAby sprawdzić, czy wzorzec nie przeskakuje nie odwiedzonego węzła, wykonuje kilka czynności:
d
gdzied
jest numeryczna różnica między bieżącym węzłem a ostatnim węzłem.d
jest nieparzysty, nie trzeba go sprawdzać, nie można pominąć węzła.d
jest równe4
lub8
, wówczas skok odbywa się między węzłami1-9
lub3-7
, więc sprawdź węzeł5
d
ma wartość 2, a środkowy węzeł ((last_node + current_node)/2
) ma wartość 2,5 lub 8, sprawdź węzeł środkowyd
jest 6, sprawdź to samo co poprzednio, ale z4
,5
lub6
Parametry są
int[]
równe liczbie elementów. Zwraca wartość,int
która może być interpretowana jakobool
typźródło
!(d%2)
=>d%2<1
powinno działać.int s[]
=>int*s
. Myślę, że to zadziała.Perl, 135 bajtów (134 +
-n
)Wersja lekko nie golfowa
Dane wyjściowe za pośrednictwem kodu wyjścia.
0
jest prawdą, każda inna wartość to fałsz. Zgodnie z meta-konsensusem wyjście STDERR w przypadku awarii jest ignorowane.Prawdopodobnie istnieje szybszy sposób na sprawdzenie zasady „nie można przeskoczyć” niż tylko wypisanie wszystkich możliwości.
źródło
MATL ,
424139 bajtówTo produkuje
Tutaj możesz przeczytać, dlaczego te dane wyjściowe są odpowiednio prawdziwe i fałszywe.Wypróbuj online!
Lub zweryfikuj wszystkie przypadki testowe za pomocą stopki zawierającej standardowy test na prawdziwość / fałsz.
źródło
Stax ,
73726665 bajtów CP43779 bajtów po rozpakowaniu,
Uruchom i debuguj online!
lub uruchom test partii , gdzie
meX
jest nagłówek, aby Stax mógł przetwarzać dane wielowierszowe.Wdrożenie bez użycia skrótu. Wypisuje liczbę ściśle dodatnią (w rzeczywistości liczbę nieudanych testów) dla przypadków fałszowania i
0
dla prawdy .Wyjaśnienie
d
czyści stos wejściowy. Wx
każdym razie dane wejściowe są zmienne .4{cAs-5F
generuje pierwszą część listy środkowego węzła.132396978714EE
na stałe wpisuje drugą część listy środkowego węzła.L3/
Zbiera wszystkie elementy w głównym stosie i dzieli na części, z których każda zawiera 3 elementy, w wyniku czego powstaje tablicaa
, która jest tylko tablicą wszystkich nieprawidłowych grup 3-węzłowych.{xs:IBc0<A*++cEd:-1=sccHs|M=s{U>m|A**mE
Dla każdej listy nieprawidłowych węzłów wykonaj następujące kontrole. Wyniki kontroli sąand
edytowane przy użyciu**
. Ponieważ istnieje 8 niepoprawnych list węzłów, wynikiem tego kodu będzie tablica 8 elementów. FinalE
wysyła tablicę do poszczególnych elementów na głównym stosie.xs:I
pobierz indeks elementów listy węzłów w tablicy wejściowej.Bc0<A*++
Jeśli indeks „środkowego węzła” (np.5
W zestawie węzłów1,5,9
) wynosi-1
(co oznacza, że nie istnieje on w tablicy wejściowej), zmień indeks na9
.cEd:-1=
sprawdzić, czy dwa „węzły końcowe” (np.1,5
w zestawie węzłów1,5,9
) sąsiadują ze sobą w tablicy wejściowej.sccHs|M=
przetestować, czy transformowany indeks „węzła środkowego” jest większy niż indeks dwóch „węzłów końcowych”, co obejmuje dwa przypadki: brakuje „węzła środkowego” lub „węzeł środkowy” występuje po dwóch „węzłach końcowych”s{U>m|A
sprawdza, czy oba indeksy „węzłów końcowych” są nieujemne. (tzn. oba pojawiają się na wejściu).Przeprowadzane są dwa dodatkowe testy,
x%2<
sprawdza, czy tablica wejściowa jest singletonem.xu%x%=!
sprawdza, czy są to węzły, które były odwiedzane dwukrotnie.Na głównym stosie znajduje się 10 wyników testu (po jednym dla każdej listy nieprawidłowych węzłów oraz dwa dodatkowe testy).
L|+
zbiera 10 elementów i dodaje je.|a
można również użyć, który po prostu sprawdza, czy w tablicy są jakieś prawdziwe elementy.Wyjściowy wynik.
źródło
Java,
375355 bajtów-20 bajtów dzięki Zacharýowi
To jest część tej odpowiedzi i działa na tych samych zasadach
źródło
int v(int s[]){int[]m=new int[10];int i=1,p=s[0],d,n,l=s.length;if(l<2)return 0;for(;i<l;++i){m[p]=1;if(m[s[i]]!=0)return 0;d=(d=p-s[i])<0?-d:d;if(d%2==0){n=(p+s[i])/2;if((d==4||d==8)&&n==5&&m[5]==0)return 0;if((d==2)&&(n==2&&m[2]==0||n==5&&m[5]==0||n==8&&m[8]==0))return 0;if(d==6&&(n==4&&m[4]==0||n==5&&m[5]==0||n==6&&m[6]==0))return 0;}p=s[i];}return 1;}
powinien działać (kolejność operacji)(d==2)
na właśnied==2
, wcześniej to przeoczyłem.d%2==0
=>d%2<1
Pyth , 33 bajty
Zestaw testowy.
Wykorzystuje indeksowanie 0.
Wyjaśnienie
Alternatywne podejście do 34 bajtów :
źródło
Japt , 35 bajtów
Wypróbuj online!
Nieco golfa i jak to działa
Przeniesiono pomysł z tego rozwiązania Jelly , z pewną różnicą w określaniu potencjalnych skoków:
/3
lub%3
.%3
i sprawdza, czy różnica wynosi 0 lub 2. Jeśli różnica wynosi 0, dwie komórki są wyrównane w pionie, a elementy bez skoku nadal mają tę samą właściwość(X+Y)%2 != 0
.źródło
Python 2 , 97 bajtów
Na podstawie odpowiedzi ovs, ale 2 bajty krótsze i mniej tajemnicze. Po prostu konwertuje indeksy na współrzędne 2d i testuje parzystość. Przyjmuje indeksy 0–8.
Wypróbuj online!
źródło