Wprowadzenie
Po dniu spędzonym na piciu i oglądaniu mistrzostw świata możesz usiąść i zagrać w przyjazną grę boggle. Temperament rośnie, gdy jesteś oskarżany o marnowanie czasu na bzdury słowami, których nawet nie ma na tablicy! Być może widzisz podwójnie, ale na pewno myślisz wystarczająco prosto, aby napisać program, który sprawdzi, czy twoje słowa są na tablicy.
Twoje zadanie
Napisz program, skrypt lub funkcję, która pobiera tablicę manipulacyjną i słowo jako dane wejściowe i zwraca True, jeśli słowo znajduje się na tablicy, i False, jeśli słowo nie jest.
Dane wejściowe będą miały postać sześciu \n
oddzielonych linii. Pierwsze pięć wierszy będzie zawierać tablicę boggle 5x5 i każda będzie zawierać pięć wielkich liter. Szósty wiersz będzie zawierał słowo, o którym mowa, również wielkimi literami.
Przykładowe dane wejściowe:
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER
Wynikiem może być wszystko, co jednoznacznie oznacza Prawdę lub Fałsz w wybranym języku programowania i jest zgodne ze standardowymi konwencjami zero, zero i puste, oznaczające fałsz.
Przykładowe dane wyjściowe dla powyższego wejścia:
1
Wytyczne I / O
- Dane wejściowe można odczytać ze standardowego wejścia, a odpowiedź na standardowe wyjście.
Lub
- Dane wejściowe mogą być argumentem pojedynczego ciągu funkcji, a odpowiedzią może być wartość zwracana przez tę funkcję.
Zasady Boggle
- Słowo jest „na planszy”, jeśli możesz je zbudować ścieżką kolejnych, sąsiadujących ze sobą, powtarzających się kafelków na planszy.
- Płytkę uważa się za sąsiadującą z ośmioma otaczającymi ją płytkami (dozwolone są ścieżki diagonalne). Płytki na krawędzi planszy sąsiadują tylko z pięcioma płytkami. Płytki w rogu sąsiadują tylko z trzema.
- Kolejne litery w słowie muszą przylegać,
i
litera w słowie musi przylegać doi-1
th ii+1
th. - Litera może pojawić się w słowie więcej niż jeden raz, ale nie możesz użyć tego samego kwadratu na tablicy rozdzielczej więcej niż raz na słowo.
- Internetowa witryna boggle wordsplay.net może być przydatna, jeśli nigdy wcześniej nie grałeś w boggle, ale chcesz poznać te zasady.
W przeciwieństwie do zwykłego bagna:
- NIE musisz się martwić, że słowo jest poprawnym słowem angielskim.
- Nie będzie ŻADNEJ
Qu
pojedynczej płytki. - To pytanie może mieć dowolną długość> 0
Przykład
Na pokładzie
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
Te słowa powinny zwrócić wartość Prawda: Los, randki, postacie, windy.
Te słowa powinny zwracać wartość False: SADDEN, SULTANS, EXIST, SUEDE, QUEST
To wyzwanie dla golfa, więc wygrywa najkrótszy kod!
Odpowiedzi:
GolfScript, 74 znaki
Dane wejściowe należy podać na STDIN. Drukuje liczbę prawidłowych ścieżek na tablicy, tj.
0
Dla żadnej i liczby dodatniej (prawda) w innym przypadku.Możesz przetestować przykład online .
Kod z kilkoma komentarzami:
źródło
JavaScript (E6) 137
160 175 190Mniej niż 2 * skrypt golfowy. Moralne zwycięstwo ...
Edytuj reorganizację kodu Golfed. Znowu i znowu
Ungolfed Ostatnia wersja, nieco trudna do naśladowania
Ungolfed Pierwsza wersja powinna być jaśniejsza
Stosowanie
Test
Wydajność:
źródło
F=a=>(b=a.split('\n'),w=b.pop(Q=(p,n)=>((R|=!w[n])||(b[p]=0)||[1,5,6,7,-1,-5,-6,-7].map(q=>b[q+=p]==w[n]&&Q(q,n+1,b[q]=w[n])))),[Q(~~p,1)for(p in b=[...b.join(R=0)])if(b[p]==w[0])],R)
w = a.pop()
golfa) czyw = b.pop()
(nie golfa, linia 2)? (chyba ten drugi, jak sądzę)a=a.pop()
zamiastb=a.pop()
...Python,
207 204203Zastąpienie
... (b[i]==w[0])*any ...
przez... b[i]==w[0]and any ...
daje znacznie lepszą wydajność kosztem 2 znaków.źródło
0<=i<25and
J - 75 znaków
Eugh, ten wygląda paskudnie. I nawet nie wiąże się z Golfscript! Jest to funkcja przyjmująca ciąg jako jedyny argument. Możesz użyć dowolnego jednoznakowego separatora, o ile znajduje się on na końcu każdej linii, w tym ostatniej.
Wyjaśnienie następuje. Zauważ, że funkcję można rozdzielić na 5 odrębnych części najwyższego poziomu, z których każda jest oddzielona
@
, więc każdą z tych części będziemy traktować osobno, od prawej do lewej.(<;._2)
- To dzieli linie na znaki nowego wiersza / separatora. Używa znaku na końcu łańcucha jako znaku, na którym ma się rozdzielić. Umieszczamy wszystko w boxach (<
), ponieważ jeśli nie dostaniemy problemów z dopełnianiem, gdy J zwróci nam wynik.(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)
- Dla każdej litery w słowie do sprawdzenia utwórz listę wskaźników na tablicy Boggle, w której można znaleźć tę literę.{:
jest ostatnim podzielonym elementem (słowem do sprawdzenia) i}:
jest wszystkim oprócz ostatniego (plansza Boggle).&:>
otwiera skrzynki, które wcześniej stworzyliśmy, z użytecznym produktem ubocznym przekształcania}:
się w szereg znaków 2D.=/
następnie tworzy kopię tej planszy Boggle dla każdej litery w słowie i zamienia pozycje w logiczne w zależności od tego, czy litera na planszy pasuje do tej litery w słowie.((<@#:i.)5 5)
to krótki sposób wyrażenia tablicy wskaźników 5x5.x#:y
jest konwertowanyy
na tablicęx
reprezentacji podstawowej . (Cóż, prawie. Prawda jest bardziej złożona, ale działa to na nasze cele.)<@#~&,"2
- Dla wynikowej macierzy boolowskiej każdej litery zbierz razem wszystkie odpowiednio prawdziwe wskaźniki."2
sprawia, że wszystko działa na właściwe wyniki,#~&,
dokonuje wyboru i<@
gromadzi każdy wynik w polu, aby przygotować się do następnego kroku.{
- Ten czasownik, używany monadycznie, nazywa się Katalog i przyjmuje jako argument listę pól. Łączy wnętrze każdego pudełka na wszystkie możliwe sposoby. Tak więc np. Katalog niektórych pól zawierający ciągi „AB” i „abc” dałby wyniki „Aa”, „Ab”, „Ac”, „Ba”, „Bb”, „Bc”.Uruchomienie tego na naszej pudełkowej liście list indeksów tworzy każdą możliwą kombinację indeksów. Może to być duży zestaw, jeśli słowo jest długie i jest wiele powtarzających się liter, ale także puste, jeśli żadnej litery nie ma na planszy. Zauważamy również, że ponownie wykorzystujemy kafelki w niektórych z tych ścieżek: wyjaśnimy to później.
([:*/"1^:2(2(=*)@-/\>@~.)S:1)
- Tutaj sprawdzamy każdą ścieżkę, aby sprawdzić, czy jest poprawna.(...)S:1
stosuje(...)
każdą ścieżkę i zbiera wyniki do płaskiej listy. Jest to kluczowe, ponieważ wynikiem{
jest tablica wielowymiarowa, a my nie dbamy o strukturę tej tablicy, tylko jej zawartość w każdym pudełku.2(=*)@-/\>
daje 1, jeśli każda współrzędna każdego indeksu znajduje się co najwyżej jeden od następnego, a 0 w przeciwnym razie.2
I/\
są odpowiedzialne za robienie tego parami.*/"1^:2
logiczne-I to wszystko na końcu. Ta[:
część jest strukturalną rzeczą w J, nie martw się o to.Dodanie
@~.
do>
jest w rzeczywistości sprytnym sposobem na wykluczenie ścieżek z powtarzającymi się wpisami.~.
pobiera unikalne elementy listy, więc lista jest skracana, jeśli się przecina, a krótsze listy są automatycznie uzupełniane zerami po ich złożeniu, podobnie jak sposób łączenia wyników, gdy wychodząS:
. Jest to ostatecznie krótsze niż jednoznaczne wykluczenie przecinających się ścieżek.+/
- Na koniec po prostu dodajemy wszystko razem na końcu. Wynikiem jest liczba prawidłowych ścieżek tworzących słowo na tablicy, przy czym 0 oznacza brak ścieżek, tzn. Tego słowa nie ma na tablicy. Za koszt jednego znaku możemy+./
zamiast tego napisać (logiczne ORowanie wszystkiego razem), co wyraźnie da wartość logiczną 1 lub 0.Oto kilka przykładowych przebiegów. Można dostać tłumacza J w jsoftware.com lub spróbować go online na tryj.tk .
źródło
Prolog - 315
Myślałem, że Prolog może być dobrym językiem dla tego, z wbudowaną obsługą cofania, ale myślę, że jest to bardziej upośledzone, ponieważ potrzebuje zmiennej dla prawie każdej obliczonej wartości.
Testowane z GNU Prolog; powinien być zgodny z ISO Prolog.
Nie golfowany:
źródło