Reconstruir mis muñecas Matryoshka

20

Antecedentes

Una muñeca matryoshka (o muñeca rusa de anidación) es un conjunto de muñecas que encajan unas dentro de otras. Accidentalmente mezclé mi colección de muñecas matryoshka y no recuerdo cuál entra dentro de cuál.

Objetivo

Dada una lista de cadenas únicas , clasifíquelas en muñecas matrioska anidadas. Cada cuerda es una muñeca individual, y una muñeca matryoshka es una lista de cuerdas.

Reglas

Dejar min(a,b)ser el min lexicográfico de cadenas ay b. Deje a ⊂ bque denote que aes una subcadena de b. Luego,

  1. La lista de muñecas matryoshka debe clasificarse lexicográficamente
  2. La cadena apuede caber en la cadena bsia ⊂ b
  3. Si a ⊂ by a ⊂ c, entonces aentrarámin(b,c)
  4. Si ambos a ⊂ cy b ⊂ c, pero a ⊄ b b ⊄ a, solo min(a,b)entraránc
  5. Si ambos a ⊂ cy b ⊂ c, y también a ⊂ b, solo bentrarán c. Es decir, las supercadenas van antes que las subcadenas para que la matrioska no se termine prematuramente.

Ejemplos

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
fuente
3
Primera publicación aquí, por favor señale cualquier cosa tonta / correcciones necesarias.
sujeet
2
Bienvenido a PPCG! Si no está seguro de si la publicación es lo suficientemente buena, primero puede publicarla en el Sandbox.
usuario202729
2
No es obligatorio, solo mantenlo aquí. A la comunidad le gusta.
user202729
2
@sujeet en el futuro, primero intente publicar en el sandbox. Es un lugar para recibir comentarios sobre sus desafíos antes de publicarlos en el sitio principal. No te preocupes por eso ahora, ya que este desafío parece estar bien, pero es algo a tener en cuenta para el futuro.
Rɪᴋᴇʀ
3
¿Cuál debería ser el resultado de ab, ba, aba, bab? Por la regla 3, ambos aby badeberían entrar aba, y por la regla 4, bano pueden entrar en ninguno abao bab.
Zgarb

Respuestas:

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)])

Pruébalo en línea!

-28 bytes con consejos de @dylnan, búsqueda de errores por @Dennis y corrección de errores por @ Mr.Xcoder

fireflame241
fuente
1
301 bytes . Simplemente se convirtió ien una función lambda y cambió el nombre de la variable outa o.
dylnan
1
297 bytes (E = enumerar)
dylnan
Las funciones tienen que ser reutilizables , pero la outvariable nunca cambia. Pruébalo en línea!
Dennis
Para solucionar ese problema, 298 bytes . Además, outnombre de variable de 3 caracteres ... En serio: P?
Sr. Xcoder