Реконструировать мои матрешки


20

Фон

Матрешка (или русская матрешка) представляет собой набор кукол , которые подходят друг в друге. Я случайно перепутал свою коллекцию матрешек, и я не помню, какая из них идет внутрь.

Задача

Учитывая список уникальных строк, рассортируйте их по вложенным матрешкам. Каждая строка - это отдельная кукла, а матрешка - это список струн.

правила

Позвольте min(a,b)быть лексикографическим мин строк aи b. Позвольте a ⊂ bобозначить, что aявляется подстрокой b. Потом,

  1. Список матрешек должен быть отсортирован лексикографически
  2. Строка aможет вписаться в строку, bеслиa ⊂ b
  3. Если a ⊂ bи a ⊂ c, то aпойдем внутрьmin(b,c)
  4. Если оба a ⊂ cи b ⊂ c, но a ⊄ b b ⊄ a, то только min(a,b)пойдут внутрьc
  5. Если и то, a ⊂ cи то b ⊂ c, а то и a ⊂ bто, только bпойдет внутрь c. Т.е. суперструны идут перед подстроками, так что матрешка не заканчивается преждевременно.

Примеры

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

3
Первый пост здесь, пожалуйста, укажите что-нибудь тупое / необходимые исправления.
Суджит

2
Добро пожаловать в PPCG! Если вы не уверены, достаточно ли хорош этот пост, вы можете сначала опубликовать его в Песочнице.
user202729

2
Это не обязательно, просто держите это здесь. Сообществу это нравится.
user202729

2
@sujeet в будущем, попробуйте сначала опубликовать в песочнице. Это место, где можно получить отзывы о своих задачах, прежде чем публиковать их на главном сайте. Не беспокойтесь об этом сейчас, так как этот вызов кажется нормальным, но есть над чем подумать на будущее.
Rɪᴋᴇʀ

3
Каким должен быть результат ab, ba, aba, bab? В соответствии с правилом 3, как abи baдолжно идти в aba, и в соответствии с правилом 4, baне может идти ни в одну abaили bab.
Згарб

Ответы:


2

Python 2 , 298 байт

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

Попробуйте онлайн!

-28 байт с советами от @dylnan, поиск ошибок от @Dennis и исправление ошибок от @ Mr.Xcoder


1
301 байт . Просто превратился iв лямбда-функцию и изменил имя переменной outна o.
Дилнан

1
297 байт (E = перечислить)
dylnan


Чтобы исправить эту проблему, 298 байтов . Кроме того, outимя переменной с 3 символами ... Серьезно: P?
г-н Xcoder
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.