Elçiler ve Çevirmenler


12

Bir BM konferansındaki iki büyükelçi birbirleriyle konuşmak istiyor, ancak maalesef her biri sadece bir dil konuşuyor ve aynı dil değiller. Neyse ki, her biri birkaç dili anlayan ve konuşan birkaç çevirmene erişimleri var. Göreviniz, iki büyükelçinin birbirleriyle konuşmasını sağlayan en kısa çevirmen zincirini (çeviride olabildiğince az kaybolmak istediğiniz için) belirlemektir.

Kodlama

Girdi: 2 harfli küçük harfli dizeler (her büyükelçinin dili) ve dil listesi (her çevirmen için bir liste)

Alternatif olarak 2 harfli kodlar yerine tamsayılar da alabilirsiniz.

Çıktı: İki büyükelçinin iletişim kurmasına izin veren en kısa çevirmen zincirlerinden herhangi biri olan indeks veya değere göre çevirmen dizisi. Geçerli bir çevirmen zinciri yoksa, davranış tanımsızdır. (Çökebilir, rastgele bir değer çıktısı verebilir veya bir hatayı gösterebilirsiniz)

Geçerli bir çevirmen zinciri, ilk çevirmenin bir büyükelçinin dilini, ikinci ve sonraki çevirmenlerin önceki çevirmenle en az bir dili paylaştığı ve son çevirmenin diğer büyükelçinin dilini konuştuğu zincirdir.

Örnekler

Sıfır tabanlı endeksleme kullanma:

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]

Kurallar ve Varsayımlar

  • Standart IO kuralları (uygun herhangi bir I / O formatını kullanın) ve yasaklanmış boşluklar uygulanır.
  • Dilleri konuşmanın ve anlamanın mükemmel bir şekilde simetrik olduğunu ve diller arasındaki tüm olası çevirilerin eşit derecede verimli olduğunu varsayabilirsiniz.
  • "Yeterince yakın" dil kavramı yoktur. Örneğin İspanyolca'nın gerekli olduğu bir yerde Portekizce kullanmak yeterince iyi değildir.
  • Birden çok kısa çevirmen zinciri varsa, bunlardan herhangi biri yapar.
  • Elçiler aynı dili konuşurlarsa, çevirmen listesi boş olmalıdır
  • Birinci elçilerin hangisi önemli değil; çevirmen listesi ileri veya geri olabilir.
  • Büyükelçiler bu zorluk uğruna sadece bir dil konuşur
  • Çevirmenler en az iki dil konuşur
  • 2 harfli dil kodlarının gerçek dillere karşılık gelmesi gerekmez
  • Geçerli bir çevirmen sırası olduğunu varsayabilirsiniz.
  • Diziyi değere göre çıkarıyorsanız, yalnızca ilgili dilleri değil, kullanılabilir tüm dilleri de ekleyin.

Mutlu Golf!


2
Neden iki karakterli dizeler için G / Ç kısıtlaması, tamsayılar da bunu yapmasın ki?
Jonathan Allan

çevirmen listesi csv biçiminde olabilir:en,fr,sp;en,gr;gr,fr
Quinn

@Quinn standart IO kuralları evet der.
Beefster

Elçiler başlangıçta ve sonunda çıktıya dahil edilebilir mi?
Nick Kennedy

@NickKennedy Buna hayır diyeceğim.
Beefster

Yanıtlar:


3

Piton 2 , 138 126 , 120 117 113 bayt

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[]

Çevrimiçi deneyin!

3 bayt thx ArBo için

İade olarak çevirmen minimal uzunluğu liste setdan 'değeriyle' dillerin s, yani Tizin vermesini aiçin konuşmak b.


if t not in U and a in tif(a in t)>U.count(t)4 bayt kaydetmek için olarak değiştirilebilir .
mypetlion

@ mypetition - Benzer bir düşüncem vardı ve başka bir 2 sıktım.
Chas Brown

117*args notasyonu kullanarak
ArBo

@ArBo: Güzel; 3 bayt için teşekkürler.
Chas Brown

3

Jöle , 19 17 bayt

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

Çevrimiçi deneyin!

Çevirmenlerin listesini sol argüman olarak ve iki elçi listesini (her biri bir listeye çift sarılmış) doğru argüman olarak alan ikili bir bağlantı. Her biri konuştukları dillerin bir listesi olan çevirmenlerin bir listesini döndürür.

@KevinCruijssen'e 2 bayt kazandığı için teşekkürler!

açıklama

Œ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

Güç kümesi + izinleri zaten uzunluğa göre sıralanmış bir listeyle sonuçlandığından , sıralamayı uzunluğa göre kaldırarak 2 bayt kaydedebilirsiniz .
Kevin Cruijssen

@KevinCruijssen teşekkürler, iyi bir nokta!
Nick Kennedy

2

05AB1E , 18 17 bayt

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

@NickKennedy'in Jelly cevabından esinlenerek , onu oyladığınızdan emin olun!

Listeleri indeksleri yerine kendileri çıkarır.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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

1

JavaScript (ES6),  123  121 bayt

2 harfli kodlar yerine tamsayılar bekler.

(a,b,l)=>((B=g=(m,s,i)=>m>>b&1?B<i||(o=s,B=i):l.map(a=>a.map(M=c=>M|=1<<c)|M&m&&m^(M|=m)&&g(M,[...s,a],-~i)))(1<<a,[]),o)

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.