Najkrótszy indeks podciągów

9

Jestem leniwą, ale wydajną osobą, podobnie jak wielu z was. Kiedy więc coś robię, chcę to robić przy minimalnym wysiłku. Dlatego proszę o rozwiązanie dla mnie tego problemu.

Mam tutaj jakiś dokument. W każdym wierszu tego dokumentu znajduje się jedno słowo lub krótka fraza. Dokument nie jest posortowany, ale nic mi nie wiadomo Wiem, gdzie wszystko jest. Przydałaby mi się pomoc w szybszym znalezieniu rzeczy, a do tego potrzebuję drugiej listy. Właśnie tam wchodzisz. Do każdego wiersza tekstu w tym dokumencie potrzebuję jakiegoś identyfikatora. Coś, co mogę CTRL+ F, ale nie może to być dłużej niż absolutnie konieczne do uzyskania tego jednego wyniku.

Przykładowe dane wejściowe:

(blank)
an apple
spiderman 3
7pm pick up laundry
tequila
fake mustache
dishes on wednesday
banana
biscuits
(blank)

Przykładowe dane wyjściowe:

ap,3,7,q,f,w,ba,bi

Powtórzę się tutaj, aby upewnić się, że jesteśmy na tej samej stronie:

  • Dane wejściowe to niesformatowany plik tekstowy zawierający listę elementów oddzielonych podziałami wierszy. Mam go tutaj w formacie .txt, nazywa się „STUFF.TXT”
  • Pierwszy i ostatni wiersz dokumentu są puste. Każda inna linia zawiera wpis o długości> 0.
  • Plik zawiera tylko znaki alfanumeryczne (wszystkie małe litery), spacje i podziały wierszy.
  • Pożądane dane wyjściowe to lista identyfikatorów, w tej samej kolejności, co moja pierwotna lista.
  • Nie chcę więcej niż jednego słowa wyszukiwania dla każdego elementu listy. Jeśli jest wiele odpowiedzi, wybierz jedną, nie obchodzi mnie która. W powyższym przykładzie wybrałem „ap” an apple, ale mogłeś wybrać „n”, „a”, „pp”, „pl” lub „le”. Nie „an”, bo to jest banana.
  • Zapewniam cię, że plik nigdy nie jest pusty i nigdy nie zawiera duplikatów.
  • W razie potrzeby można dopasować na terminatorze linii. Ale jest to ostatnia deska ratunku, z której można skorzystać tylko wtedy, gdy nie ma innego sposobu na rozróżnienie elementów listy (np. „Jabłko” i „jabłka”).

Standardowe luki są niedozwolone. Jest to także kod golfowy, więc wygrywa najkrótszy kod.

Jeszcze jeden przykład:

(blank)
ban
any
king
bean
yen
rake
raki
bar
(blank)

I jego wydajność:

ban,ny,g,be,ye,ke,aki,ar
freekvd
źródło
1
@CarpetPython musi być jak najkrótszy. Można wprowadzać i wyprowadzać spacje, dodając to do pytania.
freekvd
Czy możemy również używać znaku nowej linii na początku wyszukiwanego terminu, jeśli jeden ciąg jest sufiksem innego?
Martin Ender
@ MartinBüttner tak. Dlatego dokument zaczyna się i kończy pustą linią, dzięki czemu masz nowe wiersze na początku i na końcu każdego elementu listy.
freekvd
4
Jestem prawie pewien, że ten problem jest NP-zupełny. Myślę, że mogę skonstruować redukcję problemu dokładnej ochrony do tego.
FUZxxl
4
Tym bardziej, że nie zobaczysz żadnych kreatywnych rozwiązań, ponieważ nie ma lepszego rozwiązania niż brutalna siła.
FUZxxl

Odpowiedzi:

3

Pyth, 39 bajtów

Lsm.:bdtUbKfT.zj\,mhf!}Yjb-Kk+yky++bkbK

Bruteforuje wszystkie podzbiory każdego łańcucha w coraz większej długości i sprawdza, czy ten łańcuch występuje w jakimkolwiek innym. Jeśli to nie zadziała, zrobi to samo, z wyjątkiem wszystkich podzbiorów \nstring\n.

orlp
źródło
Podczas testowania pojawia się błąd kombinacji złego typu. pyth.herokuapp.com/…
freekvd
@freekvd Heroku musi mieć nieaktualną wersję Pyth, ponieważ wywoływanie .:ciągów pierwszego typu i drugiego typu int nie jest błędem. Spróbuj użyć Pytha z repozytorium: github.com/isaacg1/pyth
orlp