您可以循环播放而不会崩溃吗?


14

我们很多人都熟悉Tron游戏。您可以控制放置在网格上的“ lightcycle”。灯光周期总是向前移动(尽管您可以控制方向),并在其后面留下永久的痕迹。如果碰到一条小路,就会崩溃!

此处的目标是确定给定路径是否为有效循环,也就是说,它返回到其起始点而不会“崩溃”。为此,我们假设我们从这一点开始(0,0)。输入形式为N2E1S2W1,具有一系列基本方向(Nis northEis east,依此类推),每个方向后跟移动该方向的距离。在此示例中,您将旅行

N2 : North 2 to (0,2)
E1 : East 1  to (1,2)
S2 : South 2 to (1,0)
W1 : West 1  to (0,0)

如果一条路径在(0,0)不重复访问任何其他坐标的情况下结束,则该路径被认为是有效的(它(0,0)精确地访问了两次,一次在起点,一次在终点)。请记住,与上例相比,从(0,0)(0,2),我们也必须访问(0,1)

其他例子:

input        -> output
N1E1S1W1     -> true
N1E1N1E1S2W2 -> true
N1S1E1W1     -> false     // Visits (0,0) 3 times
N4E2S2W4S2E2 -> false     // Visits (0,2) twice
N3E2S3       -> false     // Does not return to (0,0)
N1S1         -> anything  //I don't care how you evaluate this case

您的输出可以是任何形式,只要它为任何真实或错误值提供相同的输出即可。

输入可以采取字符串或字符列表的形式,形式为S1N2E3...或SNNEEE...网格大小也没有硬性限制,但假定输入不会溢出任何内容。只要代码从根本上讲是合理的,处理诸如这样的情况就不是关键N99999999999999

注意:您可以评估的情况下N1S1E1W1S1N1,和W1E1但是你想。它们在技术上是有效的路径,但它们违背了挑战的“特隆”精神。

计分

这是,所以最短的答案会成功!


N1S1为符合您的定义,应为true,因为它达到(0, 0)两次,(0, 1)一次,在您的定义下有效。
HyperNeutrino

我可以接受Nas 1jEas 1Sas -1jWas -1吗?
Leaky Nun

@LeakyNun我认为我可以接受,因为无论如何每个人都应该这样做。只需确保在答案中指定即可。
法夸德勋爵(Lord Farquaad)'17年

1
@HyperNeutrino,但从Tron的角度来看,即使输入永远不会将您置于这一点,您的光周期也会经历两次(0,0.5)。这就是为什么我认为一个输出具有灵活性(即使对于大多数语言而言,返回true也会更容易)
Value Ink

1
@steenbergh(0,0)不在角落,所以您可以在它的下方或左侧;即使两者都让您发疯!而且,网格大小没有硬性限制,只是假设输入不会溢出任何东西。只要代码从根本上讲是正确的,我不在乎它是否无法处理类似的输入N99999999999999
Lord Farquaad

Answers:



6

JavaScript,247200字节

n=s=>{r=s.match(/\w\d+/g)
x=y=z=0
e=""
for(d of r){a=d[0]
b=d.slice(1)
while(b--){
y+=a=="N"
y-=a=="S"
x+=a=="E"
x-=a=="W"
p=[x,y]+";"
if(~e.indexOf(p))if(!x&!y)z++
else return 0
e+=p}}return!x&!y&!z}

n是输入字符串的函数s,返回1true和0false

这是供参考/解释的非公开版本:

function n(s)
{
    var dir = s.match(/\w\d+/g);
    var x = y = z = 0;
    var been = "";
    for (d of dir)
    {
        var a = d[0];
        var b = 1*d.substring(1);
        while(b-- > 0)
        {
            if (a == "N") y++;
            if (a == "S") y--;
            if (a == "E") x++;
            if (a == "W") x--;
            var pt = [x,y] + ";";
            if (~been.indexOf(pt))
                if (x==0 && y==0)
                    z++;
                else
                    return false;
            been += pt;
        }
    }
    return (x == 0 && y==0 && z == 0);
}

n=s=>{r=s.match(/\w\d+/g)
x=y=z=0
e=""
for(d of r){a=d[0]
b=d.slice(1)
while(b--){
y+=a=="N"
y-=a=="S"
x+=a=="E"
x-=a=="W"
p=[x,y]+";"
if(~e.indexOf(p))if(!x&!y)z++
else return 0
e+=p}}return!x&!y&!z}

