Учитывая ввод списка слов и их сокращений, выведите шаблон, по которому могут быть сформированы сокращения.
Давайте возьмем пример ввода
potato ptao
puzzle pzze
в качестве примера (то есть сокращение для potato
is ptao
, а сокращение для puzzle
is pzze
).
Рассмотрим все возможные способы получения ptao
от potato
. Один из возможных способов - взять первую, третью, четвертую и шестую буквы, которые мы будем называть
1346
. Но так как t
и o
появляться несколько раз в слове, есть несколько других возможных способов получения ptao
из potato
: 1546
, 1342
и 1542
.
Кроме того , заметим , что pzze
могут быть получены из puzzle
с любым из 1336
,
1346
, 1436
, 1446
. Единственный образец, который объединяет эти две аббревиатуры 1346
: следовательно, это должен быть выход для этого ввода. Если возможно несколько возможных шаблонов, вы можете вывести любой, некоторые или все из них (хотя бы один).
Вы можете предположить, что:
Входные слова и сокращения содержат только строчные буквы.
На входе есть хотя бы одна пара слово / аббревиатура.
Каждое сокращение может быть сформировано из соответствующего слова.
Всегда будет хотя бы один шаблон, который образует каждую аббревиатуру.
Максимальная длина каждого слова составляет 9 символов.
В качестве входных данных можно использовать любое из следующего:
2-мерный массив / список / массив кортежей / и т. Д.
[[word, abbr], [word, abbr], ...]
плоский одномерный массив / список
[word, abbr, word, abbr, ...]
одна строка, разделенная любым отдельным символом, который не является строчной буквой
"word abbr word abbr"
хэш / ассоциативный массив / и т.д.
{word => abbr, word => abbr, ...}
В любом из этих вариантов ввода вам также разрешено менять порядок слова / abbr (пожалуйста, полностью опишите формат ввода в вашем посте).
Вывод может быть задан как одно число, строка, разделенная нецифрами, или массив / list / tuple / etc. чисел.
Поскольку это код-гольф , победит самый короткий код в байтах.
Контрольные примеры (помните, что вам нужно выводить результаты ≥1 только в случае работы нескольких шаблонов):
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
Ответы:
Pyth, 19 байт
Попробуй это здесь!
Принимает список в следующем формате:
Альтернативное 17-байтовое решение, которое выводит результат в виде списка нулевых индексов, которые заключены в 1-элементный список:
объяснение
Пример:
[["potato", "ptao"],["puzzle", "pzze"]]
Сначала мы сопоставляем каждый символ в сокращении со списком индексов всех вхождений в слове, которое дает
[[[0], [2, 4], [3], [1, 5]], [[0], [2, 3], [2, 3], [5]]]
Затем мы переносим этот список, который дает нам
[[[0], [0]], [[2, 4], [2, 3]], [[3], [2, 3]], [[1, 5], [5]]]
Таким образом, индексы каждого символа каждой аббревиатуры объединены в один список.
Тогда нам просто нужно найти один общий индекс во всех этих списках, который дает:
[[0], [2], [3], [5]]
Это вывод моего альтернативного 17-байтового решения выше. Это затем превращается в
[1,3,4,6]
.Разбивка кода
источник
dm
право перед@
?MATL , 29 байт
Ввод представляет собой двумерный массив в следующем формате:
Попробуйте онлайн! ( связанный код включает некоторые модификации из-за изменений в языке с момента публикации этого ответа )
Код потребовал некоторых (и длительных!) Трюков, чтобы
find
(f
), в зависимости от формы ввода. Это операторыX:wX:
: заставить оба выхода быть векторами столбцов.min
(X>
). Это заявленияtv
: конкататируйте свою копию, чтобы обеспечить как минимум две строки);источник
Perl,
464542 байтаВключает +1 для
-p
Введите вводные слова в STDIN, например
Завершите STDIN с помощью
^D
или^Z
или что-то, что необходимо в вашей системеabbrev.pl
:объяснение
Рассмотрим этот ввод (концептуальное расположение, а не реальный способ ввода для этой программы):
Строки сборки программы, представляющие вертикальные столбцы полных строк, проиндексированных по идентификатору столбца.
и т.д. Он также делает то же самое для сокращений, но с использованием другого идентификатора
Слова неявно обрабатываются одно за другим с помощью
-p
опции. Строки столбцов строятся с использованием повторяющихся конкатенаций, в то время как каждое слово проходит, используяs#.# ...code.. #eg
, поэтому каждый столбец нуждается в повторяемом идентификаторе. Я использую минус номер столбца, за которым следует номер строки по модулю 2. Номер столбца может быть--$_
создан с использованием которого начинается как текущее слово, которое благодаря использованию толькоa-z
гарантированно оценивается как 0 в числовом контексте. Итак, я понял-1, -2, -3, ...
. Мне бы очень хотелось использовать1, 2, 3, ...
, но использование$_++
вызовет приращение магической строки perl вместо обычного числового счетчика. Я делаю, хочу , чтобы использовать$_
а не какую-то другую переменную, потому что любую другую переменную, которую я должен был бы инициализировать нулем в каждом цикле, который занимает слишком много байтов.Номер строки по модулю 2 должен гарантировать, что идентификаторы для полного слова и идентификаторы для сокращения не конфликтуют. Обратите внимание, что я не могу использовать полное слово и аббревиатуру в одной строке, чтобы номер столбца проходил через объединенную строку, потому что не все слова имеют одинаковую длину, поэтому столбцы сокращенных слов не будут выстраиваться. Я также не могу поставить сокращенное слово первым (все они имеют одинаковую длину), потому что мне нужно, чтобы в первом столбце полных слов было 1.
Я злоупотребляю глобальным пространством имен perl через нестрогую ссылку для конструирования строк столбцов:
Затем я сопоставляю каждую строку столбца с номером первого столбца, в котором эта строка когда-либо появляется (отображение уже указано выше), снова злоупотребляя глобальным пространством имен perl (но обратите внимание, что имена не могут конфликтовать, чтобы глобальные переменные не мешали друг другу):
Я должен отрицать,
$_
потому что, как я объяснил выше, я считаю столбцы как-1, -2, -3, ...
.||=
УБЕДИТЕСЬ только первое появление данной колонки получает новый номер столбца, в противном случае предыдущий номер столбца сохраняется и возвращается в качестве значения. Это будет происходить, в частности, для каждого сокращенного слова, поскольку спецификация гарантирует, что в полных словах есть столбец, который появится раньше. Таким образом, в самом последнем сокращенном слове каждая буква будет заменена номером столбца в полном слове, который соответствует столбцу для всех сокращенных слов. Таким образом, результатом самой последней замены является конечный результат, который требуется. Так что печатайте тогда и только тогда, когда мы находимся в конце ввода:При присваивании индекса столбцу также создаются записи для неполных столбцов, поскольку столбец еще не сформирован полностью или некоторые слова короче и не достигают полной длины столбца. Это не проблема, так как столбцы, необходимые в каждом сокращенном слове, гарантированно будут иметь соответствующий столбец из полных слов, который имеет максимально возможную длину (количество видимых в данный момент пар), поэтому эти дополнительные записи никогда не приводят к ложным совпадениям.
источник
Haskell, 74 байта
Формат ввода представляет собой список пар строк, например:
Как это работает:
mapM
(так же, какsequence . map
) сначала превращает каждую пару(w,a)
в список списков индексов букв в аббревиатуре (' ':
исправляет родной индекс на основе 0 в Haskell к 1 на основе), например,("potato", "ptao") -> [[1],[3,5],[4],[2,6]]
а затем в список всех их комбинаций, где элемент в позицииi
берется изi
подсписка th, например[[1,3,4,2],[1,3,4,6],[1,5,4,2],[1,5,4,6]]
.foldl1 intersect
находит пересечение всех таких списков списков.источник
ES6, 92 байта
Принимает ввод как массив слов и массив аббревиатур. Возвращает массив основанных на 1 индексов (который стоит мне 2 байта, черт побери). В случае нескольких решений возвращаются самые высокие показатели.
источник
Python 3, 210 байт
Не очень впечатляющий ответ, увидев здесь топ-очки, но это действительно одно из самых сумасшедших представлений о списках, которые я когда-либо делал с Python. Подход довольно прямой.
Функция всегда ожидает ввода в виде строкового двумерного массива, например:
[[word, abbr],...]
и возвращает список целых чисел.PS: подробное объяснение в ближайшее время
PS2: Дальнейшие предложения по игре в гольф приветствуются!
источник