Indice de sous-chaîne le plus court

9

Je suis une personne paresseuse mais efficace, comme beaucoup d'entre vous le sont probablement aussi. Donc, chaque fois que je fais quelque chose, je veux le faire avec un minimum d'effort. C'est pourquoi je vous demande de résoudre ce problème pour moi.

Ce que j'ai ici, c'est une sorte de document. Sur chaque ligne de ce document se trouve un seul mot ou une courte phrase. Le document n'est pas trié, mais ça va, je sais où tout est. Je pourrais utiliser un peu d'aide pour trouver les choses plus rapidement, et pour cela j'ai besoin d'une deuxième liste. C'est là que vous intervenez. Pour chaque ligne de texte de ce document, j'ai besoin d'un identifiant. Quelque chose que je peux CTRL+ F, mais cela ne peut pas être plus long que nécessaire pour obtenir ce résultat.

Exemple d'entrée:

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

Exemple de sortie:

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

Je vais me répéter ici, pour m'assurer que nous sommes sur la même longueur d'onde:

  • L'entrée est un fichier texte non formaté contenant une liste d'éléments, séparés par des sauts de ligne. Je l'ai ici au format .txt, ça s'appelle "STUFF.TXT"
  • La première et la dernière ligne du document sont vides. Une ligne sur deux contient une entrée de longueur> 0.
  • Le fichier contient uniquement des caractères alphanumériques (tous en minuscules), des espaces et des sauts de ligne.
  • La sortie souhaitée est une liste d'identifiants, dans le même ordre que ma liste d'origine.
  • Je ne veux pas plus d'un mot de recherche pour chaque élément de la liste. S'il y a plusieurs réponses, choisissez-en une, je m'en fiche. Dans l'exemple ci-dessus, j'ai choisi «ap» pour an apple, mais vous auriez pu choisir «n», «a», «pp», «pl» ou «le». Pas «un», parce que c'est dedans banana.
  • Je peux vous assurer que le fichier n'est jamais vide et qu'il ne contient jamais de doublons.
  • Si nécessaire , vous pouvez faire correspondre le terminateur de ligne. Mais c'est un dernier recours à utiliser uniquement lorsqu'il n'y a pas d'autre moyen de faire la distinction entre les éléments de la liste (par exemple «pomme» et «pommes»).

Les échappatoires standard ne sont pas autorisées. De plus, c'est le golf de code, donc le code le plus court gagne.

Un autre exemple:

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

Et sa sortie:

ban,ny,g,be,ye,ke,aki,ar
freekvd
la source
1
@CarpetPython, il doit être le plus court possible. Les espaces peuvent être en entrée et en sortie, a ajouté cela à la question.
freekvd
Peut-on également utiliser des sauts de ligne au début du terme de recherche, si une chaîne est le suffixe d'une autre?
Martin Ender
@ MartinBüttner oui. C'est pourquoi le document commence et se termine par une ligne vierge, vous avez donc ces nouvelles lignes au début et à la fin de chaque élément de la liste.
freekvd
4
Je suis sûr que ce problème est NP-complet. Je pense que je peux construire une réduction du problème de couverture exacte à celui-ci.
FUZxxl
4
C'est plus que vous ne verrez pas de solutions créatives car il n'y a pas de meilleure solution que la force brute.
FUZxxl

Réponses:

3

Pyth, 39 octets

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

Renforce tous les sous-ensembles de chaque chaîne en augmentant la longueur et vérifie si cette chaîne se produit à l'intérieur d'une autre. Si cela ne fonctionne pas, il fera de même sauf pour tous les sous-ensembles de \nstring\n.

orlp
la source
J'obtiens une erreur de combinaison de mauvais type lorsque je teste cela. pyth.herokuapp.com/…
freekvd
@freekvd Heroku doit avoir une version obsolète de Pyth, car appeler .:avec une chaîne de premier type et un deuxième type int n'est pas une erreur. Essayez d'utiliser Pyth à partir du référentiel
orlp