在此挑战中,您的任务是像这样分析给定的“火柴方程”。
...并通过重新排列匹配项来找出是否可以将其转换为有效方程。如果这样,您将输出最少的移动次数以及由此产生的方程式。
输入值
输入是一个字符串,可以从STDIN读取,可以作为函数参数,甚至可以存储在文件中。它是代表火柴棍排列的方程式,可以使用以下EBNF进行描述:
input = term, "=", term ;
term = number | (term, ("+" | "-"), term) ;
number = "0" | (numeralExceptZero , {numeral}) ;
numeralExceptZero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
numeral = "0" | numeralExceptZero ;
有效输入的示例为3+6-201=0+0+8
。
任务
考虑下图,其中每个火柴杆都分配了一个数字:
现在,我们将每个输入符号映射到相应的火柴棍位置,如下所示:
0 ↦ 1,2,3,4,5,6
1 ↦ 4,5
2 ↦ 2,3,5,6,8
3 ↦ 3,4,5,6,8
4 ↦ 1,4,5,8
5 ↦ 1,3,4,6,8
6 ↦ 1,2,3,4,6,8
7 ↦ 4,5,6
8 ↦ 1,2,3,4,5,6,8
9 ↦ 1,3,4,5,6,8
- ↦ 8
+ ↦ 8,10
= ↦ 7,9
每个输入公式都可以变成火柴棍排列。例如,等式“ 45 + 6 = 92”变为
未使用的火柴杆显示为灰色的地方。您的任务是找出必须重新排列以使方程有效的最少数量的火柴。
输出量
我们区分三种可能的情况:
- 如果输入无效(即不满足上述EBNF),则输出所需的任何内容。
- 否则,如果有办法通过重新排列火柴棍把方程变成一个有效的,你必须输出两个重排的最小数量和相应的方程。正如输入一样,输出方程也必须满足给定的EBNF。在上面的示例中,正确的输出为
1
和46+6=52
。如果所得方程式有多种可能性,请输出其中任何一种。 - 否则(因此,如果输入有效,但无法使方程式成立),则必须输出
-1
。
细节
- 您无权删除或添加匹配项。这意味着,如果输入由
n
火柴棍构建,则输出也必须完全由n
火柴棍组成。 - “空”火柴棍块仅允许在方程式的结尾和开头,而不能在中间。因此,例如,把
7-1=6
成7 =6-1
通过简单地移除-1
从左侧和增加它的右侧只有3火柴重排是不允许的。 由于我并没有真正看到从数字到火柴棍位置的映射是此挑战的有趣部分,因此,加上20个字节,您可以
- 访问
(number/operation ↦ matchstick positions)
以任何合理方式存储映射的文件,或者 - 如果您的编程语言支持
Map
数据类型,请假定您有权访问使用(number/operation ↦ matchstick positions)
-mapping预先初始化的映射。例如,此地图可能如下所示:{(0,{1,2,3,4,5,6}),(1,{4,5}),(2,{2,3,5,6,8}),(3,{3,4,5,6,8}), ..., (-,{8}),(+,{8,10}),(=,{7,9})}
- 访问
例子
输入: 1+1=3
↦ 输出: 1
和1+1=2
输入: 15+6=21
↦ 输出: 0
和15+6=21
输入: 1=7
↦ 输出: -1
输入: 950-250=750
↦ 输出: 2
和990-240=750
输入: 1-2=9
↦ 输出: 1
和1+2=3
输入: 20 + 3=04
↦ 输出:任何
优胜者
这是代码高尔夫球,因此最短的正确答案(以字节为单位)获胜。在第一个正确答案发布后的一周内,将选择获奖者。
=
(2个火柴)和-
(1个火柴)的位置并将所有数字保留在原来的位置。但是,如果必须向左移动2,则还必须计算所需的移动。
1+1+2=3-6+10
吗?关于输出的同样问题。
0: 1, 2, 3, 4, 5, 6
以保持一致性