비린내가 끝 날까?


13

> <>,> <>는 인생입니다! 2D 언어는 놀랍습니다! 이 도전에서는 코드 골프를하는 동안 "비린내"도로가 끝났는지 말해야합니다.

정의

비포장 도로는 다음을 포함하여 타일로 구성됩니다.

v (go down)
> (go right)
^ (go up)
< (go left)
/ (mirror)
\ (mirror)

-|+도로 경계에있는 일부 꽃 (또는 물고기 머리)과 같이 다른 문자 (제외 )는 산만으로 간주 될 수 있습니다.

도로는 항상 -|+기호로 구분 된 직사각형 격자의 왼쪽 상단에서 시작합니다 . 길을 따라 가면 국경에 닿으면 끝이납니다. 그렇지 않으면 무한한 길에 갇히게됩니다.

길에서 길을 찾는 것은 v>^<거울 과 지시에 따라 수행됩니다 . 거울은 어디에서 왔는지에 따라 90 ° 반사됩니다. 작동 방식은 다음과 같습니다 ( v>^<길 찾기 표시).

 ^    ^
>/<  >\<
 v    v
</>  <\>
 ^    ^

도로가 끝나는 경우 다음과 같이 보일 수 있습니다.

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/         ^<     |
+--------------------+

무한 루프 :

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+

사양

도로가 반드시 지시만으로 구성되는 것은 아닙니다. 공백이나 문자를 사용하여 완성 할 수 있습니다. 즉,의 문자를 교차하는 경우를 제외하고는 같은 방향으로 계속 움직여야합니다 <v^>-|.

항상 v>^<왼쪽 상단에 <하나가 ^있거나이 도로 끝을 의미합니다.

문자열을 매개 변수로 사용하는 함수 또는 STDIN을 사용하는 독립형 프로그램 / 언어에서 가장 가까운 대안을 제출할 수 있습니다.

제출이 완료되면 제출물이 STDOUT 진실 / 거짓 값으로 반환되거나 인쇄되어야합니다. 도로가 끝났음을 의미하는 값진 값, 거짓은 무한 루프임을 의미합니다.

테스트 사례

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/ ><>     ^<     |
+--------------------+
    True

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+
    False

+--+
|<v|
|^<|
+--+
    True

+--+
|>v|
|^<|
+--+
    False

+----------+
|v Hello \ |
|\\/\/   / |
| \/\\   \ |
|/  // >\  |
|  ^/\>\\/ |
|\  /\/\/  |
+----------+
    False

+-----+
|>\/\\|
|//\\/|
|\/\\\|
|//\//|
|\/\/ |
+-----+
    True

2 test cases added as suggested by @MartinBüttner
+----+
|v   |
|\\  |
|//\ |
|\\v |
| \/ |
+----+
    False

+----+
|v   |
|\\  |
|//\ |
|\\^ |
| \/ |
+----+
    False

Test case inspired by @ETHproductions
+-------------------------+
|><>                      |
|something smells fishy...|
+-------------------------+
    False

표준 허점 은 항상 금지되어 있습니다.

가장 짧은 코드는 바이트 단위입니다. (> <> 답변을 보는 것이 놀랍습니다 :))



1
>> 응답을 얻는 것이 좋습니다.
clap

@ConfusedMr_C이 언어를 알고 있다면 나 자신을 입을 것입니다 : /. 아마 내가 시간을 찾는다면 ^^ '
Katenkyo

입력을> <>로 변환 한 다음> <> 인터프리터를 호출하면 (카운트에 코드를 포함하지 않고) 허점이 될 것입니까?
Paŭlo Ebermann

1
@ PaŭloEbermann 허점이 아니기 위해서는 인터프리터에서 문자를 세거나 내장 된 <<> 인터프리터가있는 언어를 사용해야하며, 존재하지 않는다고 생각합니다 ^^.
Katenkyo

답변:


4

자바 스크립트, ES6, 177 (161) 145 바이트

f=(s,i=1,M=[],D)=>D==5||!~M[O="indexOf"](D+i)&&f(s,i-[M.push(D+i),L=s[O]('|'),-L,1,-1][D=`431255${5-D+'X3412'[D]}`['><^v-|/\\'[O](s[i+L])]||D],M,D)

경로를 탐색하고 튜플의 반복을 감지하여주기를 감지 할 수 있습니다.

  • 위치
  • 오는 방향

즉, 우리가 두 번째 (x,y)방향에서 오는 어떤 위치에 들어가면 D이주기가 영원히 반복된다는 것을 알고 있습니다. 따라서 코드는 방문한 모든 위치와 방향을 추적하고 새 공간을 방문 할 때마다 해당 레코드를 확인합니다.

