数字时钟比赛拼图


10

有很多带有匹配项的难题,包括添加,删除或移动一定数量的匹配项以创建新的数字或形状。就像使用数字时钟一样。

给定12小时数字时钟上的有效时间,请输出需要移动最少行的数字,以使时钟上的每个可见数字都变为该数字。如果最小位数多于一位,则全部输出。如果不可能使每个数字都相同,则输出-1或输出非0的虚假值(您会得到很多)。

时钟数字如下所示:

  |
  |
 _
 _|
|_
 _
 _|
 _|

|_|
  |
 _
|_
 _|
 _
|_
|_|
 _
  |
  |    
 _ 
|_|
|_|
 _
|_|
 _|
 _
| |
|_|

测试用例:

输入: 123

时钟显示:

       _   _
  | :  _|  _|
  | : |_   _|

输出: 4

说明:的显示1:23要求总共绘制12条线。因此,对于每个数字都相同,每个数字必须具有4行。仅有4行的数字是4。因此,答案必须是4

输入: 1212

时钟显示:

     _        _
  |  _| :  |  _|
  | |_  :  | |_

输出: -1

说明:的显示12:12需要14行。14除以4不是整数,因此不可能每个数字都相同。

输入: 654

时钟显示:

 _     _  
|_  : |_  |_|
|_| :  _|   |

输出: 5

说明:总行数为15。15除以3为5,因此每个数字必须有5行。有5条线中仅有的数字是235。答案是5因为只需要移动2就可以使每个数字5。只需将6的左下方的行移动到4的底部,那么您将:

 _     _  
|_  : |_  |_|
 _| :  _|  _|

然后,正如您所看到的,您所要做的就是将原来是4的数字的右上方的行移到顶部,您将得到5:55。要使每个数字为a 2或a ,3将需要2个以上的动作。

输入: 609

时钟显示:

 _     _   _
|_  : | | |_|
|_| : |_|  _|

输出:6096,0,9或者[6,0,9]也行)。

说明:609是仅有的6行数字。因此,它们也是唯一可能的解决方案。不难看出,要使其中任何一个成为唯一的数字,都需要两个步骤。因此,您输出所有三个数字。

笔记:

  • 尽管输入时间必须有效,但输出时间无效(例如999,由于输出正常)。
  • 我对输入非常灵活。您可以要求前导0。可以使用带小数点的数字。您可以使用字符串。您可以使用数组。您可以为每个数字设置一个参数。

Answers:


1

利亚,160 157 154

x->(c=count_ones;l=[119;36;93;109;46;107;123;37;127;111];m=l[x+1];n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);find(n.==minimum(n).!=1/0)-1)

这是一个lambda函数。将其分配给变量以调用它。接受0-9任意长度范围内的整数向量,并返回结果向量(可能为空)。

测试用例

julia> clock = x->(c=co...        # assign function to variable
(anonymous function)

julia> clock([1 2 3])
1-element Array{Int64,1}:
 4

julia> clock([1 2 1 2])
0-element Array{Int64,1}

julia> clock([6 5 4])
1-element Array{Int64,1}:
 5

clock([6 0 9])
3-element Array{Int64,1}:
 0
 6
 9

说明

枚举这七个段,并将它们表示为位向量。

+---+                     +-0-+
|   |      Enumerate      1   2
+---+   >  the seven  >   +-3-+
|   |      segments       4   5
+---+                     +-6-+

示例:( 1启用了段2 + 5)变为36(位2 + 5置位)。
这是数字的表示形式0-9

l=[119;36;93;109;46;107;123;37;127;111];
m=l[x+1];

我们可以使用数字作为索引来获取位向量表示。+1由于julia中基于1的索引。

该函数c=count_ones;计算整数中的1位数目。我们分配别名是因为我们更需要它。

完整的程序,有些不实用:

x->(
  c=count_ones;
  l=[119;36;93;109;46;107;123;37;127;111];
  m=l[x+1];
  n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);
  find(n.==minimum(n).!=1/0)-1
)

现在,最后两行详细介绍:

mean(map(c,m)) 计算每个输入数字的平均行数。

n=map(a->...,l) 循环显示所有数字的向量表示。

如果当前数字的行数a不等于输入的平均行数,请返回inf

c(a)==mean(map(c,m))?...:1/0

如果不是,请返回当前数字与所有输入数字之间的汉明距离之和。

sum(map(b->c(a$b),m))

现在,我们有了一个表示数字n的长度向量,它使我们能够执行将所有输入数字转换为该数字所需要执行的添加/删除操作的总数,或者,如果不改变行数就不可能进行这种转换。100-9inf

find(n.==minimum(n).!=1/0)-1

最后,输出不是的所有最小值的位置(从0开始)inf

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.