Índice de Substring Mais Curto

9

Sou uma pessoa preguiçosa, mas eficiente, como muitos de vocês provavelmente também. Então, sempre que estou fazendo algo, quero fazê-lo com o mínimo esforço. É por isso que estou pedindo que você resolva esse problema para mim.

O que tenho aqui é um tipo de documento. Em cada linha deste documento há uma única palavra ou frase curta. O documento não está classificado, mas tudo bem, eu sei onde está tudo. Eu poderia usar alguma ajuda para encontrar as coisas mais rapidamente e, para isso, preciso de uma segunda lista. É aqui que você entra. Para cada linha de texto neste documento, preciso de algum identificador. Algo que eu posso CTRL+ F, mas não pode demorar mais do que o absolutamente necessário para obter esse resultado.

Exemplo de entrada:

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

Exemplo de saída:

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

Vou me repetir aqui, para ter certeza de que estamos na mesma página:

  • A entrada é um arquivo de texto não formatado que contém uma lista de itens, separados por quebras de linha. Eu tenho aqui no formato .txt, chamado "STUFF.TXT"
  • A primeira e a última linha do documento estão vazias. Todas as outras linhas contêm uma entrada de comprimento> 0.
  • O arquivo contém apenas caracteres alfanuméricos (todos minúsculos), espaços e quebras de linha.
  • A saída desejada é uma lista de identificadores, na mesma ordem que a minha lista original.
  • Não quero mais de uma palavra de pesquisa para cada item da lista. Se houver várias respostas, escolha uma, não ligo para qual. No exemplo acima, escolhi 'ap' para an apple, mas você pode ter escolhido 'n', 'a', 'pp', 'pl' ou 'le'. Não é 'um', porque está dentro banana.
  • Posso garantir que o arquivo nunca está vazio e nunca contém duplicatas.
  • Se necessário , você pode corresponder no terminador de linha. Mas esse é o último recurso a ser usado apenas quando não há outra maneira de distinguir entre os itens da lista (por exemplo, 'maçã' e 'maçãs').

As brechas padrão não são permitidas. Além disso, este é um código de golfe, portanto o código mais curto vence.

Mais um exemplo:

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

E sua saída:

ban,ny,g,be,ye,ke,aki,ar
freekvd
fonte
11
@CarpetPython, tem que ser o mais curto possível. Os espaços podem ser de entrada e saída, acrescentados à pergunta.
Freekvd
Também podemos usar novas linhas no início do termo de pesquisa, se uma string for sufixo de outra?
Martin Ender
@ MartinBüttner sim. É por isso que o documento começa e termina com uma linha em branco, para que você tenha essas novas linhas no início e no final de cada item da lista.
Freekvd 30/03
4
Tenho certeza de que esse problema é NP-completo. Eu acho que posso construir uma redução do problema exato de cobertura para este.
FUZxxl
4
É mais que você não verá soluções criativas, pois não há solução melhor que a força bruta.
FUZxxl

Respostas:

3

Pitão, 39 bytes

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

O Brute força todos os subconjuntos de cada string em um comprimento cada vez maior e verifica se essa string ocorre dentro de qualquer outra. Se isso não funcionar, ele fará o mesmo, exceto em todos os subconjuntos de \nstring\n.

orlp
fonte
Eu recebo um erro de combinação de tipo incorreto ao testar isso. pyth.herokuapp.com/…
freekvd
@freekvd Heroku deve ter uma versão desatualizada do Pyth, porque chamar .:com o primeiro tipo string e o segundo tipo int não é um erro. Tente usar Pyth do repo: github.com/isaacg1/pyth
orlp