console.log(n("N1E1S1W1"))
console.log(n("N1E1N1E1S2W2"))
console.log(n("N1S1E1W1"))
console.log(n("N4E2S2W4S2E2"))
console.log(n("N3E2S3"))



没注意到,谢谢
WaffleCohn '17

看来这contains不是JavaScript的任何方言中的函数。您能指定方言吗?
Leaky Nun

我只是在使用chrome控制台进行测试-它在那里完美运行
WaffleCohn

实际上,它也可以在我的Chrome控制台中使用...但是也许您会考虑将其更改为更通用的答案?
Leaky Nun

5

Python 3中236个 161 150字节

import re
p=0
a=[]
for i in''.join(s[0]*int(s[1:])for s in re.findall(r".\d+",input())):p+=1j**"NESW".find(i);a+=[p]
print(len({*a})-len(a)==0==a[-1])

在线尝试!

-75字节归因于Leaky Nun
-11字节归因于Leaky Nun或者,如果允许我们将输入作为游程长度解码的复数列表:

Python 2中85 73个字节

c=0;k=[]
for i in input():c+=i;k+=[c]
print(k[-1]==0==len(set(k))-len(k))

在线尝试!

Xcoder先生为-12个字节/ Leaky Nun为-9个字节(合并为一个编辑)

这对我来说感觉太久了


3
只要它短于Pyth解决方案的10倍,就不会太长。
Leaky Nun

@LeakyNun哈哈好的:P
HyperNeutrino


@LeakyNun哦,不错。看到太久了,正如我说的:P
HyperNeutrino


3

果冻14 12字节

Œṙ+\µQ⁼ȧṛ/¬$

这是我第一次在果冻打高尔夫球。欢迎提出建议。

输入是[direction, distance]成对的数组,方向是一个复数。

说明:

Œṙ+\µÇȧṛ/¬$   Main link. Argument: n     = [[i, 3], [1, 2], [-i, 3]]
Œṙ            Run-length decode          = [i, i, i, 1, 1, -i, -i, -i]
  +\          Cumulative sum             = [i, 2i, 3i, 3i+1, 3i+2, 2i+2, i+2, i]
    µ         Begin a new monadic chain
     Q        Remove duplicates          = [i, 2i, 3i, 3i+1, 3i+2, 2i+2, i+2]
      ⁼       Equal to original?         = 0
           $  Make a monadic link:
        ṛ/      Reduce by right argument   = i
                (Gets the last element)
          ¬     Logical NOT:               = 0
       ȧ      Logical AND the two values = 0

应该失败的最后一种情况。
Leaky Nun

0

视网膜,86字节

\d+
$*
1(1*)
$1
+`(.)1
$1$1
.
 $`$&¶
%O`.
+`NS|E(.*)W
$1
M`\w$|(?m)(^.+$)(?s).+^\1$
^0

在线尝试!链接包括测试用例。说明:

\d+
$*

将数字转换为一元。

1(1*)
$1
+`(.)1
$1$1

游程长度解码字母。N111需要变成NNN,因此从每个一元数中减去一个,然后每个1都复制前一个字母。

.
 $`$&¶

将所有前缀(即路径上的点)生成为单独的行。为避免出现空行问题,请在前面加上空格。

%O`.
+`NS|E(.*)W
$1

将每一行中的所有字母按顺序排序,然后删除匹配对。最后,为网格上的任何给定点提供了唯一的代码。

M`\w$|(?m)(^.+$)(?s).+^\1$

检查以下两项之一:a)最后一点没有在空格中结束(即循环没有关闭),或者路径中有两个重复的点。如果路径有效,则所有检查均将失败,结果为零。

^0

反转结果。


0

佩尔(140)

与字符串输入一起使用。也许我可以用数组来缩短,但我对此表示怀疑。很高兴获得进一步的高尔夫帮助:)

sub w{$i=$_[0];%d=(E,[0],S,[1,-1],W,[0,-1]);$i=~s/(.)(.)/($d,$o)=(@{$d{$1}},1,1);for(1..$2){$s[$d]+=$o;$r+=$d{"@s"}++}/eg;!($s[0]+$s[1]+$r)}
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.