Слово ланцюжок перезавантажений


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 (fret-> правда-> серце-> правда-> його)
  • we were stew early yew easy => 9 (тушко-> були-> рано-> тис-> були-> легко-> тис-> ми-> легко)
  • tac cat tac cot tac can => 6 (tac-> cat-> tac-> cot-> tac-> can)

(Повідомте мене, якщо я помилився на будь-якому з цих прикладів або якщо ви придумали більше.)

Відповіді:


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 на питання ланцюга «Слова слова» .


"cat dog tred xy yz zx"повертає 4. Це правильно? Чи не повинно бути 3?
Час Браун

@ChasBrown xy yz zx xy- це найдовший ланцюг, тому 4.
notjagan

1

Haskell , 131 141 байт

В основному підхід грубої сили. Ідея полягає в тому, щоб генерувати всі можливі фігури доміно , переставляти їх, перевіряти, чи це дійсне комбо, і максимізувати всю справу. Складність у часі смішна, 4-й тестовий випадок вже займає ~ 4s на моєму ПК, а в 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]]

Спробуйте в Інтернеті!

Безумовно

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. btw, тому що ви використовуєте Lambdabot, це уникати написання імпортних заяв, правда?
geokavel

Так. Але я перестав це робити, оскільки ніхто інший цього не робив, не впевнений у цьому. Чому?
ბიმო

Я намагаюся з’ясувати, хто переміг. Зазвичай ви включаєте заяви про імпорт у кількість байтів. Але якщо ви знайшли середовище, яке не потребує імпорту, то це нормально.
geokavel

О, я б все одно не прийняв відповідь . Якщо ви хочете, тоді я зміню свою відповідь, оскільки відповідь @ notjagan краща за мою.
ბიმო

1
Я маю на увазі це кодовий гольф, тож ти на першому місці. У будь-якому випадку, відповідь відповідає вашому імені. Але я залишу це відкритим на ваше прохання.
геокавель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.