Найкоротший індекс підрядки


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
Я впевнений, що ця проблема не є повною. Я думаю, що я можу побудувати зменшення точної проблеми покриття до цієї.
FUZxxl

4
Більше того, що творчих рішень ви не побачите, оскільки немає кращого рішення, ніж груба сила.
FUZxxl

Відповіді:


3

Pyth, 39 байт

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

Брутефорсує всі підмножини кожної рядки із збільшенням довжини та перевіряє, чи є цей рядок всередині будь-якого іншого. Якщо це не працює, воно зробить те саме, за винятком усіх підмножин \nstring\n.


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

@freekvd Heroku повинна мати застарілу версію Pyth, тому що виклик .:з рядком першого типу та int другого типу не є помилкою. Спробуйте використовувати Pyth від репо: github.com/isaacg1/pyth
orlp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.