충돌하지 않고 반복 할 수 있습니까?


14

우리 중 많은 사람들이 게임 트론에 익숙합니다. 그리드에 배치 된 "라이트 사이클"을 제어합니다. 라이트 사이클은 항상 앞으로 이동하고 (방향을 제어하더라도) 그 뒤에 영구적 인 트레일을 남깁니다. 당신이 흔적을 실행하면 충돌!

여기서 목표는 주어진 경로가 유효한 루프인지, 즉 "충돌"없이 시작점으로 돌아 오는지를 결정하는 것입니다. 이를 위해 우리는 시점에서 시작한다고 가정합니다 (0,0). 입력은 N2E1S2W1일련의 기본 방향 ( Nis north, Eis 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.

참고 :이 사건을 평가할 수 N1S1, E1W1, S1N1, 및 W1E1그러나 당신이 좋아하는 것입니다. 그들은 기술적으로 유효한 길이지만 도전의 "트론"정신에 위배됩니다.

채점

이것은 이므로 가장 짧은 답변이 이깁니다!


N1S1정의에 따라 (0, 0)두 번, (0, 1)한 번 도달하므로 정의와 일치하는 것이 사실 입니다.
HyperNeutrino

내가 취할 수있는 N1j, E1, S-1j, 그리고 W같은 -1?
Leaky Nun

@LeakyNun 어쨌든 모두가 이와 같은 일을해야하기 때문에 나는 그것에 대해 괜찮다고 생각합니다. 답에 명시하십시오.
주님 Farquaad

1
@HyperNeutrino 그러나 Tron의 관점에서 볼 때 입력이 결코 그런 지점에 들어 가지 않더라도 라이트 사이클은 (0, 0.5) 두 번 통과합니다. 그렇기 때문에 유연한 출력을 얻을 수 있다고 생각합니다. (대부분의 언어에서는 사실을 반환하는 것이 더 쉬울 것입니다)
Value Ink

1
@steenbergh (0,0)이 코너에 있지 않으므로 왼쪽 아래 또는 왼쪽으로 이동할 수 있습니다. 당신이 미쳤다고해도 둘 다! 또한 그리드 크기에는 제한이 없지만 입력이 오버플로되지 않는다고 가정하십시오. 코드가 기본적으로 건전한 한, 다음과 같은 입력을 처리 할 수 ​​없는지 상관하지 않습니다N99999999999999
Lord Farquaad

답변:



6

자바 스크립트, 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}

ntrue와 false s를 반환 1하는 입력 문자열의 함수입니다.0

참조 / 설명을위한 ungolfed 버전은 다음과 같습니다.

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

contains자바 스크립트의 방언에서 함수가 아닌 것 같습니다 . 방언을 지정할 수 있습니까?
Leaky Nun

방금 크롬 콘솔을 사용하여 테스트했습니다. 완벽하게 작동합니다
WaffleCohn

사실 그것은 내 크롬 콘솔에서도 작동하지만 ...보다 보편적 인 답변으로 변경하는 것을 고려할 수 있습니까?
Leaky Nun

5

파이썬 (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])

온라인으로 사용해보십시오!

Leaky Nun 덕분에 -75 바이트 Leaky Nun 덕분에
-11 바이트 또는 실행 길이 디코딩 된 복소수 목록으로 입력 할 수있는 경우 :

파이썬 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 lol okay : 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을 빼고 각 1은 이전 문자를 복제합니다.

.
 $`$&¶

모든 접두사 (예 : 경로의 점)를 별도의 선으로 생성하십시오. 빈 줄의 문제를 피하기 위해 공백이 접두사로 사용됩니다.

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

각 줄의 모든 문자를 순서대로 정렬 한 다음 일치하는 쌍을 삭제하십시오. 그리드의 특정 지점에 대한 고유 코드로 끝납니다.

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

다음 두 가지 중 하나를 확인하십시오. 경로가 유효하면 모든 검사가 실패하고 결과는 0입니다.

^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)}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.