Wprowadzenie
Popularną łamigłówką jest konwertowanie jednego słowa na drugie za pomocą serii kroków, które zastępują tylko jedną literę i które zawsze skutkują poprawnym słowem. Na przykład BAG można przekonwertować na DOG za pomocą ścieżki pięciu kroków:
TORBA -> BAT -> KOT -> COT -> COG -> DOG
W tym przypadku istnieją również krótsze ścieżki; na przykład:
TORBA -> BOG -> DOG
Gdyby narysować wykres, którego wierzchołki były oznaczone słowami, z krawędzią między dowolną parą słów, które różnią się jedną literą, wówczas najkrótsza ścieżka od „BAG” do „DOG” składałaby się z dwóch krawędzi.
Wyzwanie
Masz napisać program, który odbiera jako dane wejściowe „słownik” słów o tej samej długości, reprezentujących wszystkie dozwolone słowa, które mogą pojawiać się jako kroki wzdłuż ścieżki. Powinien generować co najmniej jedną „najdłuższą najkrótszą ścieżkę”, to znaczy ścieżkę między dwoma słowami, która jest:
nie dłużej niż jakakolwiek inna ścieżka między tymi dwoma słowami;
przynajmniej tak długo, jak najkrótsza możliwa ścieżka między dowolną inną parą słów na liście.
W kontekście wykresu opisanego powyżej długość takiej ścieżki jest średnicą wykresu.
W zdegenerowanym przypadku, gdy żadne ze słów wejściowych nie może zostać przekształcone w żadne z pozostałych, wypisz co najmniej jedną ścieżkę o długości zero, to znaczy jedno słowo.
Przykłady
Dane wejściowe [„torba”, „nietoperz”, „kot”, „łóżeczko”, „kropka”, „pies”] powinny dać ścieżkę przechodzącą przez wszystkie sześć słów w tej kolejności (lub w odwrotnej kolejności), ponieważ najkrótsza ścieżka od „ torba „do” psa w tym słowniku to najdłuższy możliwy do osiągnięcia, pięć kroków.
Dane wejściowe [„torba”, „nietoperz”, „bot”, „kot”, „łóżeczko”, „kropka”, „pies”] powinny dać ścieżkę „torba, nietoperz, bot, kropka, pies” i / lub jego odwrócenie.
Dane wejściowe [„kod”, „golf”, „mężczyzna”, „buzz”, „kret”, „rola”, „pleśń”, „zimno”, „złoto”, „tryb”] powinny dać ścieżkę między „kodem” i „golf”.
Dane wejściowe [„jeden”, „dwa”, „sześć”, „dziesięć”] odpowiadają wykresowi bez krawędzi, więc wypisz jedną lub więcej ścieżek zawierających jedno słowo (o zerowej długości).
Jeśli dane wejściowe zawierają dowolne dwa słowa o nierównej długości, dane wyjściowe są niezdefiniowane.
Zasady
- Obowiązują standardowe zasady gry w golfa
- Będzie wiele „najkrótszych” ścieżek. Musisz wypisać co najmniej jeden, ale możesz wypisać tyle, ile chcesz.
- Możesz swobodnie decydować, w jaki sposób słownik wejściowy jest przekazywany do twojego programu.
- Najkrótszy kod w bajtach wygrywa.
[]
lub[[]]
)?Odpowiedzi:
Galaretka , 20 bajtów
Wypróbuj online!
źródło
APL (Dyalog Classic) ,
84 80 77 76 74 6661 bajtówWypróbuj online!
dane wejściowe i wyjściowe są matrycami znaków
⍵+.≠⍉⍵
macierz młotowatych odległości między słowami9*⍨2⌊
pozostaw nietknięte 0 i 1, zmień 2+ na dużą liczbę (512 = 2 9 , używane jako „∞”)⌊.+⍨⍣≡
Algorytm najkrótszej ścieżki floyda i warshalla⌊.+
jak mnożenie macierzy, ale za pomocąmin
(⌊
) i+
zamiast+
i×
odpowiednio⍨
użyj tej samej matrycy po lewej i prawej stronie⍣≡
powtarzaj aż do konwergencjid←⌈/512|,
długość najdłuższej (nie „∞”) ścieżki, przypisanej dod
⊃⍸a=
które dwa węzły łączy, nazwijmy je i i j{⍵,⍨⊃⍋(1≠a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/
zrekonstruować ścieżkę{
}⍣d/
oceń czasy{
}
funkcjid
. lewy argument⍺
to zawsze ja . prawy argument⍵
zaczyna się od j i stopniowo akumuluje wewnętrzne węzły ścieżki(1≠a⌷⍨⊃⍵),⍪⍺⌷a
zbuduj 2-kolumnową macierz tych dwóch wektorów:1≠a⌷⍨⊃⍵
booleany (0 lub 1) wskazujące, które węzły znajdują się w odległości 1 od pierwszego z⍵
⍺⌷a
odległości wszystkich węzłów wykresu do⍺
⊃⍋
indeks najmniejszego leksykograficznie wiersza⍵,⍨
przygotuj się na⍵
⍵⌷⍨
indeksuj oryginalne słowa ze ścieżkąźródło
Python 3 , 225 bajtów
Wypróbuj online!
Zasadniczo, weź wszystkie możliwe ścieżki, zachowaj tylko te, które są prawidłowe, a następnie przejdź przez każdą kombinację początkową, znajdź minimalną odległość ścieżki i znajdź jej maksimum.
źródło
Wolfram Language (Mathematica) , 105 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
195194 bajtówPowraca
[optimal_length, [optimal_path]]
.Wypróbuj online!
W jaki sposób?
(ten kod jest wykonywany przy każdej głębokości rekurencji, ale tak naprawdę ważny jest tylko poziom główny)
źródło
Wolfram Language (Mathematica) , 92 bajty
Wypróbuj online!
źródło
Python 3, 228 bajtów.
Implementuje algorytm Floyd-Warshall dla wszystkich par najkrótszych ścieżek, a następnie przejmuje maksimum ponad znalezione ścieżki.
16 znaków w tej implementacji to tabulatory, co jest niefortunne :(
źródło