Nie mylić z Hasłem Biskupa Dobroć !
Biorąc pod uwagę ciąg, odpowiedz (prawda / fałsz lub dwie spójne wartości), jeśli stanowi hasło, które jest silne przeciwko biskupom .
Hasło jest silne przeciwko biskupom, jeśli jest to ciąg składający się z naprzemiennych liter (in a-h
) i cyfr (in 1-8
), dzięki czemu każda para znaków może być interpretowana jako kwadrat na szachownicy i jeśli umieścisz biały pionek na każdym kwadracie o nazwie w haśle, biały biskup nie ma możliwości podróżowania, w dowolnej liczbie kolejnych ruchów, z dowolnego kwadratu w pierwszym ( 1
) rzędzie do dowolnego kwadratu w ostatnim ( 8
) rzędzie.
Przykłady
Silne hasła przeciwko biskupom
a1b1c1d1e1f1g1h1
a8b8c8d8e8f8g8h8
a1b2c3d4d5f5f4g3g4h2b5
h4g4f4e4c4b4a4c3e3
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
b4b5d4d5f4f5g3h5
Na przykład
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
odpowiada pozycji ib4b5d4d5f4f5g3h5
odpowiada pozycji
Słabe hasła wobec biskupów
a4c4e4g4g5d6f6e3d2b2
(dobrze uformowany, ale nie silny - dzięki Jo King za ten przykład!)b1c1d1e1f1g1h1a8b8c8d8e8f8g8
(dobrze uformowany, ale nie silny)h4g4f4e4c4b4a4c3
(dobrze uformowany, ale nie silny)d4
(dobrze uformowany, ale nie silny)b4b5d4d5f4f5g2h5
(dobrze uformowany, ale nie silny)correct horse battery staple
(źle sformowany)1a1b1c1d1e1f1g8a8b8c8d8e8f8g
(źle sformowany)a
(źle sformowany)aa
(źle sformowany)
code-golf
string
decision-problem
path-finding
chess
Quuxplusone
źródło
źródło
1
przez8
w pierwszym przypadku testowego? Nie może przejść do każdej kolumny, ponieważa
kolumna jest całkowicie wypełniona pionkami, ale może bez problemu przejść do każdego rzędu, prawda? Mam wrażenie, że czegoś mi brakuje ...: SOdpowiedzi:
Rubin,
115182163 bajtówWypróbuj online!
Zwraca
1
za mocne inil
słabe. (Liczba bajtów +67 dotyczyła uwzględnienia „cofania się”).Kilka użytych sztuczek:
Zamiast zakresu liczbowego
0..99
używamy zakresu ciągów,'00'..'99'
dzięki czemu liczba jest automatycznie uzupełniana do lewej o 2 cyfry i dzielona. Sprawia to, że sprawdzanie poza granicami jest bardzo krótkie - dopasowanie z wyrażeniem regularnym/[09]/
.Wewnątrz funkcji pomocnika, budując listę nowych współrzędnych
[x-11, x-9, x+9, x+11]
, jednocześnie przypisujemyz[x]
do niej9
wartość, która okazuje się być prawdziwą wartością (oznaczenie odwiedzonego kwadratu).W ostatnim wierszu chcemy sprawdzić, czy tablica
z[81,9]
nie zawiera9
. Robimy to, usuwając wszystkie wystąpienia funkcji9
(z[81,9]-[9]
), a następnie prosząc o 9 element wynikowej tablicy ([8]
). Ponieważ wiemy, że tablica pierwotnie zawierała 9 elementów, jeśli jakieś zostały usunięte, otrzymamynil
, natomiast jeśli wszystkie pozostaną, otrzymamy ostatni element tablicy (który zawsze tak jest1
).źródło
Python 2 ,
330318313309370 bajtówWypróbuj online!
Wypróbuj praktyczną wersję online! (oryginał może zająć 4 ^ 32 operacji, aby sprawdzić całkowicie, sugeruję użycie tego - ta sama liczba bajtów)
Niezbyt krótkie rozwiązanie - nie mogłem wymyślić, jak zrobić wersję g funkcji lambda krótszą niż sam g.
-4 bajty dzięki Quuxplusone
+61 bajtów odpowiadających za powrót (dzięki za zwrócenie uwagi na Jo Kinga i wskazówki dotyczące gry w golfa)
źródło
q=r=1
byłoby krótsze niżq=1 r=1
, prawda? Iif r:
krótszy niżif r>0:
.Python 2 ,
490476474Wypróbuj online!
Działa to przez „flood-fill”. Najpierw tworzymy listę,
a
które kwadraty sąsiadują z innymi kwadratami, zgodnie z ruchem wskazówek zegara. Następnie tworzymy zestawx
wykluczeń (na podstawie hasła). Następnie inicjalizujemy zestawr
dostępnych kwadratów, który zaczyna się jako pierwszy rząd (bez jakichkolwiek wykluczeń) i wielokrotnie „zalewa” stamtąd stamtąd, 99 razy, co powinno wystarczyć. Na koniec sprawdzamy, czy którykolwiek z kwadratów w ostatnim rzędzie znalazł się w naszym dostępnym zestawie. Jeśli tak, to mamy słabe hasło! Jeśli nie, mamy silne hasło.Wada, być może dyskwalifikująca (nie znam tutaj zwykłej reguły): jeśli hasło jest źle sformułowane (takie jak „prawidłowe zszywanie baterii konia”), to zamiast powrotu zwracamy wyjątek
False
. Ale zawsze zwracamy,True
jeśli hasło jest silne!Minus 16 bajtów dzięki Jo King. Wstawiamy
a
w jednym miejscu, w którym jest używany, i stale składamy trochę matematyki.źródło
for
, której nie widziałem jak usunąć. Przekonałem się, że zastąpienierange(99)
gorepr(f)
działaniem na mojej lokalnej maszynie, ale nie na interpretera tio.run ... ale potem okazało się, że i[1]*99
tak było krótsze! Dzięki temu zaoszczędzono jeszcze 4 bajty.for
sekundami, których nie mogłem zobaczyć - Och! Najwyraźniej Python traktuje33for
jak dwa tokeny (podczas gdyfor33
byłby to jeden token). Dzisiaj się uczę. Pomniejsz o 2 kolejne bajty.Czysty , 285 bajtów
Wypróbuj online!
$[]
jest$ :: [[Int]] [Char] -> Bool
skomponowany w oparciu o pierwszy argument, dając\ [Char] -> Bool
.Funkcja działa, wykorzystując ciąg dwóch znaków na raz, natychmiast zwracając wartość false, jeśli ciąg ma nieprawidłowy format, gdy tylko zobaczy nieprawidłową część. Gdy łańcuch zostanie przetworzony, umieszcza gońca na każdym pustym polu po jednej stronie planszy i przesuwa go w każdy możliwy sposób 64 razy i sprawdza, czy którakolwiek z pozycji końcowych znajduje się w docelowym rzędzie.
źródło
True
doa1b1c1d1e1f1g1
? Nie, że rozumiem cokolwiek na temat tego, jak to działa. :)Wolfram Language (Mathematica) ,
339316358353345 bajtów-23 bajty dzięki @Doorknob.
+42 bajty odpowiadające za cofanie.
Wypróbuj online!
Przepisałem większość tego, aby uwzględnić powrót do przeszłości, myślę, że może być łatwiejszy sposób zdefiniowania wykresu
g
, Mathematica ma wykres ,GraphData[{"bishop",{8,8}}]
który jest wykresem wszystkich ruchów, które biskup może wykonać na szachownicy ( Bishop Graph ), ale ten wykres zawiera dalsze połączenia niż najbliższy diagonalny sąsiad. Jeśli ktoś zna krótszy sposób, aby to zrobić, daj mi znać. Podziękowania dla budowy wykresu należą do tej odpowiedzi MathematicaSE .Zwraca
True
dla silnych haseł,False
dla słabych / źle sformułowanych haseł. Pamiętaj, że w przypadku większości źle sformułowanych haseł wygeneruje wiele komunikatów o błędach, a następnie wróciFalse
. Jeśli nie jest to zgodne z zasadami następnie mogą być tłumione przez zmianęf[n_]:=...
dof[n_]:=Quiet@...
kosztują 6 bajtów.Nie golfowany:
Awaria:
Pobiera argument ciągu i dzieli go na listę ciągów o długości
m
.Zwraca,
False
jeśli zostaną wygenerowane jakiekolwiek komunikaty o błędach, w ten sposób wychwytujemy źle sformułowane ciągi (tzn. Zakładamy, że są one dobrze sformułowane, co nieuchronnie powoduje błąd wzdłuż linii).Pobiera ciąg pozycji pionu i dzieli go w taki sposób, że
"a2h5b"
staje się{{"a","2"},{"h","5"},{"b"}}
, a następnieLetterNumber
przekształca literę na liczbę (a -> 1
itp.) IFromDigits
konwertuje cyfrę na liczbę całkowitą. Jeśli łańcuch nie jest dobrze uformowany, ten krok spowoduje błąd, który zostanie przechwycony przezCheck
powrótFalse
. Te dwie liczby są następnie konwertowane na liczbę całkowitą odpowiadającą kwadratowi na planszy.Tworzy wykres wszystkich ukośnych krawędzi najbliższego sąsiada z usuniętymi pozycjami pionka.
Są to odpowiednio listy niezajętych początkowych i końcowych wierzchołków
Pętle nad początkowymi i końcowymi wierzchołkami, dla każdej pary
FindPath
będzie lista ścieżek między nimi. Jeśli nie ma między nimi ścieżek, będzie to pusta lista, więcLength@
zwraca0
. Jeśli w ogóle nie ma ścieżek,m
wyniesie zero, a my wrócimyTrue
, w przeciwnym razie wrócimyFalse
.źródło
True
iFalse
może być1>0
i0>1
odpowiednio.p[1]@#&/@
jest równoważne z justp@1/@
.Sequence@@
można zastąpić##&@@
. Zamiast tego{LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@
możesz użyć{LetterNumber@#,FromDigits@#2}&@@@
.p@1/@
, ale widzę ogólny pomysł. Przypuszczamp@1 = StringPartition[#,1]&
, że jest to dla mnie nieco mylące, ponieważp
przyjmuje dwa argumenty na dwa różne sposoby, jedenm_
i drugi jako#...&
, myślę, że jest to tylko kwestia pierwszeństwa. Ma to jednak sensp@m = p[m]
.f
która przyjmuje pojedynczy argument,f@#&
ma takie samo zachowanie, jak właśnief
- tutajf
jestp[1]
. (Potem zmieniłem[]
notację na@
, która zawsze jest identyczna, z wyjątkiem pierwszeństwa.)