대사 및 번역가


12

유엔 회의의 두 대사는 서로 대화하기를 원하지만 불행히도 각 언어는 하나의 언어 만 사용하며 같은 언어가 아닙니다. 다행스럽게도, 그들은 몇몇 언어를 이해하고 사용하는 여러 번역가에게 접근 할 수 있습니다. 당신의 임무는 두 명의 대사가 서로 대화 할 수있는 가장 짧은 번역사를 결정하는 것입니다.

코딩

입력 : 2 글자 소문자 문자열 (각 대사의 언어)로서 2 개의 언어 및 언어 목록 (사용 가능한 번역기 당 1 개의 목록)

2 문자 코드 대신 정수를 사용할 수도 있습니다.

출력 : 두 명의 대사가 통신 할 수 있도록하는 가장 짧은 번역사 체인 중 하나 인 색인 또는 값을 기준으로 한 일련의 번역사. 유효한 번역사 체인이 없으면 동작이 정의되지 않습니다. (충돌, 임의의 값을 출력하거나 오류를 표시 할 수 있음)

유효한 번역사 체인은 첫 번째 번역사가 한 명의 대사 언어를 말하고, 두 번째 및 그 이후의 번역자는 이전 번역자와 적어도 하나의 언어를 공유하고 마지막 번역기는 다른 대사의 언어를 말하는 것입니다.

제로 기반 인덱싱 사용 :

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 형식 사용) 및 금지 된 허점이 적용됩니다.
  • 언어를 말하고 이해하는 것이 완벽하게 대칭이며 언어 간 가능한 모든 번역이 똑같이 효율적이라고 가정 할 수 있습니다.
  • "충분히 가까운"언어라는 개념은 없습니다. 예를 들어 스페인어가 필요한 한쪽 끝에 포르투갈어를 사용하는 것만으로는 충분하지 않습니다.
  • 가장 짧은 변환기 체인이 여러 개 있으면 그 중 하나가 수행됩니다.
  • 대사가 같은 언어를 사용하는 경우 번역자 목록이 비어 있어야합니다
  • 어느 대사가 첫 번째 대사인지는 중요하지 않습니다. 번역기 목록은 정방향 또는 역방향 일 수 있습니다.
  • 대사는이 도전을 위해 하나의 언어 만 사용합니다
  • 번역가는 두 가지 이상의 언어를 구사합니다
  • 2 글자 언어 코드는 실제 언어와 일치하지 않아도됩니다.
  • 유효한 번역가 순서가 있다고 가정 할 수 있습니다.
  • 값으로 시퀀스를 출력하는 경우 관련 언어뿐만 아니라 사용 가능한 모든 언어 세트를 포함하십시오.

행복한 골프!


2
왜 두 문자 문자열에 대한 I / O 제한이 정수가 아닌가?
Jonathan Allan

번역사 목록은 csv 형식 일 수 있습니다 :en,fr,sp;en,gr;gr,fr
Quinn

@Quinn 표준 IO 규칙은 예라고 말합니다.
Beefster

대사는 시작과 끝에 출력에 포함될 수 있습니까?
Nick Kennedy

@NickKennedy 나는 그것에 대해 거절 할 것입니다.
Beefster

답변:


3

파이썬 (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[]

온라인으로 사용해보십시오!

ArBo에 3 바이트 thx

대화 할 수 set있는 언어 번역기의 최소 길이 목록 ( 예 : '값별')을 반환합니다 .Tab


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.
Chas Brown

3

젤리 , 19 17 바이트

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

온라인으로 사용해보십시오!

번역가 목록을 왼쪽 인수로, 대사 목록 (각각 목록에 이중 포장)을 오른쪽 인수로 사용하는 2 차원 링크. 통역사 목록을 반환합니다. 각 번역 사는 자신이 사용하는 언어 목록입니다.

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는 이미 길이별로 정렬 된 목록을 생성하므로 length별로 정렬을 제거하여 2 바이트를 절약 할 수 있습니다 .
케빈 크루이 센

@KevinCruijssen 감사합니다, 좋은 지적입니다!
Nick Kennedy

2

05AB1E , 18 17 바이트

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

@NickKennedy 의 Jelly 답변 에서 영감을 얻었으므로 그를 찬성 해야합니다!

색인 대신 목록 자체를 출력합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

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