Biorąc pod uwagę plik słownika (plik tekstowy zawierający słowo lub frazę w każdym wierszu, z możliwą interpunkcją, ale bez liczb; wiersze są alfabetycznie), musisz wyprowadzić każdą kombinację słów, w której jedną literę można usunąć ze słowa, aby utworzyć drugą; usunięta litera powinna być ujęta w nawiasy.
Na przykład dane wejściowe
cat
cart
code
golf
ode
verify
versify
powinien dać wynik
ca(r)t
(c)ode
ver(s)ify
Wiele sposobów uzyskania tej samej pary można wyświetlić tylko raz. Możesz wyprowadzać scra(p)ped
lub scrap(p)ed
, ale nie oba jednocześnie.
Wyjście powinno być uporządkowane alfabetycznie według dłuższego wpisu;
mart
mar
mat
ma
powinien mieć wynik
ma(r)
ma(t)
ma(r)t
mar(t)
a dwa ostatnie mogą być w dowolnej kolejności.
Plik słownika może zawierać wielkie litery, spacje, łączniki lub apostrofy; należy je zignorować. Na przykład,
inlay
in-play
powinien produkować in(p)lay
. Twój wynik powinien być w tym samym przypadku. Dozwolone są dodatkowe białe znaki.
Dane wejściowe mogą być STDIN lub z pliku; jest oddzielony znakami nowej linii. Wyjściem może być wartość zwracana przez funkcję lub STDOUT (lub zapisana do pliku, jeśli chcesz).
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
(To moje pierwsze wyzwanie na PPCG - daj mi znać, jeśli zrobiłem coś złego, a ja to naprawię.)
mart mar mat ma
? Czy by tomar(t) ma(r)t ma(r) ma(t)
byloOdpowiedzi:
Perl -an0, 101 + 3 bajty
gdzie
@F
to słownik przechowywany w tablicy, dostarczany przez magię flagi środowiska wykonawczego. (b-oost, BoO # @% @ # $% $ # @ T)map{s/\W//g;lc}@F
usuwa wszystkie symbole ze słów i zamienia wszystko małymi literami. (boost, boot)sort{length$b<=>length$a}
sortuje według długości. (boot, boost)map{ (...) while/(.)(?!\1)/g}@F
dopasowuje wszystkie znaki, po których nie występuje ten sam znak ([b] oot, bo [o] t, boo [t], ...)print"$`($1)$'\n"
drukuje części poprzedzające, nawiasowane i udane dopasowanie ... (boo (s) t)if $`.$'~~@F
... jeśli łączenie wszystkiego przed i po meczu znajduje się w słowniku. ([podnieść])źródło
JavaScript (ES6), 225
Funkcja z parametrem ciągu, brak danych wejściowych z pliku. Zapytałem OP, czy to może być ważne.
Przetestuj uruchomienie fragmentu w przeglądarce zgodnej z EcmaScript 6 (implementacja funkcji strzałek, ciągu szablonu, operatora rozprzestrzeniania - Firefox, może Safari lub MS Edge, a nie Chrome)
źródło
Ruby, 173
Przetestuj tutaj: http://ideone.com/86avbe
Wersja do odczytu tutaj: http://ideone.com/ynFItB
źródło
['jacklantern','jackslantern','jack-o-lantern']
. Dla nagrania.The output should be ordered by the longer entry;
...and the latter two could be in either order.
Ruby, 211
Postanowiłem zastosować inne podejście do rozwiązania tego problemu, używając wyrażenia regularnego.
źródło
Perl 5, 210
Kod ładuje dane wejściowe do posortowanej tablicy i sprawdza każdą wartość względem wszystkich wartości w tablicy, które są o 1 bajt dłuższe.
Test
źródło
Haskell, 201 bajtów
Nie jestem pewien, jaki format wejściowy jest dozwolony.
f
pobiera listę ciągów znaków. Jeśli dozwolony jest tylko jeden ciąg (z nl oddzielnymi słowami), dodaj.lines
dof
(+6 bajtów).Przykład użycia:
Jak to działa: zmień każde słowo na małe i zachowaj tylko litery. Podziel każde słowo
x
na dwie części w każdej możliwej pozycji i potrój trzy razy,(i,j,k)
gdziei
jest pierwsza część,j
to pierwszy znak drugiej części ik
ogon drugiej części. Zachowaj trójki tam, gdziei++k
pojawia się również na liście słów. Jeśli ta lista nie jest pusta, weź pierwszy element i wywołaj go(l,m,n)
. Zamień wszystkie te nagłówki list do wymaganego formatu wyjściowego, otaczającm
go()
i umieszczając pomiędzyl
in
.źródło