首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的4音符音乐盒能播放那首歌吗?

我的4音符音乐盒能播放那首歌吗?
EN

Code Golf用户
提问于 2016-01-26 18:36:21
回答 7查看 4.5K关注 0票数 51

我有一个曲柄操作的音乐盒,可以播放四个音符.当我转动曲柄时,它会拔出四根弦中的一根,这取决于曲柄的位置和转弯的方向。当曲柄向北转时,盒子(其字符串编号为1至4)如下所示:

代码语言:javascript
复制
1  |  2
   |
   O   

4     3

在那里,我可以顺时针转动曲柄,拔下#2弦,并把曲柄指向东边:

代码语言:javascript
复制
1     2

   O---   

4     3

或者,我也可以从北逆时针转动曲柄,演奏#1弦,并以曲柄指向西结束:

代码语言:javascript
复制
1     2

---O   

4     3

在任何给定的时间,盒子都可以播放两个音符中的一个:顺时针方向的下一个音符或逆时针方向的下一个音符。

挑战

您面临的挑战是编写一个程序或函数,该程序或函数接受一个非空的音符字符串(即数字1通过4),并确定是否可以在音乐框上播放该音符序列。产生真实或虚假的结果来指示输入的可玩性或不可玩性.

一些注意事项:

  • 输入对初始启动位置不作任何假设。输入214 (从东方开始,严格逆时针方向移动)和234 (从北开始,严格顺时针方向移动)都是有效的。
  • 曲柄可以在每个音符之后向任意方向自由移动。通过在一个字符串之间来回移动,一系列相同的注释(例如,33333)是可能的。1221441系列是完全可玩的(从西开始,顺时针移动两个步骤,然后逆时针移动三个步骤,然后顺时针移动两个步骤)。

样品

一些true案例:

代码语言:javascript
复制
1
1234
1221
3333
143332
22234
2234
22214
1221441
41233

一些false案例:

代码语言:javascript
复制
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  
EN

回答 7

Code Golf用户

发布于 2016-01-27 02:53:57

Retina,50字节

代码语言:javascript
复制
A`13|31|24|42|(.)(?!\1)(.)(\2\2)*(\1|\2(?!\1|\2).)

我觉得这样行吗?

在这里试试。

票数 7
EN

Code Golf用户

发布于 2016-01-26 20:49:42

Pyth,43岁,

代码语言:javascript
复制
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。

票数 5
EN

Code Golf用户

发布于 2016-01-27 01:57:31

JavaScript (ES6),80字节

代码语言:javascript
复制
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

解释

i%4是当前的曲柄位置:

代码语言:javascript
复制
    1 (i%4 == 1) 2   

(i%4 == 0) (i%4 == 2)

    4 (i%4 == 3) 3   

索引和注释

代码语言:javascript
复制
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 result

测试

代码语言:javascript
复制
var 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
代码语言:javascript
复制
<input type="text" value="1221441" oninput="result.textContent=solution(this.value)" />
<pre id="result"></pre>
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/70221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档