Đại sứ và Biên dịch viên


12

Hai đại sứ tại một hội nghị của Liên Hợp Quốc muốn nói chuyện với nhau, nhưng thật không may, mỗi người chỉ nói một ngôn ngữ - và họ không cùng một ngôn ngữ. May mắn thay, họ có quyền truy cập vào một số dịch giả, mỗi người hiểu và nói một vài ngôn ngữ. Nhiệm vụ của bạn là xác định chuỗi dịch giả ngắn nhất (vì bạn muốn mất ít dịch thuật nhất có thể) cho phép hai đại sứ nói chuyện với nhau.

Mã hóa

Đầu vào: hai ngôn ngữ dưới dạng chuỗi ký tự viết thường gồm 2 chữ cái (mỗi ngôn ngữ của đại sứ) và danh sách các danh sách ngôn ngữ (một danh sách cho mỗi người dịch có sẵn)

Bạn có thể thay thế lấy số nguyên thay vì mã 2 chữ cái.

Đầu ra: Một chuỗi các dịch giả theo chỉ số hoặc giá trị là bất kỳ một trong những chuỗi dịch giả ngắn nhất cho phép hai đại sứ giao tiếp. Nếu không có chuỗi dịch giả hợp lệ, hành vi không được xác định. (Bạn có thể gặp sự cố, xuất bất kỳ giá trị tùy ý hoặc chỉ ra lỗi)

Một chuỗi dịch giả hợp lệ là một trong đó dịch giả đầu tiên nói một ngôn ngữ của đại sứ, dịch giả thứ hai và sau đó chia sẻ ít nhất một ngôn ngữ với người dịch trước đó, và dịch giả cuối cùng nói ngôn ngữ của đại sứ khác.

Ví dụ

Sử dụng lập chỉ mục dựa trên zero:

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]

Quy tắc và giả định

  • Các quy tắc IO tiêu chuẩn (sử dụng bất kỳ định dạng I / O thuận tiện nào) và các lỗ hổng bị cấm áp dụng.
  • Bạn có thể cho rằng việc nói và hiểu ngôn ngữ là hoàn toàn đối xứng và tất cả các bản dịch có thể có giữa các ngôn ngữ đều có hiệu quả như nhau.
  • Không có khái niệm về ngôn ngữ "đủ gần". Chẳng hạn, việc sử dụng tiếng Bồ Đào Nha ở một đầu là không yêu cầu tiếng Tây Ban Nha.
  • Nếu có nhiều chuỗi dịch giả ngắn nhất, bất kỳ một trong số họ sẽ làm.
  • Nếu các đại sứ tình cờ nói cùng một ngôn ngữ, danh sách người dịch sẽ trống
  • Mà một trong những đại sứ là người đầu tiên không quan trọng; danh sách người dịch có thể chuyển tiếp hoặc đảo ngược.
  • Đại sứ chỉ nói một ngôn ngữ vì lợi ích của thử thách này
  • Dịch giả nói ít nhất hai ngôn ngữ
  • Mã ngôn ngữ 2 chữ cái không cần phải tương ứng với ngôn ngữ thực
  • Bạn có thể cho rằng có một trình tự dịch hợp lệ
  • Nếu xuất ra chuỗi theo giá trị, bao gồm toàn bộ ngôn ngữ có sẵn, không chỉ các ngôn ngữ có liên quan.

Chúc bạn chơi golf vui vẻ!


2
Tại sao hạn chế I / O đối với chuỗi hai ký tự, số nguyên sẽ không làm như vậy?
Jonathan Allan

danh sách các dịch giả có thể ở dạng csv như:en,fr,sp;en,gr;gr,fr
Quinn

@Quinn quy tắc IO tiêu chuẩn nói có.
Beefster

Các đại sứ có thể được bao gồm trong đầu ra ở đầu và cuối không?
Nick Kennedy

@NickKennedy Tôi sẽ nói không với cái đó.
Beefster

Câu trả lời:


3

Python 2 , 138 126 120 117 113 byte

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

Hãy thử trực tuyến!

3 byte thx đến ArBo

Trả về một danh sách độ dài tối thiểu của các dịch giả dưới dạng sets của các ngôn ngữ, tức là 'theo giá trị', từ Tđó cho phép anói chuyện với b.


if t not in U and a in tcó thể được thay đổi if(a in t)>U.count(t)để lưu 4 byte.
mypetlion

@mypetition - Tôi cũng có suy nghĩ tương tự và vắt kiệt 2.
Chas Brown

117 bằng cách sử dụng *argský hiệu
ArBo

@ArBo: Đẹp; thx cho 3 byte.
Chas Brown

3

Thạch , 19 17 byte

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

Hãy thử trực tuyến!

Một liên kết dyadic lấy danh sách các dịch giả làm đối số bên trái và danh sách các đại sứ (mỗi người được bọc trong một danh sách) làm đối số bên phải. Trả về một danh sách các dịch giả, mỗi trong số đó là một danh sách các ngôn ngữ họ nói.

Cảm ơn @KevinCruijssen vì đã tiết kiệm 2 byte!

Giải trình

Œ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

Bạn có thể lưu 2 byte bằng cách loại bỏ sắp xếp theo độ dài , vì các quyền hạn + hoán vị đã dẫn đến một danh sách được sắp xếp theo độ dài.
Kevin Cruijssen

@KevinCruijssen cảm ơn, điểm tốt!
Nick Kennedy

2

05AB1E , 18 17 byte

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

Lấy cảm hứng từ câu trả lời Jelly của @NickKennedy , vì vậy hãy đảm bảo nâng cao anh ấy!

Đầu ra danh sách thay vì chỉ số của họ.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Yêu cầu số nguyên thay vì mã 2 chữ cái.

(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)

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.