我们都知道,很多运动只影响你身体的一半,所以你必须做两次,每一边一次。这样的练习有两个对口,一个在左边,一个在右边。但是,只要双方的演习顺序一致,就没有必要连续执行两个对应方。在你的锻炼计划中,你也可以在两边之间切换,但是从一边开始一些运动,和另一边开始一些运动是没有意义的。
练习部分是一个非零整数的列表,它的下半部分由被否定的前半个整数和相同顺序的整数组成,每半个整数的符号相等。运动的前半部分的标志是它的主导面。
练习集为零或多个运动部件,与相同的前导侧串联在一起。
给定一个非零整数的列表作为输入,确定它是否是一个练习集.整数不一定是唯一的。列表的长度不一定相等。
您的解决方案可能不使用任何标准漏洞。输出可以使用任意两个不同的一致值。这是密码-高尔夫,所以最短的解决方案获胜。
[-5, -1, -7, -6, -5, 5, 1, 7, 6, 5]是练习部分的一个例子。前半部分是[-5, -1, -7, -6, -5],后半部分是[5, 1, 7, 6, 5],它是前半部分中的每个整数。另外,前半部分的整数都是相同的符号。这个练习部分的主导部分是-1。
[3, 6, 5, -3, -6, -5, 1, 6, 4, 3, -1, -6, -4, -3]是练习集的一个例子。它单独的运动部分是[3, 6, 5, -3, -6, -5]和[1, 6, 4, 3, -1, -6, -4, -3],它们都有领先的1。
尽管[4, -4, -5, 5]只是由有效的运动部分组成,但它并不是一个练习集,因为第一部分,[4, -4],有领先的1,而第二部分,[-5, 5],有领先的side -1。
有效测试用例:
[]
[1, -1]
[1, -1, 1, -1]
[-6, 6, -5, -4, -3, 5, 4, 3]
[-1, -5, -8, 1, 5, 8, -7, -6, -5, -3, 7, 6, 5, 3]
[-1, -5, -8, 1, 5, 8, -1, 1]无效测试用例:
[1]
[1, -2]
[1, 2, -3, -1, -2, 3]
[1, 2, 3, -3, -1, -2]
[-1, -5, -8, 1, 5, 8, 7, 6, 5, 3, -7, -6, -5, -3]
[1, 2, 3, 5, 1, 2, 3, 5]
[1, 2, -5, 4, -6, 5, 5, -6]
[1, 2, -1, 3, -2, -3]
[1, -2, 1]
[-1, -1, 1]
[1, -1, 1]发布于 2018-05-24 14:00:58
优化版本,灵感来自丹尼斯的Python回答。
返回0或1。
a=>a.map(b=p=x=>b[+(x<0)]+=[x*x,p*(p=x)>0])|b[1]==b[0]a=>a.map(x=>b[i^=p*(p=x)<0&&-~(b[i]+=0)]+=[,x*x],b=[p=0,i=0])|b[1]+0==b[0]我们将所有运动部件的前半部分存储在b0中,另一半存储在b1中,当符号发生变化时,在b0和b1之间切换。条目被平方以去掉标志。我们以逗号作为每个条目的前缀,以0作为后缀。
这里有一些额外的逻辑来处理“空输入”边缘情况,基本上是免费的(请参阅源代码末尾的注释)。
a => // given the input array a[]
a.map(x => // for each x in a[]:
b[i ^= // access b[i]:
p * (p = x) // we keep track of the previous entry in p
< 0 && // if p and x have opposite signs:
-~(b[i] += 0) // append a '0' to b[i] and update i: 0 -> 1, 1 -> 0
] += [, x * x], // append a comma followed by x² to b[i]
b = [p = 0, i = 0] // start with p = 0, i = 0 and b = [0, 0]
) | // end of map()
b[1] + 0 // this will append a '0' to b[1] if it was turned into a string
// or let it unchanged if it's still equal to zero (integer),
// which handles the 'empty input' edge case
== b[0] // compare the result with b[0]https://codegolf.stackexchange.com/questions/165364
复制相似问题