Знайдіть діаметр графіка слова


13

Вступ

Популярна головоломка - перетворити одне слово на інше через ряд кроків, які замінюють лише одну букву і завжди призводять до дійсного слова. Наприклад, BAG можна перетворити на DOG шляхом шляхом в п'ять кроків:

КОРОБКА -> БАТЬ -> КОШКА -> КОТ -> КОГ -> ПС

У цьому випадку також існують коротші шляхи; наприклад:

КОРОБКА -> БОГ -> КУЧКА

Якби намалювати графік, вершини якого позначені словами, з краєм між будь-якою парою слів, які відрізняються однією літерою, то найкоротший шлях від "BAG" до "DOG" складатиметься з двох ребер.

Виклик

Ви повинні написати програму, яка отримує на вхід "словник" слів, які мають однакову довжину, представляючи всі допустимі слова, які можуть відображатися як кроки по шляху. Він повинен вивести принаймні один "найдовший найкоротший шлях", тобто шлях між двома словами, який є:

  • не довший, ніж будь-який інший шлях між цими двома словами;

  • принаймні до тих пір, як найкоротший можливий шлях між будь-якими іншими парами слів у списку.

У контексті описаного вище графіка довжина такого шляху є діаметром графіка.

У виродженому випадку, коли жодне із вхідних слів не можна перетворити на будь-яке з інших, виведіть принаймні один шлях довжиною нульової, тобто одне слово.

Приклади

  • Вхід ["сумка", "кажан", "кішка", "дитяче ліжечко", "крапка", "собака"] повинен дати шлях, який проходить усі шість слів у тому порядку (або зворотний порядок), оскільки найкоротший шлях від " мішок "до" собаки "в цьому словнику - це найдовший досягнення, п’ять кроків.

  • Вхід ["сумка", "кажан", "бот", "кішка", "дитяче ліжечко", "крапка", "собака"] повинен дати шлях "сумка, кажан, бот, крапка, собака" та / або його розворот.

  • Вхід ["код", "гольф", "самець", "гудіння", "моль", "роль", "цвіль", "холод", "золото", "режим"] повинен пройти шлях між "кодом і "гольф".

  • Вхідні дані ["один", "два", "шість", "десять"] відповідають графіку без ребер, тому виведіть один або кілька однословних (нульової довжини) шляхів.

  • Якщо вхід містить два слова неоднакової довжини, вихід не визначений.

Правила

  • Діють стандартні правила гольф-коду
  • Буде кілька "найкоротших" шляхів. Ви повинні вивести принаймні одне, але вільне виводити скільки завгодно.
  • Ви можете вирішити, як словник для введення передається у вашу програму.
  • Виграє найкоротший код у байтах.

3
Ви хочете додати ще кілька тестових випадків?
Йона

Зроблено. Також додано обговорення випадку, коли графік не містить ребер.
jnfnt


Чи слід приймати порожній ввід (відповідь буде []чи [[]])?
Ерік Аутгольфер

Я радий за те, що поведінка не визначена на порожніх входах.
jnfnt

Відповіді:



3

APL (Dyalog Classic) , 84 80 77 76 74 66 61 байт

{⍵⌷⍨{⍵,⍨⊃⍋(1a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/⊃⍸a=d←⌈/512|,a←⌊.+⍨⍣≡9*⍨2⌊⍵+.≠⍉⍵}

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

вхід і вихід - це матриці символів

⍵+.≠⍉⍵ матриця дистанцій між словами, схожими на забивання

9*⍨2⌊залиште 0s та 1s недоторканими, перетворіть 2+ у велику кількість (512 = 2 9 , використовується як "∞")

⌊.+⍨⍣≡ алгоритм найкоротшого шляху floyd & warhall

  • ⌊.+як матричне множення, але використовуючи min( ) і +замість +і ×відповідно

  • використовувати однакову матрицю зліва та справа

  • ⍣≡ повторити до зближення

d←⌈/512|, довжина найдовшої (не "∞") шляху, призначена d

⊃⍸a=який два вузол робить його підключення, давайте назвемо їх I і J

{⍵,⍨⊃⍋(1≠a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/ реконструювати шлях

  • { }⍣d/оцінити час { }функціонування d. лівий аргумент - це завжди я . правий арг починається як j і поступово накопичує внутрішні вузли шляху

  • (1≠a⌷⍨⊃⍵),⍪⍺⌷a побудувати матрицю з двома стовпцями цих двох векторів:

    • 1≠a⌷⍨⊃⍵ булеві (0 або 1), які вказують, які вузли знаходяться на відстані 1 до першого

    • ⍺⌷a відстані всіх вузлів графіка до

  • ⊃⍋ покажчик лексикографічно найменшого рядка

  • ⍵,⍨ передчувати

⍵⌷⍨ індексуйте оригінальні слова шляхом


2

Python 3 , 225 байт

from itertools import*
def f(a):b=[((p[0],p[-1]),(len(p),p))for i in range(len(a))for p in permutations(a,i+1)if all(sum(q!=r for q,r in zip(*x))<2for x in zip(p,p[1:]))];return max(min(r for q,r in b if x==q)for x,y in b)[1]

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

По суті, пройдіть усі можливі шляхи, зберігайте лише ті, які є дійсними, потім пройдіть кожну комбінацію старту-кінця, знайдіть мінімальну відстань шляху та знайдіть максимум цього.



1

JavaScript (ES6),  195  194 байт

Повертається [optimal_length, [optimal_path]].

f=(a,p=[],w=o=[],l=0)=>Object.values(o,o[k=[w,p[0]]]=(o[k]||0)[0]<l?o[k]:[l,p],a.map((v,i)=>w+w&&[...v].map((c,i)=>s-=c!=w[i],s=1)|s||f(a.filter(_=>i--),[...p,v],v,l+1))).sort(([a],[b])=>b-a)[0]

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

Як?

fош0ш1[л,p]pш0ш1л

pлшpо

o[k = [w, p[0]]] = (o[k] || 0)[0] < l ? o[k] : [l, p]

о

Object.values(o).sort(([a], [b]) => b - a)[0]

(цей код виконується на кожній глибині рекурсії, але насправді має значення лише кореневий рівень)

vш

[...v].map((c, i) => s -= c != w[i], s = 1) | s

v

f(                    //
  a.filter(_ => i--), // remove the i-th word from a[]
  [...p, v],          // append v to p[]
  v,                  // pass v as the last word
  l + 1               // increment the length of the path
)                     //


0

Python 3, 228 байт.

def G(w):
    D={A+B:[A,B]if sum(a!=b for a,b in zip(A,B))<2else[0,0]*len(w)for A in w for B in w}
    for k in w:
        for i in w:
            for j in w:
                p=D[i+k]+D[k+j][1:]
                if len(p)<len(D[i+j]):D[i+j]=p
    return max(D.values(),key=len)

Реалізує алгоритм Floyd-Warshall для всіх пар найкоротших шляхів, а потім приймає максимум над знайденими шляхами.

16 символів у цій реалізації є вкладками, що прикро :(


2
Це, здається, зламається, коли вершина без інцидентних країв не існує, наприклад, "print G (['bag', 'bat', 'cot'])"
jnfnt

Порада для гольфу для відступу Python: використовуйте пробіл для першого рівня, вкладку для другого, вкладку та пробіл для третього, дві вкладки для четвертого тощо.
Пітер Тейлор

1
@PeterTaylor Хороший підказник, але працює лише для Python 2. Python 3 не дозволяє змішувати вкладки з пробілами.
OOBalance

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