Biorąc pod uwagę listę ciągów, znajdź najmniejszą kwadratową macierz, która zawiera każdy z początkowych ciągów. Ciągi znaków mogą pojawiać się poziomo, pionowo lub ukośnie i do przodu lub do tyłu, jak w tym pytaniu Puzzle wyszukiwania słowa .
Słowa powinny być umieszczone w kwadracie, z co najmniej jednym słowem w każdym kierunku (poziomym, pionowym i ukośnym). Słowa powinny pojawić się tylko raz.
Tak więc dane wejściowe to tylko lista słów. Na przykład: CAT, TRAIN, CUBE, BICYCLE
. Jednym z możliwych rozwiązań jest:
B N * * * * *
* I * * C A T
* A C * * * *
* R * Y * * C
* T * * C * U
* * * * * L B
* * * * * * E
Dla jasności zastąpiłem wypełnianie liter gwiazdkami. Pożądane wyjście powinno zawierać losowe litery wypełniające.
AC
w twoim przykładzie byłaby inna,CAT
jeśli jestT
.A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
nie ma rozwiązania.Odpowiedzi:
JavaScript (ES6), 595
628 680Edycja Niektóre porządki i scalanie:
- funkcja P scalona wewnątrz funkcji R
- oblicz x iz w tej samej .map
- po znalezieniu rozwiązania, ustaw x na 0, aby wyjść z zewnętrznej pętli
- scalona definicja i wywołanie W
Edytuj2 więcej gry w golfa, losowe wypełnienie skrócone, zmieniona zewnętrzna pętla ... zobacz historię, aby uzyskać coś bardziej czytelnego
W przeciwieństwie do zaakceptowanej odpowiedzi,powinno to działać w przypadku większości danych wejściowych. Po prostu unikaj pojedynczych liter. Jeśli wynik zostanie znaleziony, jest optymalny i wykorzystuje wszystkie 3 kierunki.Ograniczenie unikania powtarzania słów jest bardzo trudne. Musiałem szukać powtarzającego się słowa na każdym etapie dodawania słowa do siatki i każdego losowego znaku wypełnienia.
Główne podfunkcje:
P (w) prawda, jeśli słowo palindrom. Słowo palindrom zostanie odnalezione dwukrotnie podczas sprawdzania powtarzających się słów.
R (s) sprawdź powtarzające się słowa na siatce
Pytania wypełniają pola losowymi znakami - w przypadku powtarzającego się słowa rekurencyjne i cofają się - i mogą zawieść.
W () rekurencyjne, jeśli to możliwe, spróbuj wypełnić siatkę o danym rozmiarze.
Główną funkcją jest użycie W () do znalezienia siatki wyjściowej, od rozmiaru najdłuższego słowa na wejściu do sumy długości wszystkich słów.
Niegolfowane i wyjaśnione (niekompletne, przepraszam chłopaki to dużo pracy)
Test w konsoli Firefox / FireBug
F ([„TRAIN”, „CUBE”, „BOX”, „BICYCLE”])
nie wypełnione
F ([„TRAIN”, „ARTS”, „RAT”, „CUBE”, „BOX”, „BICYCLE”, „STORM”, „BRAIN”, „DEPTH”, „MOUTH”, „SLAB”])
F ([„AA”, „AB”, „AC”, „AD”, „AE”, „AF”, „AG”])
F ([„AA”, „AB”, „AC”, „AD”, „AE”, „AF”])
wynik nie jest wypełniony - @nathan: teraz nie można dodać kolejnego A x bez powtórzeń. Potrzebujesz większej siatki.
źródło
DO#
Oto prosta implementacja z jeszcze do zrobienia. Istnieje bardzo wiele kombinacji, aby uzyskać najmniejszy rozmiar. Tak po prostu można zastosować najprostszy algorytm.
Test
źródło
at least one word in each direction (horizontal, vertical and diagonal)
. Uruchamianie programu testowego, bez słowa poziomego (3 pionowe, 1 diag)