Посли та перекладачі


12

Два посли на конференції ООН хочуть розмовляти один з одним, але, на жаль, кожен говорить лише однією мовою - і вони не одна і та ж мова. На щастя, вони мають доступ до декількох перекладачів, які кожен розуміють та розмовляють кількома мовами. Ваше завдання - визначити найкоротший ланцюжок перекладачів (оскільки ви хочете, щоб якомога менше було втрачено в перекладі), що дозволяє двом послам розмовляти між собою.

Кодування

Введення: дві мови у вигляді двох рядкових рядків рядка (мова кожного посла) та список списків мов (один список на доступного перекладача)

Ви також можете взяти цілі числа замість двобуквених кодів.

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

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

Приклади

Використання нульової індексації:

es, en, [
    [es, en]
] ==> [0]

en, en, [] ==> []

en, jp, [
    [en, zh, ko, de],
    [jp, ko]
] ==> [0, 1]

es, ru, [
    [gu, en, py],
    [po, py, ru],
    [po, es]
] ==> [2, 1]

fr, gu, [
    [it, fr, de, es, po, jp],
    [en, ru, zh, ko],
    [jp, th, en],
    [th, gu]
] ==> [0, 2, 3]

fr, ru, [
    [fr, en],
    [en, ko, jp],
    [en, ru]
] ==> [0, 2]

de, jp, [
    [en, fr],
    [ko, jp, zh],
    [fr, po],
    [es, ko, zh],
    [de, en, th],
    [en, es],
    [de, fr]
] ==> [4, 5, 3, 1]

Правила та припущення

  • Застосовуються стандартні правила вводу-виводу (використовуйте будь-який зручний формат вводу-виводу) та заборонені лазівки.
  • Ви можете припустити, що розмова та розуміння мов ідеально симетричні і що всі можливі переклади між мовами однаково ефективні.
  • Не існує поняття "досить близьких" мов. Наприклад, недостатньо добре використовувати португальську мову з одного боку, наприклад, якщо потрібна іспанська мова.
  • Якщо є кілька найкоротших ланцюгів перекладачів, будь-який з них зробить це.
  • Якщо посли розмовляють однаковою мовою, список перекладачів повинен бути порожнім
  • Хто з послів перший, не має значення; список перекладачів може бути вперед або назад.
  • Заради цього виступу посли розмовляють лише однією мовою
  • Перекладачі розмовляють принаймні двома мовами
  • 2-літерні мовні коди не повинні відповідати справжнім мовам
  • Ви можете припустити, що є дійсна послідовність перекладачів
  • Якщо виводите послідовність за значенням, включіть повний набір доступних мов, а не лише відповідні.

Щасливого гольфу!


2
Чому обмеження вводу / виводу для двох символьних рядків не зробить цілі числа так само добре?
Джонатан Аллан

Чи може список перекладачів бути у форматі CSV на кшталт:en,fr,sp;en,gr;gr,fr
Квін

@Quinn стандартні правила IO говорять так.
Beefster

Чи можна включити послів до результату на початку та в кінці?
Нік Кеннеді

@NickKennedy Я на це не скажу.
Beefster

Відповіді:


3

Python 2 , 138 126 120 117 113 байт

F=lambda a,b,T,*U:a!=b and min([[t]+F(l,b,T,t,*U)for t in T if(t in U)<(a in t)for l in t-{a}]+[2*T],key=len)or[]

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

3 байти thx в ArBo

Повертає список перекладачів мінімальної довжини як sets мов, тобто "за значенням", з Tяких можна aспілкуватися b.


if t not in U and a in tможна змінити, if(a in t)>U.count(t)щоб зберегти 4 байти.
mypetlion

@mypetition - у мене була подібна думка і вичавила ще 2.
Час Браун

117 , використовуючи *argsпозначення
ArBo

@ArBo: Ніцца; thx на 3 байти.
Час Браун

3

Желе , 19 17 байт

ŒPŒ!€Ẏj@€fƝẠ$ƇḢḊṖ

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

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

Дякуємо @KevinCruijssen за збереження 2 байтів!

Пояснення

ŒPŒ!€Ẏj@€fƝẠ$ƇḢḊṖ | A dyadic link taking a list of translators as left argument and a list of ambassadors (double-wrapped in lists) as right argument

