Dla niezerowych cyfr na standardowej klawiaturze numerycznej
789
456
123
rozważ umieszczenie rycerza szachowego przy dowolnej cyfrze i przesuwanie go dowolną liczbą normalnych skoków w kształcie litery L, wykrywając dodatnią liczbę całkowitą dziesiętną. Jakie dodatnie liczby całkowite można wyrazić w taki sposób?
Jednym z nich jest to 38
, że rycerz może zacząć od 3
i przejść w lewo i do góry 8
. 381
i 383
są również możliwe.
3
samo jest możliwe, jeśli nie wykonano żadnych skoków (co jest dozwolone). 5
jest również, ale nie można uzyskać dostępu do innych cyfr od 5
, więc jest to jedyna liczba, w której 5
pojawia się cyfra .
Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą dziesiętną (w razie potrzeby możesz ją traktować jako ciąg) i wypisuje lub zwraca prawdziwą wartość, jeśli liczba może być wyrażona przez rycerza na klawiaturze numerycznej w opisany sposób, ale w przeciwnym razie zwraca wyniki falsy wartość.
Najkrótszy kod w bajtach wygrywa. Tiebreaker to wcześniejsza odpowiedź
Przykłady
Prawda:
1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 18, 38, 61, 81, 294, 349, 381, 383, 729, 767, 38183, 38383, 18349276, 183492761, 618349276
Falsy:
10, 11, 50, 53, 55, 65, 95, 100, 180, 182, 184, 185, 186, 187, 188, 189, 209, 305, 2009, 5030, 3838384, 4838383, 183492760
78963214
, powtarzaną w kółko. Policz odległości - zawsze są cztery, w jedną stronę lub w drugą. Powinienem był wyrazić jasno i wyraźnie powiedzieć, że musisz pisać w kolejności kręgu.123...9
. PrzepraszamyOdpowiedzi:
Galaretka,
191514 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Python 2, 52 bajty
Sprawdza, czy dowolne dwie kolejne cyfry są w ciągu
'18349276167294381'
. Aby uzyskać kolejne cyfry, zamiast robićzip(`n`,`n`[1:])
, funkcja wielokrotnie sprawdza ostatnie dwie cyfry i usuwa ostatnią cyfrę.źródło
Siatkówka ,
5840 bajtówDziękujemy Sp3000 za zasugerowanie tego pomysłu:
Wypróbuj online! (Nieznacznie zmodyfikowany, aby uruchomić cały zestaw testów na raz.)
Drukuje
1
dla prawdziwych i0
fałszywych wyników.Wyjaśnienie
Znajdź wszystkie pokrywające się dopasowania
..
, tj. Wszystkie kolejne pary cyfr, i połącz je liniami.Sortuj cyfry w każdym wierszu, abyśmy musieli sprawdzić tylko o połowę więcej par.
Usuń wszystkie wiersze odpowiadające prawidłowemu ruchowi.
Policz dopasowania tego wyrażenia regularnego. Oznacza to, że jeśli wszystkie linie zostały usunięte, to jeden raz dopasowuje wynikowy pusty łańcuch, w przeciwnym razie nie pasuje i daje zero.
źródło
Pyth -
3528 bajtówPakiet testowy .
źródło
Rubinowy, 57 bajtów
Funkcja anonimowa. Argument jest ciągiem.
Program z pakietem testowym:
Właśnie zakodowałem wszystkie możliwe ruchy rycerza w łańcuch i sprawdziłem, czy co 2 cyfry w danych wejściowych istniały w tym łańcuchu.
źródło
grep 58 bajtów
Ponieważ naprawdę, jeśli nie możesz pokonać grepa ...
źródło
5
ani185
emitować1
z linii poleceń, podczas gdy5
jest w truthy, a185
na liście falsy.Haskell 46 bajtów
Przykład użycia:
all(`elem`q"16729438183492761").q $ "183492761"
->True
Jak to działa: wykorzystuje ciąg wyszukiwania znaleziony w odpowiedzi @Kevin Lau .
q
tworzy listę par sąsiednich znaków z łańcucha, npq "1672" -> [('1','6'),('6','7'),('7','2')]
. Funkcja zwraca true, jeśli wszystkie pary z danych wejściowych pojawiają się w parach z ciągu wyszukiwania.q
zamienia jednocyfrowe dane wejściowe w pustą listę, więcelem
zawsze się udaje.źródło
zip<*>tail
działa jak odwrócona wersjazip=<<tail
? Myślę, że nie rozumiem, co uogólniają aplikacje.<*>
jest zdefiniowany jako(<*>) f g x = f x (g x)
.JavaScript (ES6),
6562 bajtówZwraca true lub false. Wcześniej próbowałem rozwiązania rekurencyjnego, które zajmuje 63 bajty,
map
a nawetreduce
zajęło mi 73 bajty.Edycja: Zapisano 3 bajty dzięki @ user81655.
źródło
match
działa zamiast~search
(ale tak czy inaczej, to naprawdę niedoceniane) i|
może zastąpić||
(ale nie w wersji rekurencyjnej, niestety).!i|...match
działa, ponieważ wynik dopasowania, jeśli się powiedzie, jest tablicą pojedynczego ciągu dwóch cyfr, który|
operator ostatecznie wymusza na prawidłową liczbę całkowitą.DO,
8581 bajtówGra w golfa:
Stara nierekurencyjna wersja (85 bajtów):
Stary kod z białą spacją i programem głównym:
To akceptuje liczby rozdzielane spacjami przez standardowe wejście i wyjście 0, jeśli nie jest rycerzem-numpadem, lub 1 inaczej.
Nowa 81-bajtowa wersja rekurencyjna goli 4 bajty.
źródło
MATL ,
383729 bajtówWykorzystuje to pomysł @QPaysTaxes .
Dane wyjściowe to złożona, niepusta tablica 2D. Prawdą jest, że wszystkie jej wartości mają niezerową część rzeczywistą, a fałsz w przeciwnym razie.
Wypróbuj online!
źródło
05AB1E , 29 bajtów
Kod:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
MATL,
25243326 bajtówWygolono 1 bajt dzięki @LuisMendo!
@Dennis znalazł błąd, a następnie go naprawił! Dzięki!
Pobiera na wejściu liczbę całkowitą. Wyjścia 1/0.
Wypróbuj online!
źródło
A
na końcu. Wektory MATL-a są prawdą, jeśli nie zawierają 0.C,
14092 bajtówZakładając ASCII
Szczegółowe Wypróbuj tutaj
źródło
{,}[]
ichar*
zamiast tego zakodujesz go jako ciąg. Pamiętaj również, że#define
nie jest to opłacalne, gdy używasz go tylko dwa razy: usunięcie go zaoszczędzi 4 bajty.\0
wewnątrz tablicy spowodował niezdefiniowane zachowanie, więc zastąpiłem gox
<s>oldscore</s> newscore
edycji, aby odzwierciedlić poprawę wyników, a<!-- language-all: lang-c -->
zanim kod zacznie poprawiać podświetlanie składni. Udało mi się również nieco zmniejszyć liczbę bajtów, porzucając całkowicie pętlęn
krótka wersja?). Ponadto prawdopodobnie powinieneś wspomnieć, że zakładasz kodowanie ASCII - otrzymasz różne liczby na maszynach EBCDIC.Julia,
5149 bytesVerification
źródło
Actually, 30 bytes
Takes input as a string. Outputs a positive integer for true and 0 for false.
Try it online!
Explanation:
źródło
PowerShell v2+,
10596 bytesIterates through the input (which must be encapsulated with
""
) by verifying that the index of any sequential pair of characters is in the valid lookup string. I see Kevin Lau had something similar, but I came up with this independently. Each of those indices are added with+1
, as the.IndexOf()
function will return-1
if the string isn't found. This will turn "not found"s into0
.We then
-join
all the resultant integer values with*
and pipe that toiex
(similar toeval
). This will mean if any one of the indices is not found, the entire expression will result in0
. That is encapsulated in parens and-or
'd with$a-eq5
for the special case of input"5"
to achieve our resultant output.Test Runs
źródło
C, 78 bytes
Since everyone else has taken the input as a string, I tried doing it in integers. It works recursively from the least-significant digit (
a%10
); if it's the only digit, then return true. Otherwise, return true only if the tens digit (b%10
) can't be reached from the units digit, and (recursively), the rest of the input satisfies the same test.The test for reachability works by encoding the knight's tour linearly, and converting each digit to its position (zero to seven) on the tour. For digits
0
and5
, we assign position nine, which is disconnected from the other positions. Then, mutually reachable numbers differ by one (mod eight); i.e.a[x%10]-a[b%10]
is either ±1 or ±7. So we test the absolute difference (mod 6) against 1.This solution works for any character encoding that is valid for C (i.e. digits have contiguous codes from 0 to 9).
źródło
Java 8,
179167 BytesPlaces the number pad ints (minus 5 and 0) in a circle.
l
holds the circle index of these ints. If the difference of two indices is +/- 3 mod 8, then there is a knights move between the ints corresponding to those indices. Note thatx
is anint[]
.Update
<2
instead of==1
źródło