Biorąc pod uwagę listę słów i ich skrótów, wypisz wzór, według którego można tworzyć skróty.
Weźmy przykładowe dane wejściowe
potato ptao
puzzle pzze
jako przykład (to znaczy skrót dla potato
is ptao
, a skrót dla puzzle
is pzze
).
Rozważyć wszystkie możliwe sposoby, aby uzyskać ptao
od potato
. Jednym z możliwych sposobów jest wzięcie pierwszej, trzeciej, czwartej i szóstej litery, które będziemy nazywać
1346
. Ale ponieważ t
i o
pojawiają się kilka razy w słowie, istnieje wiele innych możliwych sposobów generowania ptao
z potato
: 1546
, 1342
, i 1542
.
Podobnie należy pamiętać, że pzze
mogą być generowane puzzle
z dowolnego 1336
,
1346
, 1436
, 1446
. Jedyny wzór, który łączy te dwa skróty, to 1346
; dlatego musi to być wynik dla tego wejścia. Jeśli możliwych jest wiele możliwych wzorców, możesz wypisać dowolny, niektóre lub wszystkie z nich (przynajmniej jeden).
Możesz założyć, że:
Wprowadzane słowa i skróty zawierają tylko małe litery.
Na wejściu znajduje się co najmniej jedna para słowo / skrót.
Możliwe jest utworzenie każdego skrótu z odpowiadającego mu słowa.
Zawsze będzie istniał co najmniej jeden wzór, który tworzy każdy skrót.
Maksymalna długość każdego słowa wynosi 9 znaków.
Dane wejściowe można przyjąć jako jedno z poniższych:
Dwuwymiarowa tablica / lista / tablica krotek / itp.
[[word, abbr], [word, abbr], ...]
płaska 1-wymiarowa tablica / lista
[word, abbr, word, abbr, ...]
pojedynczy ciąg, rozdzielany dowolnym pojedynczym znakiem, który nie jest małą literą
"word abbr word abbr"
skrót / tablica asocjacyjna / itp.
{word => abbr, word => abbr, ...}
W każdej z tych opcji wprowadzania danych możesz również zamieniać kolejność słów / abbr (proszę dokładnie opisać format wprowadzania w swoim poście).
Dane wyjściowe mogą być podawane w postaci pojedynczej liczby, ciągu ograniczonego cyframi lub tablicy / listy / krotki / itp. liczb.
Ponieważ jest to code-golf , wygra najkrótszy kod w bajtach.
Przypadki testowe (pamiętaj, że musisz wygenerować wyniki ≥1, jeśli działa wiele wzorców):
In Out
--------------------------------------------------------
potato ptao puzzle pzze | 1346
aabbcc abc fddeef def | 246
prgrmming prgmg puzzles pzzlz | 14353
aaaaa a bbbb b ccc c dd d e e | 1
aaaaa a bbbb b ccc c | 1, 2, 3
abcxyz zbcyax | 623514
abcxyz acbbacbcbacbbac | 132213232132213
potato ptao | 1346, 1546, 1342, 1542
a aaaaa | 11111
Odpowiedzi:
Pyth, 19 bajtów
Wypróbuj tutaj!
Pobiera listę w następującym formacie:
Alternatywne 17 bajtowe rozwiązanie, które wyświetla wynik jako listę indeksów zerowych, które są zawinięte w 1-elementową listę:
Wyjaśnienie
Przykład:
[["potato", "ptao"],["puzzle", "pzze"]]
Najpierw mapujemy każdy znak w skrócie na listę indeksów wszystkich zdarzeń w słowie, które daje
[[[0], [2, 4], [3], [1, 5]], [[0], [2, 3], [2, 3], [5]]]
Następnie transponujemy tę listę, która nam daje
[[[0], [0]], [[2, 4], [2, 3]], [[3], [2, 3]], [[1, 5], [5]]]
Tak więc indeksy każdego znaku każdego skrótu są razem na jednej liście.
Następnie musimy tylko znaleźć jeden wspólny indeks na wszystkich tych listach, który daje:
[[0], [2], [3], [5]]
To jest wynik mojego alternatywnego 17-bajtowego rozwiązania powyżej. Następnie przekształca się w
[1,3,4,6]
.Podział kodu
źródło
dm
prawa przed@
?MATL , 29 bajtów
Dane wejściowe to tablica 2D w następującym formacie:
Wypróbuj online! ( połączony kod zawiera pewne modyfikacje wynikające ze zmian w języku od czasu opublikowania tej odpowiedzi )
Kod wymagał pewnych zaangażowanych (i długich!) Sztuczek do
find
(f
) w zależności od kształtu wejściowego. Są to instrukcjeX:wX:
: wymuś, aby oba wyjścia były wektorami kolumnowymi.min
(X>
) wzdłuż pierwszego wymiaru nie singletonowego . Są to stwierdzeniatv
: konkatuj kopię samego siebie, aby zapewnić co najmniej dwa wiersze);źródło
Perl,
464542 bajtówObejmuje +1 dla
-p
Podaj dane wejściowe jako sekwencyjne słowa w STDIN, np
Zakończ STDIN za pomocą
^D
lub^Z
cokolwiek jest potrzebne w twoim systemieabbrev.pl
:Wyjaśnienie
Rozważ to wejście (układ koncepcyjny, a nie prawdziwy sposób wprowadzania danych dla tego programu):
Program buduje ciągi znaków reprezentujące pionowe kolumny pełnych ciągów indeksowanych na id kolumny
itp. To samo robi dla skrótów, ale używając innego identyfikatora
Słowa są domyślnie przetwarzane jeden po drugim za pomocą
-p
opcji. Ciągi kolumn są konstruowane przy użyciu powtarzających się konkatenacji, podczas gdy każde słowo jest używanes#.# ...code.. #eg
, więc każda kolumna potrzebuje powtarzalnego identyfikatora. Używam minus numer kolumny, po której następuje numer linii modulo 2. Numer kolumny można skonstruować za pomocą,--$_
która zaczyna się jako bieżące słowo, które ze względu na użycie tylkoa-z
gwarantuje, że będzie oceniane jako 0 w kontekście numerycznym. Więc rozumiem-1, -2, -3, ...
. Naprawdę wolałbym użyć1, 2, 3, ...
, ale użycie$_++
spowoduje wyzwolenie przyrostu magicznego ciągu znaków perla zamiast normalnego licznika numerycznego. I nie chcesz używać$_
a nie jakąkolwiek inną zmienną, ponieważ każdą inną zmienną musiałbym zainicjować do zera w każdej pętli, która zajmuje zbyt wiele bajtów.Numer wiersza modulo 2 ma zapewnić, że identyfikatory dla pełnego słowa i identyfikatory dla skrótu się nie kolidują. Zauważ, że nie mogę użyć pełnego słowa i skrótu na jednym ciągu, aby numer kolumny przechodził przez połączony ciąg, ponieważ pełne słowa nie mają tej samej długości, więc skrócone kolumny słów nie byłyby ustawione w jednej linii. Nie mogę też umieścić słowa skróconego na pierwszym miejscu (wszystkie mają tę samą długość), ponieważ potrzebuję liczby pierwszych kolumn pełnych słów jako 1.
Nadużywam globalnej przestrzeni nazw Perla przez nieswoiste odniesienie do skonstruowania ciągów kolumn jako:
Następnie odwzorowuję każdy ciąg kolumn na pierwszy numer kolumny, w którym ciąg kiedykolwiek się pojawia (mapowanie już wskazane powyżej), ponownie nadużywając globalnej przestrzeni nazw Perla (ale zauważ, że nazwy nie mogą się ze sobą kolidować, więc globale nie będą sobie przeszkadzać):
Muszę zanegować,
$_
ponieważ jak wyjaśniono powyżej, liczę kolumny jako-1, -2, -3, ...
.||=
Make pewien tylko pierwsze pojawienie się danej kolumnie otrzymuje nowy numer kolumny, w przeciwnym razie poprzedni numer kolumny jest zachowana i zwracane jako wartości. Stanie się tak w szczególności dla każdego słowa skróconego, ponieważ specyfikacja gwarantuje, że w pełnych słowach pojawi się kolumna, która pojawi się wcześniej. Tak więc w ostatnim skróconym słowie każda litera zostanie zastąpiona numerem kolumny w pełnym słowie, która odpowiada kolumnie dla wszystkich słów skróconych. Tak więc wynikiem ostatniej zamiany jest pożądany wynik końcowy. Więc drukuj tylko wtedy, gdy jesteśmy na końcu danych wejściowych:Przypisanie indeksu kolumny spowoduje również utworzenie pozycji dla niekompletnych kolumn, ponieważ kolumna nie jest jeszcze całkowicie zbudowana lub niektóre słowa są krótsze i nie osiągają pełnej długości kolumny. Nie stanowi to problemu, ponieważ kolumny potrzebne w każdym skróconym słowie mają zagwarantowaną kolumnę odpowiadającą pełnemu słowu, która ma maksymalną możliwą długość (liczbę aktualnie widocznych par), więc te dodatkowe wpisy nigdy nie powodują fałszywych dopasowań.
źródło
Haskell, 74 bajty
Format wejściowy to lista par ciągów znaków, np .:
Jak to działa:
mapM
(tak samo jaksequence . map
) najpierw przekształca każdą parę(w,a)
w listę list indeksów liter w skrócie (' ':
naprawia natywny indeks Haskell oparty na 0 na 1),("potato", "ptao") -> [[1],[3,5],[4],[2,6]]
a następnie na listę wszystkich ich kombinacji, gdzie element w miejscui
jest pobierany zi
podlisty, np[[1,3,4,2],[1,3,4,6],[1,5,4,2],[1,5,4,6]]
.foldl1 intersect
znajduje przecięcie wszystkich takich list list.źródło
ES6, 92 bajty
Akceptuje wprowadzanie jako tablicę słów i tablicę skrótów. Zwraca tablicę indeksów opartych na 1 (co kosztuje mnie 2 bajty do cholery). W przypadku wielu rozwiązań zwracane są najwyższe wskaźniki.
źródło
Python 3, 210 bajtów
Nie jest to imponująca odpowiedź, która pokazuje tutaj najlepsze wyniki, ale jest to naprawdę jedno z najbardziej szalonych list, jakie kiedykolwiek widziałem w Pythonie. Podejście jest dość proste.
Funkcja oczekuje, że dane wejściowe są zawsze w postaci ciągów tablic 2-D, takich jak:
[[word, abbr],...]
i zwraca listę liczb całkowitych.Ps: Szczegółowe wyjaśnienie już wkrótce
Ps2: Dalsze sugestie dotyczące gry w golfa są mile widziane!
źródło