冯·科赫猜想


10

您可能认识到数学家冯·科赫(von Koch)的著名雪花。但是,他有更多有趣的计算机科学问题要解决。的确,让我们看一下这个猜想:

给定具有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's

@LeakyNun 17个节点后已经很难蛮力了^^

@WheatWizard这与von Koch猜想绝对不同,因为在此线程中您可以跳过整数。推测的全部要点是使标记成为可能而不会跳过

Answers:


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

Ruby,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一旦找到第一个函数,它将停止该功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.