단어 그래프의 지름 ​​찾기


13

소개

인기있는 단어 퍼즐은 한 글자 만 바꾸고 항상 유효한 단어를 만드는 일련의 단계를 통해 한 단어를 다른 단어로 변환하는 것입니다. 예를 들어 BAG는 5 단계 경로를 통해 DOG로 변환 될 수 있습니다.

가방-> 박쥐-> 고양이-> 침대-> COG-> 강아지

이 경우 더 짧은 경로도 존재합니다. 예를 들면 다음과 같습니다.

가방-> BOG-> 강아지

하나의 문자로 다른 단어 쌍 사이에 모서리가있는 꼭지점이 단어로 레이블 된 그래프를 그린 경우 "BAG"에서 "DOG"까지의 최단 경로는 두 개의 모서리로 구성됩니다.

도전

경로를 따라 단계로 나타날 수있는 모든 허용 가능한 단어를 나타내는 모두 같은 길이를 가진 단어의 "사전"을 입력으로받는 프로그램을 작성해야합니다. 적어도 하나의 "가장 짧은 최단 경로", 즉 두 단어 사이의 경로를 출력해야합니다.

  • 그 두 단어 사이의 다른 길보다 더 이상;

  • 목록에있는 다른 단어 쌍 사이에 가능한 가장 짧은 경로 인 한.

전술 한 그래프의 맥락에서, 그러한 경로의 길이 는 그래프 의 직경 이다.

입력 단어 중 어느 것도 다른 단어로 변환 될 수없는 축퇴 된 경우, 길이 0의 적어도 하나의 경로, 즉 단일 단어를 출력한다.

  • "[bag", "bat", "cat", "cot", "dot", "dog"] 입력은 "에서 가장 짧은 경로이므로"6 개의 단어를 순서대로 (또는 역순으로) 순회하는 경로를 생성해야합니다. 이 사전 내에서 bag "에서"dog "까지는 가장 긴 5 단계입니다.

  • 입력 [ "bag", "bat", "bot", "cat", "cot", "dot", "dog"]은 "bag, bat, bot, dot, dog"및 / 또는 그 경로를 산출해야합니다. 반전.

  • 입력 [ "code", "golf", "male", "buzz", "mole", "role", "mold", "cold", "gold", "mode"]는 "code"사이의 경로를 생성해야합니다. 그리고 "골프".

  • 입력 [ "1", "two", "six", "ten"]은 모서리가없는 그래프에 해당하므로 하나 이상의 단일 단어 (길이 0) 경로를 출력합니다.

  • 입력에 길이가 다른 두 단어가 포함 된 경우 출력이 정의되지 않습니다.

규칙

  • 표준 코드 골프 규칙이 적용됩니다
  • 여러 개의 "가장 짧은"경로가 있습니다. 최소한 하나를 출력해야하지만 원하는만큼 자유롭게 출력 할 수 있습니다.
  • 입력 사전이 프로그램으로 전달되는 방법을 자유롭게 결정할 수 있습니다.
  • 바이트 단위의 최단 코드가 이깁니다.

3
몇 가지 테스트 사례를 더 추가 하시겠습니까?
요나

끝난. 그래프에 모서리가없는 경우에 대한 설명도 추가되었습니다.
jnfnt 2016 년


빈 입력을 받아 들여야합니까 (답은 []또는 [[]])?
Outgolfer Erik

빈 입력에서 동작이 정의되지 않은 것을 기쁘게 생각합니다.
jnfnt 2016 년

답변:



3

APL (Dyalog Classic) , 84 80 77 76 74 66 61 바이트

