Reconstruir minhas bonecas matryoshka

20

fundo

Uma boneca matryoshka (ou boneca russa) é um conjunto de bonecas que se encaixam umas nas outras. Eu acidentalmente misturei minha coleção de bonecas matryoshka e não me lembro qual delas vai dentro da qual.

Objetivo

Dada uma lista de seqüências únicas , classifique-as em bonecas matryoshka aninhadas. Cada corda é uma boneca individual e uma boneca matryoshka é uma lista de cordas.

Regras

Let min(a,b)Ser o min lexicográfico de strings ae b. Vamos a ⊂ bdenotar que aé uma subcadeia de b. Então,

  1. A lista de bonecas matryoshka deve ser classificada lexicograficamente
  2. String apode caber em string bsea ⊂ b
  3. Se a ⊂ be a ⊂ c, então, airá para dentromin(b,c)
  4. Se ambos a ⊂ ce b ⊂ c, mas a ⊄ b b ⊄ a, apenas min(a,b)entrarãoc
  5. Se ambos a ⊂ ce b ⊂ c, e também a ⊂ b, apenas bentrarão c. Ou seja, as supercordas vão antes das substrings para que o matryoshka não seja prematuramente finalizado.

Exemplos

In:
hahaha, hah, lol, lololol, bahaha, bah, haha, ah

Out:
bahaha, bah, ah
hahaha, haha, hah
lololol, lol

In:
aa, aaaa, a, aaaaaaaaaa

Out:
aaaaaaaaaa, aaaa, aa, a
sujeet
fonte
3
Primeiro post aqui, por favor, aponte qualquer coisa idiota / correções necessárias.
sujeet
2
Bem-vindo ao PPCG! Se você não tiver certeza se a postagem é boa o suficiente, você pode publicá-la primeiro na Sandbox.
usar o seguinte comando
2
Não é obrigatório, apenas mantenha-o aqui. A comunidade gosta disso.
user202729
2
@sujeet no futuro, tente postar primeiro na sandbox. É um local para obter feedback sobre seus desafios antes de publicá-los no site principal. Não se preocupe com isso agora, pois esse desafio parece bom como está, mas é algo a considerar para o futuro.
Rɪᴋᴇʀ
3
Qual deve ser o resultado ab, ba, aba, bab? Pela regra 3, ambos abe badevem entrar aba, e pela regra 4, banão podem entrar em um abaou em bab.
Zgarb 16/01/19

Respostas:

2

Python 2 , 298 bytes

def f(x,E=enumerate):
 o=[]
 while any(x):
	for k,p in E(x):
	 e=0
	 if sum(i(p,j)for j in x)<1:
		for d,r in E(o):
		 if i(p,r[-1])*((r[-1]<e)or e==0):m,e=d,r[-1]
		if e:o[m]+=[p]
		else:o+=[[p]]
		x[k]=''
 print sorted(o)
i=lambda p,b:(b!=p)*any([p==b[j:j+len(p)]for j in range(len(b)-len(p)+1)])

Experimente online!

-28 bytes com dicas de @dylnan, localização de bugs por @Dennis e correção de bugs por @ Mr.Xcoder

fireflame241
fonte
1
301 bytes . Acabou de se transformar iem uma função lambda e alterou o nome da variável outpara o.
dylnan
1
297 bytes (E = enumerar)
dylnan
As funções precisam ser reutilizáveis , mas a outvariável nunca muda. Experimente online!
Dennis
Para corrigir esse problema, 298 bytes . Além disso, outnome da variável com 3 caracteres ... Sério: P?
Sr. Xcoder