방향은 위, 아래, 왼쪽, 오른쪽 숫자를 할당 1, 2, 3,와 4. 이 코드는 방문중인 현재 심볼 ( s[i+L])을 고려하고 현재 방향 ( D)을 변경 한 다음 새 방향을 사용하여 재귀 적으로 함수를 호출하고 다음 공간을 평가합니다. 5방향은 벽과 true프로그램 의 종료를 나타냅니다 .

덜 골프 코드에 대한 설명은 다음과 같습니다.

f=
(s,     // input string
 i=1,   // current location as offset string index
 M=[],  // record of previously visited spaces
 D      // current direction
  )=>(
    L=s[O="indexOf"]('|'), // find arena width `L` by index of first `|`

    // if D is 5, return true, or...
    D==5 ||

    // if direction + position is not new, return false
    !~M[O](D+i) &&

    // otherwise, save this direction + position
    M.push(D+i) &&

    // recursively call `f` with new direction and position
    f(s,
      i-[,L,-L,1,-1][D=            // modify position based on active direction
        `431255${5-D+'X3412'[D]}`  // from these possible directions...
          [                        // chose the one at the index...
            '><^v-|/\\'[O](        // based on the index of the symbol 
                           s[i+L]  // of the current character
                                 )
          ]
        ||D     // or preserve old D if symbol is not directional
      ],
      M,D)

템플릿 문자열 `431255${5-D+'X3412'[D]}`에는 미러를 처리하는 중첩 된 표현식이 있습니다. 길 찾기는 숫자이므로 인덱스로도 사용할 수 있습니다. 식은 'X3412'[D]가능한 방향 문자열 \에서 8 번째 문자로 평가되므로 기호 문자열에서 8 번째 문자에 해당합니다 '><^v-|/\\'). 표현은 말합니다

  • 현재 방향 D1(위)이면 \거울 을 칠 때의 새 방향 은 3(왼쪽)
  • 현재 방향 D2(아래)이면 \거울 을 칠 때의 새 방향 은 4(오른쪽)
  • 기타

다른 미러 /는 표현식을 사용 'X4321'[D]하지만, 이는 단순히 순서가 지정된 카운트 다운 4이므로보다 간단하게 표현할 수 있습니다 5-D.


5

비준수> <> 답변

당신은> <>를 원했고, 나는 당신에게> <>를 주었다!

> <> 에서이 작업을 수행하는 유일한 방법은 코드 공간의 입력을 복사하고 입력이 어딘가로 이어질지 통역사가 스스로 결정하도록하는 것입니다. > <>는 더 이상 스레딩을 구현하지 않기 때문에 큰 문제가 발생합니다. 입력에 루프가 있으면 그 안에 갇히게됩니다.

이러한 고려 사항을 고려하여, > <> 온라인 인터프리터 와 호환되는 솔루션을 만들기로 결정 하여 인터프리터가 입력에 갇혀 있거나 모든 것을 수행하기 위해 오래 걸리는 경우 주장 할 수 있습니다. 또한 온라인 통역사가 추가 된 코드를 표시하고 코드를 쓰려고 할 때 충돌하지 않도록 코드에 후행 줄을 추가해야했습니다.

아, 그리고 지금까지 분명히 실격되었으므로 코드를 골퍼하는 데 신경 쓰지 않았습니다.

더 이상 고민하지 않고 모든 영광의 코드 :

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
              ^

그것을 사용하려면, 온라인 통역사에서 그것을 복사하고, 입력을 처리하기에 충분한 후행 줄을 추가하고, 코드를 제출하고, 입력 ;분리 된 줄로 제공 하고 타고 즐기십시오.

몇 가지 테스트 :

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/         ^<     |
+--------------------+` 

최종 코드 공간 :

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
            ^
 ....................
.>\/           >\/>  .                   
. v^            \/   .
. v^   ^ ^           .
. \/\         >v     .
. /\/         ^<     .
 ....................

"true"를 출력하고 정지합니다.


+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+

최종 코드 공간 :

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
            ^
 ........ 
.>>\     .
.\\      .
.  \\    .
. \ /    .
 ........

영원히 반복됩니다.


그것이 호환되지 않더라도 나는 당신의 출처를 좋아합니다! 이 항목에 감사드립니다! 그것이 거짓이어야하지만 영원히 일을 잘하면 영원히 반복되는 것은 슬픈 일입니다 ^^.
Katenkyo

온라인 생선 통역사를 업데이트했습니다. 이제 다중 라인 입력을 지원합니다
Suppen

@Suppen 안녕하세요! 최대 속도 증가에 감사드립니다!
Aaron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.