我有一个曲柄操作的音乐盒,可以播放四个音符.当我转动曲柄时,它会拔出四根弦中的一根,这取决于曲柄的位置和转弯的方向。当曲柄向北转时,盒子(其字符串编号为1至4)如下所示:
1 | 2
|
O
4 3在那里,我可以顺时针转动曲柄,拔下#2弦,并把曲柄指向东边:
1 2
O---
4 3或者,我也可以从北逆时针转动曲柄,演奏#1弦,并以曲柄指向西结束:
1 2
---O
4 3在任何给定的时间,盒子都可以播放两个音符中的一个:顺时针方向的下一个音符或逆时针方向的下一个音符。
您面临的挑战是编写一个程序或函数,该程序或函数接受一个非空的音符字符串(即数字1通过4),并确定是否可以在音乐框上播放该音符序列。产生真实或虚假的结果来指示输入的可玩性或不可玩性.
一些注意事项:
214 (从东方开始,严格逆时针方向移动)和234 (从北开始,严格顺时针方向移动)都是有效的。33333)是可能的。1221441系列是完全可玩的(从西开始,顺时针移动两个步骤,然后逆时针移动三个步骤,然后顺时针移动两个步骤)。一些true案例:
1
1234
1221
3333
143332
22234
2234
22214
1221441
41233一些false案例:
13 (note 3 is never available after note 1)
1224 (after `122`, the crank must be north, so 4 is not playable)
121 (after `12` the crank is east; 1 is not playable)
12221 (as above, after `1222` the crank is east)
43221 发布于 2016-01-27 02:53:57
A`13|31|24|42|(.)(?!\1)(.)(\2\2)*(\1|\2(?!\1|\2).)我觉得这样行吗?
在这里试试。
发布于 2016-01-26 20:49:42
Km-R2sMdc`M%R4-VJjQTtJ`0|Fm!s-VKdCm_B^_1dlK测试套房
这可能是非常的高尔夫传说,也不是最佳的高尔夫算法(我预计枚举所有的路径将更短?)不管怎么说,如果你发现算法有任何错误,请告诉我,我认为它应该有效,但我以前犯过错误!
我将使用1221的示例输入来解释我的算法。这个程序首先将数字映射到他们的后继者,如:[[1,2],[2,2],[2,1]]。然后得到它们的差异mod 4 (Pyth得到的结果与%的正确参数的符号相匹配,因此这始终是正的):[3,0,1]。然后在0上分割结果,并从每个结果中减去2:[[1],[-1]]。
现在设置完成了,我们创建了一个[-1,1,-1...]列表及其否定的[1,-1,...],这两个列表的长度都与以前的结果数组相同。然后,对于这些列表中的每一个,在列表的元素和前面步骤中生成的列表之间执行分离减法。然后,如果结果中的任何一个只包含空列表,则输出true。
发布于 2016-01-27 01:57:31
s=>[r=0,1,2,3].map(i=>[...s].map(n=>n-1-i%4?n%4-i%4?v=0:i+=3:i++,v=1)|v?r=1:0)|ri%4是当前的曲柄位置:
1 (i%4 == 1) 2
(i%4 == 0) (i%4 == 2)
4 (i%4 == 3) 3 s=>
[r=0,1,2,3].map(i=> // i = crank position, test for i starting at 0 to 3, r = result
[...s].map(n=> // for each note n
n-1-i%4? // if n is not at the position after i
n%4-i%4? // if n is not at the position before i
v=0 // set the result of this test to invalid
:i+=3 // else i-- (+3 used because i%4 would break for negative values)
:i++, // else i++
v=1 // v = result of test, initialise to 1 (valid)
)
|v?r=1:0 // if the test returned true, set the result to true
)
|r // return the resultvar solution = s=>[r=0,1,2,3].map(i=>[...s].map(n=>n-1-i%4?n%4-i%4?v=0:i+=3:i++,v=1)|v?r=1:0)|r<input type="text" value="1221441" oninput="result.textContent=solution(this.value)" />
<pre id="result"></pre>https://codegolf.stackexchange.com/questions/70221
复制相似问题