ŒP                | Power set of translators
  Œ!€             | Permutations of each
     Ẏ            | Tighten, i.e. create a single list of all permutations of any length
      j@€         | Join the ambassadors with each set of translators
            $Ƈ    | Filter those where:
           Ạ      |   all
         fƝ       |   the neighbouring pairs have at least one in common
              Ḣ   | Take the first
               Ḋ  | Drop the first ambassador from the start
                Ṗ | Drop the second ambassador from the end

Ви можете зберегти 2 байти, видаливши сортування за довжиною , оскільки при наборі параметрів живлення + пермурації вже є список, відсортований за довжиною.
Кевін Круїссен

@KevinCruijssen дякую, хороший момент!
Нік Кеннеді

2

05AB1E , 18 17 байт

怜€`ʒ²š³ªüå€àP}н

Натхненний @NickKennedy «s Jelly відповідь , тому переконайтеся , що upvote його!

Виводить самі списки замість їх індексів.

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

æ                # Get the powerset of the (implicit) input-list of translators
                 #  i.e. [["ef","gh","bc"],["bc","ab"],["ef","cd","de"]]
                 #   → [[],[["ef","gh","bc"]],[["bc","ab"]],[["ef","gh","bc"],["bc","ab"]],[["ef","cd","de"]],[["ef","gh","bc"],["ef","cd","de"]],[["bc","ab"],["ef","cd","de"]],[["ef","gh","bc"],["bc","ab"],["ef","cd","de"]]]
 €œ              # Get the permutations of each
                 #  → [[[]],[[["ef","gh","bc"]]],[[["bc","ab"]]],[[["ef","gh","bc"],["bc","ab"]],[["bc","ab"],["ef","gh","bc"]]],[[["ef","cd","de"]]],[[["ef","gh","bc"],["ef","cd","de"]],[["ef","cd","de"],["ef","gh","bc"]]],[[["bc","ab"],["ef","cd","de"]],[["ef","cd","de"],["bc","ab"]]],[[["ef","gh","bc"],["bc","ab"],["ef","cd","de"]],[["ef","gh","bc"],["ef","cd","de"],["bc","ab"]],[["bc","ab"],["ef","gh","bc"],["ef","cd","de"]],[["bc","ab"],["ef","cd","de"],["ef","gh","bc"]],[["ef","cd","de"],["ef","gh","bc"],["bc","ab"]],[["ef","cd","de"],["bc","ab"],["ef","gh","bc"]]]]
   €`            # Flatten each one level down (4D list becomes 3D list)
                 #  → [[],[["ef","gh","bc"]],[["bc","ab"]],[["bc","ab"],["ef","gh","bc"]],[["ef","gh","bc"],["bc","ab"]],[["ef","cd","de"]],[["ef","cd","de"],["ef","gh","bc"]],[["ef","gh","bc"],["ef","cd","de"]],[["ef","cd","de"],["bc","ab"]],[["bc","ab"],["ef","cd","de"]],[["ef","cd","de"],["bc","ab"],["ef","gh","bc"]],[["ef","cd","de"],["ef","gh","bc"],["bc","ab"]],[["bc","ab"],["ef","cd","de"],["ef","gh","bc"]],[["bc","ab"],["ef","gh","bc"],["ef","cd","de"]],[["ef","gh","bc"],["ef","cd","de"],["bc","ab"]],[["ef","gh","bc"],["bc","ab"],["ef","cd","de"]]]
     ʒ           # Filter this 3D list by:
      ²š         #  Prepend the second input ambassador
                 #   i.e. [["bc","ab"],["ef","gh","bc"]] and "ab"
                 #    → ["ab",["bc","ab"],["ef","gh","bc"]]
        ³ª       #  Append the third input ambassador
                 #   i.e. ["ab",["bc","ab"],["ef","gh","bc"]] and "ef"
                 #    → ["ab",["bc","ab"],["ef","gh","bc"],"ef"]
          ü      #  For each adjacent pair of translator-lists:
           å     #   Check for each item in the second list, if it's in the first list
                 #    i.e. ["bc","ab"] and ["ef","gh","bc"] → [0,0,1]
            ۈ   #   Then check if any are truthy by leaving the maximum
                 #    → 1
              P  #  And then take the product to check if it's truthy for all pairs
                 #   i.e. ["ab",["bc","ab"],["ef","gh","bc"],"ef"] → [1,1,1] → 1
               # After the filter: only leave the first list of translator-lists
                 #  i.e. [[["bc","ab"],["ef","gh","bc"]],[["bc","ab"],["ef","gh","bc"],["ef","cd","de"]]]
                 #   → [["bc","ab"],["ef","gh","bc"]]
                 # (which is output implicitly as result)

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