Перезагрузка цепочки слов

9

Это вариант Воспроизвести цепочку слов и Построить длинную цепочку слов .


Входные данные представляют собой непустой список уникальных слов длиной не менее 2 символов, состоящих из символов в [az]. Вам необходимо вывести длину максимально длинной цепочки, где каждое последующее слово начинается с последней буквы предыдущего слова. Вы можете начать с любого слова в списке.

Другой поворот заключается в том, что вам разрешено повторять любое слово в списке. Тем не менее, вы не можете повторить любой блок из двух слов. Например, cat->tac->catразрешено, но cat->tac->cat->tacнет, потому что вы повторили блок из двух слов ( cat->tac). Также нельзя использовать одно и то же слово дважды подряд (например eye->eye).

Примеры:

  • cat dog tree egg => 3 (кошка-> дерево-> яйцо)
  • new men ten whim => 5 (десять-> новые-> капризы-> мужчины-> новые)
  • truth fret heart his => 5 (раздражение-> правда-> сердце-> правда-> его)
  • we were stew early yew easy => 9 (рагу-> были-> рано-> тис-> были-> легко-> тис-> мы-> легко)
  • tac cat tac cot tac can => 6 (tac-> cat-> tac-> cot-> tac-> can)

(Дайте мне знать, если я допустил ошибку в каком-либо из этих примеров или если вы придумали больше.)

geokavel
источник

Ответы:

3

Python 3 , 150 149 145 байтов

def f(d):
 a=[[w]for w in d]
 while a:b=a[0];a=[f+[l,y]for*f,l in a for y in{*d}-{b for a,b in zip(f,f[1:])if a==l}if l[-1]==y[0]]
 return len(b)

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

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

notjagan
источник
"cat dog tred xy yz zx"возвращается 4. Это верно? Не должно ли это быть 3?
Час Браун
@ChasBrown xy yz zx xy- самая длинная цепочка, поэтому 4.
notjagan
1

Haskell , 131 141 байт

В основном подход грубой силы. Идея состоит в том, чтобы генерировать все возможные фигуры домино , переставлять их, проверять, является ли это действительным комбо, и максимизировать все это. Сложность времени смешная, 4-й тестовый пример уже занимает ~ 4 с на моем ПК, а на TIO он не работает!

import Data.List
p w=2+maximum[length$takeWhile(\(x,y)->x!!1==y!!0)$zip p$tail p|p<-permutations[[a,b]|(a,b)<-(,)<$>w<*>w,a/=b,last a==b!!0]]

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

Ungolfed

p w = maximum
  [ 2 + length c | p <- permutations [ [a,b] | (a,b) <- (,)<$>w<*>w
                                             , a /= b
                                             , last a == head b
                                     ]
                 , c <- [ takeWhile (\(x,y) -> x!!1 == y!!0) $ zip p (tail p) ]
  ]

Изменить : Изменено с Lambdabot на голый Haskell, но сэкономил несколько байтов, играя в гольф, так что это все еще меньше, чем 145байты :)

ბიმო
источник
Последнее заняло около 19 на моем компьютере на TIO. Кстати, причина, по которой вы используете Lambdabot, состоит в том, чтобы не писать операторы импорта, верно?
геокавель
Да. Но я перестал это делать, поскольку никто другой не делал этого, не уверен в этом. Почему?
ბიმო
Я пытаюсь выяснить, кто победил. Как правило, вы включаете операторы импорта в число байтов. Но если вы нашли среду, которая не требует импорта, тогда все в порядке.
геокавель
О, я все равно не приму ответ . Если вы хотите, то я изменю свой ответ, потому что ответ @ notjagan лучше, чем мой.
ბიმო
1
Я имею в виду, что это кодовый гольф, так что вы на первом месте. В любом случае, ваш ответ соответствует вашему имени. Но я оставлю это открытым по вашей просьбе.
геокавель