{⍵⌷⍨{⍵,⍨⊃⍋(1a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/⊃⍸a=d←⌈/512|,a←⌊.+⍨⍣≡9*⍨2⌊⍵+.≠⍉⍵}

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

입력과 출력은 문자 행렬입니다

⍵+.≠⍉⍵ 단어 사이의 해밍과 같은 거리의 행렬

9*⍨2⌊0과 1을 그대로두고 2+를 큰 숫자로 바꾸십시오 (512 = 2 9 , "∞"로 사용됨)

⌊.+⍨⍣≡ floyd & warshall 의 최단 경로 알고리즘

  • ⌊.+행렬 곱셈을 사용하지만 등 min( )과 +대신 +×각각

  • 왼쪽과 오른쪽에 같은 행렬을 사용하십시오

  • ⍣≡ 수렴까지 반복

d←⌈/512|, 가장 긴 ( "∞"아님) 경로의 길이 d

⊃⍸a=어느 두 노드가 연결 합니까 , ij 라고합시다

{⍵,⍨⊃⍋(1≠a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/ 경로를 재구성하다

  • { }⍣d/{ }기능 d시간을 평가하십시오 . 왼쪽 인수 는 항상 i 입니다. 오른쪽 arg j로 시작 하여 점차 경로의 내부 노드를 누적합니다.

  • (1≠a⌷⍨⊃⍵),⍪⍺⌷a 이 두 벡터로 구성된 2 열 행렬을 만듭니다.

    • 1≠a⌷⍨⊃⍵ 부울 (0 또는 1)은 어느 노드가 1에서 첫 번째까지 거리에 있는지를 나타냅니다.

    • ⍺⌷a 모든 그래프 노드와의 거리

  • ⊃⍋ 사 전적으로 가장 작은 행의 색인

  • ⍵,⍨ 앞에 붙이다

⍵⌷⍨ 경로로 원래 단어를 색인


2

파이썬 3 , 225 바이트

from itertools import*
def f(a):b=[((p[0],p[-1]),(len(p),p))for i in range(len(a))for p in permutations(a,i+1)if all(sum(q!=r for q,r in zip(*x))<2for x in zip(p,p[1:]))];return max(min(r for q,r in b if x==q)for x,y in b)[1]

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

기본적으로 가능한 모든 경로를 선택하고 유효한 경로 만 유지 한 다음 각 시작-끝 조합을 통해 최소 경로 거리를 찾아 최대 값을 찾으십시오.



1

자바 스크립트 (ES6),  195  194 바이트

를 반환 [optimal_length, [optimal_path]]합니다.

f=(a,p=[],w=o=[],l=0)=>Object.values(o,o[k=[w,p[0]]]=(o[k]||0)[0]<l?o[k]:[l,p],a.map((v,i)=>w+w&&[...v].map((c,i)=>s-=c!=w[i],s=1)|s||f(a.filter(_=>i--),[...p,v],v,l+1))).sort(([a],[b])=>b-a)[0]

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

어떻게?

fow0w1[l,p]pw0w1l

plwpo

o[k = [w, p[0]]] = (o[k] || 0)[0] < l ? o[k] : [l, p]

o

Object.values(o).sort(([a], [b]) => b - a)[0]

(이 코드는 각 재귀 수준에서 실행되지만 루트 수준 만 중요합니다)

vw

[...v].map((c, i) => s -= c != w[i], s = 1) | s

v

f(                    //
  a.filter(_ => i--), // remove the i-th word from a[]
  [...p, v],          // append v to p[]
  v,                  // pass v as the last word
  l + 1               // increment the length of the path
)                     //


0

파이썬 3, 228 바이트

def G(w):
    D={A+B:[A,B]if sum(a!=b for a,b in zip(A,B))<2else[0,0]*len(w)for A in w for B in w}
    for k in w:
        for i in w:
            for j in w:
                p=D[i+k]+D[k+j][1:]
                if len(p)<len(D[i+j]):D[i+j]=p
    return max(D.values(),key=len)

모든 쌍의 최단 경로에 대해 Floyd-Warshall 알고리즘을 구현 한 다음 찾은 경로를 최대한 활용합니다.

이 구현에서 16 개의 문자는 불행히도 탭입니다.


2
입사 모서리가없는 정점이 존재하는 경우이 오류가 발생합니다 (예 : "print G ([ 'bag', 'bat', 'cot'])"
jnfnt

파이썬 들여 쓰기를위한 골프 팁 : 첫 번째 레벨을위한 공간, 두 번째 탭을위한 공간, 세 번째 탭을위한 공간 및 네 번째를위한 두 개의 탭 등을 사용하십시오.
Peter Taylor

1
@PeterTaylor 좋은 팁이지만 Python 2에서만 작동합니다. Python 3에서는 탭을 공백과 혼합 할 수 없습니다.
OOBalance 2016 년

1
아, 잘 잡아라 @jnfnt. 이제 생각해 보니 그래프가 연결된 경우에만 작동합니다.
rikhavshah 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.