大使と翻訳者


12

国連会議の2人の大使はお互いに話したいと思っていますが、残念なことにそれぞれが1つの言語しか話せません。彼らは同じ言語ではありません。幸いなことに、彼らはそれぞれが少数の言語を理解し話す複数の翻訳者にアクセスできます。あなたの仕事は、2人の大使が互いに話すことを可能にする翻訳者の最短チェーンを決定することです(できるだけ翻訳で失われないようにするため)。

コーディング

入力: 2文字の小文字の文字列としての2つの言語(各大使の言語)と言語のリストのリスト(利用可能な翻訳者ごとに1つのリスト)

または、2文字のコードの代わりに整数を使用することもできます。

出力: 2人の大使が通信できる最短の翻訳者チェーンのいずれかであるインデックスまたは値による翻訳者のシーケンス。有効な翻訳者のチェーンがない場合、動作は未定義です。(クラッシュしたり、任意の値を出力したり、エラーを示したりする場合があります)

有効な翻訳者チェーンとは、最初の翻訳者が1人の大使の言語を話し、2番目以降の翻訳者が少なくとも1つの言語を前の翻訳者と共有し、最後の翻訳者がもう1人の大使の言語を話すものです。

ゼロベースのインデックス作成の使用:

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]

ルールと仮定

  • 標準のIOルール(便利なI / O形式を使用)および禁止された抜け穴が適用されます。
  • 言語を話すことと理解することは完全に対称的であり、言語間で可能なすべての翻訳は同等に効率的であると仮定することができます。
  • 「十分に近い」言語という概念はありません。たとえば、スペイン語が必要な一端でポルトガル語を使用するのは十分ではありません。
  • 最短の翻訳者チェーンが複数ある場合は、どれでもかまいません。
  • アンバサダーが偶然同じ言語を話す場合、翻訳者リストは空でなければなりません
  • 最初のアンバサダーはどれでもかまいません。翻訳者リストは順方向または逆方向になります。
  • 大使はこの課題のために1つの言語しか話せません
  • 翻訳者は少なくとも2つの言語を話す
  • 2文字の言語コードは、実際の言語に対応する必要はありません
  • あなたは翻訳者の有効なシーケンスがあると仮定するかもしれません
  • 値でシーケンスを出力する場合は、関連する言語だけでなく、使用可能な言語の完全なセットを含めます。

ハッピーゴルフ!


2
なぜ2文字の文字列へのI / O制限が、整数でも同じようにしないのですか?
ジョナサンアラン

翻訳者のリストのリストは、次のようなcsv形式にすることができます:en,fr,sp;en,gr;gr,fr
クイン

@Quinnの標準IOルールはyesと答えています。
ビーフスター

アンバサダーを最初と最後に出力に含めることができますか?
ニックケネディ

@NickKennedyその上でノーと言うつもりです。
ビーフスター

回答:


3

パイソン2138の 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[]

オンラインでお試しください!

ArBoに 3バイトthx

翻訳者の最小の長さのリストをset言語のs として返します。つまり、「値による」からTaに話すことができbます。


if t not in U and a in tif(a in t)>U.count(t)4バイトを節約するように変更できます。
-mypetlion

@mypetition-同様の考えを持っていて、さらに2を絞り出しました。
Chas Brown

117*args表記法を使用して
ArBo

@ArBo:いいね。3バイトのthx。
チャスブラウン

3

ゼリー19 17バイト

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

オンラインでお試しください!

トランスレーターのリストを左の引数として、アンバサダーのリスト(それぞれがリストに二重にラップされている)を右の引数としてとるダイアディックリンク。翻訳者のリストを返します。各翻訳者は、彼らが話す言語のリストです。

2バイトを節約してくれた@KevinCruijssenに感謝します!

説明

Œ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

powerset + permurationsはすでに長さでソートされたリストになるため、長さでソートを削除することで2バイト節約できます。
ケビンクルーッセン

@KevinCruijssenありがとう、良い点!
ニックケネディ

2

05AB1E18 17バイト

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

に触発さ @NickKennedyのJelly answerにので、必ず彼に賛成してください!

インデックスの代わりにリスト自体を出力します。

オンラインで試すか、、すべてのテストケースを確認してください

説明:

æ                # 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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.