이 나무들은 동형인가?


21

소개

이 도전에서, 당신의 임무는 주어진 두 나무가 동형인지 여부를 결정하는 프로그램을 작성하는 것입니다. 트리는 루트를 제외한 모든 노드에 정확히 하나의 나가는 모서리가있는 유향 비순환 그래프를 의미합니다. 노드의 이름을 바꾸어 하나의 트리를 다른 트리로 변형 할 수있는 경우 두 트리는 동형입니다. 예를 들어, 두 개의 나무 (모든 모서리가 위로 향하는 곳)

  0       0
 /|\     /|\
1 3 4   1 2 5
|\       /|
2 5     3 4

쉽게 동형 인 것으로 보인다.

L다음과 같은 방법으로 트리를 음이 아닌 정수 목록으로 인코딩합니다 . 나무의 뿌리에는 라벨이 있습니다0 이 있으며 노드도 있습니다 1,2,...,length(L). 각 노드 i > 0에는 발신 L[i]기반이 있습니다 (1 기반 색인 사용). 예를 들어, 목록 (요소 아래에 색인이 있음)

[0,0,1,3,2,2,5,0]
 1 2 3 4 5 6 7 8

나무를 인코딩

  0
 /|\
1 2 8
| |\
3 5 6
| |
4 7

입력

입력은 기본 형식 또는 언어로 제공되는 음이 아닌 정수의 두 목록입니다. 위에서 지정한 방식으로 두 개의 트리를 인코딩합니다. 그들에 대해 다음과 같은 조건을 가정 할 수 있습니다.

  1. 그들은 비어 있지 않습니다.
  2. 그들은 같은 길이를 가지고 있습니다.
  3. 각 목록 은 모든 (1 기반) 지수를 L충족시킵니다 .L[i] < ii

산출

나무가 동형 인 경우 산출물은 진실한 값이되고 그렇지 않으면 거짓 값이됩니다.

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점은 허용되지 않습니다. 시간 제한은 없지만 트리 또는 그래프 동형을 결정하는 기본 제공 기능은 허용되지 않습니다.

테스트 사례

진실한 사례

[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]

거짓 인스턴스

[0,0] [0,1]
[0,1,2,0,3,3,4] [0,1,2,3,0,4,3]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,5,2,1]
[0,1,1,0,1,3,2,1,5] [0,1,0,3,3,3,2,5,2]
[0,1,2,3,1,2,3,0,8] [0,1,0,1,4,4,5,6,6]
[0,1,0,2,0,3,0,4,0,5] [0,0,2,1,0,3,4,0,0,9]


@DigitalTrauma Dangit, 당신은 OP 허용 내장을 만들었습니다 ... 60 바이트 Mma 솔루션을 가졌습니다 ...
LegionMammal978

답변:


2

매스 매 티카, 48 바이트

SameQ@@(Sort//@(0(0//.PositionIndex@#))&/@{##})&

다음을 사용하는 솔루션보다 짧습니다 IsomorphicGraphQ.

IsomorphicGraphQ@@(Graph@*MapIndexed[#->Tr@#2&]/@{##})&

6

파이썬, 83

두 번째 줄의 익명 기능은 내 솔루션입니다.

f=lambda l,i=0:sorted(f(l,j+1)for j,e in enumerate(l)if e==i)
lambda a,b:f(a)==f(b)

f정규화 된 하위의 정렬 된 목록 인 정규화 된 하위 트리 형식을 리턴합니다. 그런 다음 각 트리의 표준 형식이 동일한 지 간단히 확인해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.