Кратчайший индекс подстроки


9

Я ленивый, но эффективный человек, как, впрочем, и многие из вас. Поэтому всякий раз, когда я что-то делаю, я хочу делать это с минимальными усилиями. Вот почему я прошу вас решить эту проблему для меня.

То, что у меня здесь есть, это своего рода документ. В каждой строке этого документа есть одно слово или короткая фраза. Документ не отсортирован, но это нормально, я знаю, где все. Я мог бы использовать некоторую помощь, чтобы найти вещи быстрее, и для этого мне нужен второй список. Вот где вы входите. Для каждой строки текста в этом документе мне нужен какой-то идентификатор. Что-то, что я могу CTRL+ F, но это не может быть дольше, чем это абсолютно необходимо для получения этого единственного результата.

Пример ввода:

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

Пример вывода:

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

Я повторюсь здесь, чтобы убедиться, что мы на одной странице:

  • Входные данные представляют собой неформатированный текстовый файл, содержащий список элементов, разделенных переносами строк. У меня есть здесь в формате .txt, он называется "STUFF.TXT"
  • Первая и последняя строка документа пусты. Каждая вторая строка содержит запись длиной> 0.
  • Файл содержит только буквенно-цифровые символы (все строчные буквы), пробелы и разрывы строк.
  • Желаемый вывод - это список идентификаторов в том же порядке, что и мой исходный список.
  • Я не хочу более одного поискового слова для каждого элемента списка. Если есть несколько ответов, выберите один, мне все равно, какие. В приведенном выше примере я выбрал «ap» an apple, но вы могли бы выбрать «n», «a», «pp», «pl» или «le». Не «ан», потому что это в banana.
  • Уверяю вас, файл никогда не бывает пустым и никогда не содержит дубликатов.
  • При необходимости вы можете сопоставить на конце строки. Но это последнее средство, которое можно использовать только тогда, когда нет другого способа различить элементы списка (например, «яблоко» и «яблоки»).

Стандартные лазейки не допускаются. Кроме того, это кодовый гольф, поэтому выигрывает самый короткий код.

Еще один пример:

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

И его вывод:

ban,ny,g,be,ye,ke,aki,ar

1
@CarpetPython должен быть максимально коротким. Пробелы могут быть на входе и выходе, добавил это к вопросу.
freekvd

Можем ли мы также использовать переводы строки в начале поискового запроса, если одна строка является суффиксом другой?
Мартин Эндер

@ MartinBüttner, да. Вот почему документ начинается и заканчивается пустой строкой, поэтому у вас есть эти новые строки в начале и конце каждого элемента списка.
freekvd

4
Я уверен, что эта проблема является NP-полной. Я думаю, что я могу построить сокращение точной проблемы покрытия к этой.
FUZxxl

4
Более того, вы не увидите никаких творческих решений, поскольку нет лучшего решения, чем грубая сила.
FUZxxl

Ответы:


3

Pyth, 39 байт

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

Bruteforce все подмножества каждой строки в возрастающей длине и проверяет, встречается ли эта строка внутри любой другой. Если это не сработает, то будет сделано то же самое, за исключением всех подмножеств \nstring\n.


Я получаю ошибку комбинации типов при тестировании. pyth.herokuapp.com/…
freekvd

@freekvd У Heroku должна быть устаревшая версия Pyth, потому что вызов .:с первым типом строки и вторым типом int не является ошибкой. Попробуйте использовать Pyth из
репозитория
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.