폰 코흐 추측


10

그의 유명한 눈송이로 수학자 폰 코흐를 알게 될 것입니다. 그러나 그는 자신의 소매에 더 흥미로운 컴퓨터 과학 문제가 있습니다. 실제로이 추측을 살펴 보겠습니다.

n노드가 있는 나무가 있습니다 (따라서 n-1가장자리). 에서 노드를 열거하는 방법을 찾기 1n하고, 이에 따라,의 가장자리 1n-1같은 방식으로, 즉 각 에지 k의 노드 수의 차이가 같음 k. 추측은 이것이 항상 가능하다는 것입니다.

다음은 완벽하게 명확하게하는 예입니다.

여기에 이미지 설명을 입력하십시오

당신의 임무

코드는 트리를 입력으로 사용하고 원하는 형식을 취할 수 있지만 테스트 사례의 경우 호와 노드 목록으로 트리를 제공합니다.

예를 들어 이것은 그림에서 트리의 입력입니다.

[a,b,c,d,e,f,g]
d -> a
a -> b
a -> g
b -> c
b -> e
e -> f

코드는 노드와 가장자리가 번호가 지정된 트리를 반환해야합니다. 더 많은 그래픽 출력을 반환 할 수는 있지만 테스트 사례에 이러한 종류의 출력을 제공합니다.

[a7,b3,c6,d1,e5,f4,g2]
d -> a 6
a -> b 4
a -> g 5
b -> c 3
b -> e 2
e -> f 1

테스트 사례

[a,b,c,d,e,f,g]             [a7,b3,c6,d1,e5,f4,g2]
d -> a                      d -> a 6
a -> b                      a -> b 4
a -> g             =>       a -> g 5
b -> c                      b -> c 3
b -> e                      b -> e 2
e -> f                      e -> f 1


[a,b,c,d]                   [a4,b1,c3,d2]
a -> b                      a -> b 3
b -> c            =>        b -> c 2
b -> d                      b -> d 1


[a,b,c,d,e]                [a2,b3,c1,d4,e5]
a -> b                      a -> b 1
b -> c                      b -> c 2
c -> d             =>       c -> d 3
c -> e                      c -> e 4

이것은 바이트 단위의 가장 짧은 대답이 !

참고 : 이것은 모든 나무가 우아한 라벨을 가지고 있음을 나타내는 Ringel-Kotzig 추측 보다 강력 합니다 . Koch 추측에서는 Ringel-Kotzig 추측의 우아한 표시와 달리 레이블의 정수를 건너 뛸 수 없습니다. 여기 전에 우아한 라벨링이 요청되었습니다 .


26 개 이상의 노드가 있습니까?
Leaky Nun

@LeakyNun 17 노드 이후에는 이미 무차별 대입하기 어렵다 ^^

@WheatWizard이 스레드에서 정수를 건너 뛸 수 있기 때문에 폰 코흐 추측과 완전히 다릅니다. 추측의 요점은 건너 뛰지 않고 라벨링을 가능하게하는 것입니다

답변:


3

젤리 , 30 바이트

JŒ!³,$€
ǵy⁴VIAµ€Q⁼$€TðḢịø³JŒ!

온라인으로 사용해보십시오! ( GṄ³çG출력을 더 예쁘게 만들려면 바닥 글로 사용하십시오 .)

abcdef와 유사한 입력, 예.[d,a],[a,b],[a,g],[b,c],[b,e],[e,f]

예를 들어 a,b,c,d,e,f순서대로 목록을 출력합니다 .

참고 : 내 프로그램은 모두 유효한 몇 가지 가능성이 있기 때문에 테스트 사례와 다른 값을 생성합니다.

설명

JŒ!³,$€                - helper function, generates all possible numberings, input is e.g. 'abcd'
J                      - range(len(input)). e.g. [1,2,3,4]
 Œ!                    - all permutations of the range.
   ³,$                 - pair the input with ... 
      €                - each permutation. Sample element e.g. ['abcd',[3,1,2,4]]

ǵy⁴VIAµ€Q⁼$€TðḢịø³JŒ! - main dyadic link, input is e.g. 'abcd' and '[a,b],[b,c],[b,d]'
 µy                    - use a numbering as an element-wise mapping e.g. 'abcd'->[3,1,2,4]
   ⁴                   - apply this to the list of edges. e.g. '[3,1],[1,2],[1,4]'
    V                  - turn this into an internal list.
     IAµ€              - find absolute difference on each edge
         Q⁼            - Is this invariant under deduplication? Returns 1 if the numbering is valid; 0 otherwise.
Ç          $€          - apply this to all possible numberings
             Tð        - return the indices of all valid numberings
               Ḣ       - choose the first one and
                ị      - get the element corresponding to its index in 
                 ø³JŒ! - all possible numberings 

가능한 모든 솔루션을 표시하여 1 바이트를 절약하십시오.

JŒ!³,$€
ǵy⁴VIAµ€Q⁼$€Tðịø³JŒ!

온라인으로 사용해보십시오! ( GṄ³çG⁷³G출력을 더 예쁘게 만들기 위해 바닥 글로 사용)

변환기 를 사용 하여 테스트 케이스를 입력 목록에 복사하여 붙여 넣기하십시오.


1

루비, 108 바이트

lamba 함수는 모서리를 포함하는 2 요소 배열의 배열을 허용합니다 (각 모서리는 관련 메모에 해당하는 한 쌍의 숫자로 표시됨).

->a{[*1..1+n=a.size].permutation.map{|i|k=a.map{|j|(i[j[0]-1]-i[j[1]-1]).abs}
(k&k).size==n&&(return[i,k])}}

테스트 프로그램에서 언 골프

f=->a{                                    #Accept an array of n tuples (where n is the number of EDGES in this case)
  [*1..1+n=a.size].permutation.map{|i|    #Generate a range 1..n+1 to label the nodes, convert to array, make an array of all permutations and iterate through it.
    k=a.map{|j|(i[j[0]-1]-i[j[1]-1]).abs} #Iterate through a, build an array k of differences between nodes per current permutation, as a trial edge labelling.
    (k&k).size==n&&(return[i,k])          #Intersect k with itself to remove duplicates. If all elements are unique the size will still equal n so
  }                                       #return a 2 element array [list of nodes, list of edges]
}

p f[[[4,1],[1,2],[1,7],[2,3],[2,5],[5,6]]]

p f[[[1,2],[2,3],[2,4]]]

p f[[[1,2],[2,3],[3,4],[2,5]]]

산출

출력은 다음을 포함하는 2 요소 배열입니다.

새로운 노드 번호

가장자리 번호 매기기.

예를 들어, 첫 번째 예의 첫 번째 모서리 [4,1]는 새 노드 번호 매기기에서 노드 6과 1 사이에 있으므로 모서리 6-1 = 5입니다.

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

실제로 각 테스트 사례마다 여러 개의 솔루션이 있습니다. 은 return첫번째가 발견되면 기능을 정지한다.

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