비행기에 유효한 뱀


23

Vi Hart의 비디오 중 하나에서 영감을 얻었습니다 (잠재적 인 도전 아이디어로 가득 찬 보물 상자)

뱀은 같은 길이의 세그먼트로 구성되며 각 세그먼트 사이의 연결은 직선이거나 90 ° 회전 할 수 있습니다.
우리는 이러한 뱀을 회전 방향 (직선 / 좌 / 우) 으로 기록하여 슬라이서 를 기록함으로써 (초기 방향에 따라 최대 회전까지) 인코딩 할 수 있습니다 . 왼쪽 상단에서 시작하여 오른쪽을 가리키는

-+    +--+    SR    RSSR
 |  +-+  |     S  RSL  S
 +--+  --+     LSSL  SSR

Slither로 대표 될 것 SRSLSSLRLRSSRSRSS

물론 평면 뱀은 (와 같이 SSSSLLLSS) 스스로 교차 할 수 없으므로 끔찍한 픽셀 화 된 게임 오버가 발생합니다.

당신의 임무는 슬리 더가 유효한지 아닌지를 결정하는 것입니다 (적어도 하나의 자기 교차로에서 발생합니다)

입력 유효한 슬라이더 인 경우 Output Something Truthy가있는
문자 SLR로 만든 문자열 이고 그렇지 않은 경우 Falsey 인 문자열 입니다.2 < length < 10000

테스트 사례

__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL

__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

여기서 슬라이더그릴 수 있습니다 (R과 L은 뒤집어 지지만 유효성에는 영향을 미치지 않습니다)


프로그램에서 입력해야합니까, 아니면 파일에서 읽을 수 있습니까?
MI Wright

1
SRRR이 True 또는 False 여야합니까? 연결되지만 자체 교차하지는 않습니다.
orlp

뱀이 NSFW에 도전하고 있습니까?
Ewan

3
당신이 그리는 경우 SRRR세그먼트 당 하나의 광장으로 그래프 용지에 다음이 겹치는 것 때문에 무효, 간단 RRR하지만, 정확히 (단지 고전 게임처럼) 중복없이 2 × 광장 차지하는
DenDenDo

유사하지만 중복되지는 않습니다 (다른 목표와 다른 건설 규칙으로 인해)
trichoplax

답변:


20

Pyth, 22 20 바이트

ql{m+=Z*=T^.j)hCdzlz

직접 시험해 보거나 testsuite를 실행하십시오 .

SRL의 ASCII 값은 각각 83, 76, 82입니다. 나는 다음과 같은 사실을 남용합니다.

나는 83 + 1 = 1
76 + 1 = I
I 82 + 1 = -i

여기에서 나는 현재 위치와 현재 방향에 대한 변수를 유지합니다. 모든 문자에 대해 현재 방향에 위의 복소수를 곱한 다음 현재 위치에 추가하십시오.

마지막으로 방문한 모든 위치가 고유한지 확인합니다.


SRRR = 사실 ????
Ewan

@Ewan 면밀한 조사-그것이 거짓인지 아닌지 확실하지 않습니다. 머리와 꼬리는 연결되지만 교차하지는 않습니다.
orlp

SRRRS는 어떻습니까?
Ewan

@Ewan 같은 이야기-연결은 있지만 교차는 없습니다. 질문은 이것에 대해 무엇을 반환해야하는지 명확하지 않습니다.
orlp

1
SRRR을 어떻게 그리시겠습니까?
Ewan

6

CJam, 30 바이트

q{iF%U+:U[XWe4W1e4]=T+:T}%__&=

곧 따라야 할 설명.

여기에서 온라인으로 시도 하거나 전체 제품군을 실행하십시오 .


젠장, 빠르군 나는 그것을 스스로 해결할 알고리즘을 생각조차하지 않았다.
DenDenDo

SRRRS = true ???
Ewan

@Ewan 음, 우리는 0이 처음에 채워지고 계산된다고 가정합니까?
Optimizer

1
나는 움직임이 공간 블록을 차지하는 뱀 게임처럼 해석하고 있다고 생각합니다. 여러분 중 일부는 그것을 폭이 0 인 줄로 해석하고 있습니다
Ewan

@Ewan 내 질문은 조금 다릅니다. 우리가 한 번 움직일 때 S, 뱀이 이미 (0,0)과 (1,0)을 모두 차지했다는 의미입니까?
Optimizer

6

자바 스크립트 (ES6), 84 89

Firefox에서 스 니펫을 실행하여 테스트하십시오.

몇 가지 참고 사항 :

  • 뱀은 f 배열 안에서 움직입니다. 방문하지 않은 셀에는 값이 undefined있습니다. 처음 방문 할 때 물결표 연산자는이를 -1로 변경합니다. 결국 두 번째 방문에서 값이 0으로 변경되어 거짓입니다.every 거짓으로 루프가 종료됩니다.
  • JS에서, 정식 색인이 아닌 (숫자 또는 음수가 아닌) 배열 요소는 어떻게 든 '숨겨져'있지만 존재합니다. 여기서는 문제없이 음수 인덱스를 사용합니다.

F=s=>[...s].every(c=>f[p+=[1,1e5,-1,-1e5][d=d+{R:1,L:3,S:0}[c]&3]]=~f[p],d=p=0,f=[])

//TEST
$('#S').on('keyup mouseup change', Draw);

function Draw(){
  var s = S.value.toUpperCase();
  if (!s) {
    C.width = C.height = 0;
    return
  }
  C.width = 600;
  C.height = 400;
  
  var ctx = C.getContext("2d");  
  var px, py, int=0;
  
  ctx.strokeStyle = '#008';
  ctx.lineWidth = 2;
  ctx.translate(300,200);
  ctx.beginPath();
  ctx.moveTo(0,0);
  
  [...s].forEach(c=>{
    (f[p+=[1,1e4,-1,-1e4][d=d+{R:1,L:3,S:0}[c]&3]]=~f[p])
    ? 1 
    : (++int)
    if (int==1) ctx.stroke(), ctx.strokeStyle = '#800', ctx.beginPath(), ctx.moveTo(10*px,10*py);
    
    py = (p / 1e4 | 0) - 5e3;
    px = (p % 1e4) -5e3
    ctx.lineTo(10*px, 10*py);
  }, d=0,p=50005000,f=[]);
  ctx.stroke();
  
}

valid=["SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS",
"SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR",
"RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR",
"SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS",
"SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS",
"LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL"];
invalid=["SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR",
"SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR",
"SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS",
"SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS",
"LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"];

V.innerHTML=valid.map(s=>F(s)+' '+s).join('\n')
I.innerHTML=invalid.map(s=>F(s)+' '+s).join('\n')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Type to check and draw <input id=S>
(better full page)<br>
<canvas id=C width=1 height=1 ></canvas><br>
Valid<pre id=V></pre>
Invalid<pre id=I></pre>


6

TI-BASIC, 49 56 53 51 바이트

abs(e^(i)-cumSum(i^cumSum(seq(inString("SL",sub(Ans,X,1))-1,X,1,length(Ans→X
SortA(∟X
min(ΔList(∟X

orlp의 방법과 유사하게, 이것은 원점에서 시작하여 뱀이 방문한 복잡한 평면의 모든 지점 목록을 만듭니다. 목록에 중복 요소가 없으면 코드는 양수 값을 반환합니다. 999 개가 넘는 요소의 문자열에서 계산기는 충분히 긴 목록을 생성 할 수 없으며 오류가 발생합니다.

편집 : 복잡한 평면의 두 격자 점이 e ^ i에서 같은 거리에있을 수 없으므로 추악한 비용으로 2 바이트를 절약했습니다.


5

TI-BASIC, 60 58 바이트

편집 : 아래의 모든 것을 무시하십시오 : thomas-kwa 의 작동하는 기본 솔루션이 여기 있습니다 . 그것을 찬성하라!

는 IS [(-)]키 및 ANS입니다 [2ND]->[(-)]. 뱀의 명령어를 따옴표 ( [ALPHA]->[+])로 묶고 콜론과 프로그램 이름 을 묶어 실행하십시오 . 예를 들어, 프로그램 이름을 "SNAKE"로 지정하면 OP에서 테스트 사례를로 실행합니다 "SRSLSSLRLRSSRSRSS":prgmSNAKE.

seq(inString("SRL",sub("0"+Ans,I,1)),I,1,length(Ans
Disp 0<sum(⁻1+2seq(Ans(I)≠(Ans(I-1),I,2,dim(Ans

편집 :에 실패합니다 SRRLSLLRRRS. 61 바이트의 개정 버전이 있지만 첫 번째 유효하지 않은 테스트 사례에서 실패합니다.

seq(inString("SRL",sub("0"+Ans,I,1)),I,1,length(Ans
cumSum(⁻1+2seq(Ans(I)≠(Ans(I-1),I,2,dim(Ans
Disp 0<Ans(dim(Ans

나는 내일 고치려고 노력할 것이다.


업데이트 : 문제는 실제로 내 알고리즘에 결함이 있다는 것입니다. seq ((동일한 것을 달성하기 위해)와 반대로 For (루프)를 사용한 경우 (위의 알고리즘 모두) 다음과 같이 설명 할 수 있습니다.

  1. 카운터 변수를 1로 초기화하십시오.
  2. 문자열을 읽으십시오. 기호가 바뀌면 카운터 변수를 증가시킵니다. 기호가 반복되면 감소시킵니다.
  3. 카운터 변수가 0보다 크면 1 (유효)을 표시하십시오. 그렇지 않으면 0을 표시합니다 (잘못된).

그러나 이것은와 같은 잘못된 슬라이더에서는 실패합니다 SRLRLRLRLRRRSS. 이제 더 나은 알고리즘을 찾거나 다른 답변을 훔치려 고합니다.


나는 이것이 단일 seq(명령 으로 대체 될 수 있다고 확신 하지만 실제로는 이것이 내가 얻을 수있는만큼 작습니다. 당신이 사용 8xp이 구축하려는 경우 Sourcecoder을 실제로을 입력 반대로, 참고 로 대체해야 !=하고, ⁻1+비트는 교체해야합니다 ~1+.


1

루비 87 89

F=->s{d=[1,w=1e4,-1,-w]
v=[w]+s.chars.map{|c|w+=d.rotate!(c<?R?-1:c>?R?0:1)[0]}
v==v&v}

온라인 테스트 : http://ideone.com/pepeW2

언 골프 버전 :

F = -> input {
  # Coordinates are expressed using one number,
  # that is computed using the formula `y + x*max_x`.
  # Assume max horizontal field width (max_x) to be 10000,
  # since that's the max length of the input.
  position = max_x = 1e4

  # These are possible directions to move to (coordinate deltas).
  # The current direction is always the first in the array.
  directions = [1,max_x,-1,-max_x]

  visited = [position]

  visited += input.chars.map{|c|
    # adjust current direction...
    directions.rotate! case c
    when ?L
      -1
    when ?R
      1
    when ?S
      0
    end

    # ...and move there
    position += directions[0]
  }

  # Return `true` if `visited` only contains distinct elements, `false` otherwise
  visited == visited & visited
}

0

골프 스크립트 48 49 50

[10.4?:z-10z~)]z*z@{'R L S'?@>(@+.`n}%n/@;\;..&=

문자열이 스택 반환 중 하나에 존재 할 것으로 예상 01.

유효 하고 유효하지 않은 뱀에 대한 테스트를 통해 온라인으로 시도 할 수 있습니다 .

이것은 기본적으로 내 루비 답변 과 같은 아이디어입니다. 입니다. AFAIK Golfscript에는 arary 회전 기능이 없으므로 방향 배열 만 다르게 처리됩니다. 이 경우 현재 명령 (S, R 또는 L)에 따라 10000 배를 곱한 다음 시작 0, 1 또는 3 요소에서 트리밍하여 충분히 큰 방향 배열을 만듭니다. 이동하려는 현재 "방향"은 항상 배열의 첫 번째 항목입니다.

여기 주석이 있습니다 :

# Build the direction array and set current position
[1 10000:z-1z~)]z*z

@{
  # For each character in the input:

  # set current direction by cutting 0, 1 or 3 elements 
  # from the beginning of the directions array
  'SR L'?
  @>

  # move to current direction
  .0=@+.

  # format as number and addd newline
  `n
}%

# split by newlines
n/

# cleanup
@;\;

# return 1 if array contains distinct elements, 0 otherwise
..&=

편집하다:

"directions"배열의 소비 방식을 수정하여 1 개의 문자를 저장했습니다.

편집하다:

?(power) 구문 을 사용하기 위해 1 대신 10 씩 증가하여 1 문자를 절약했습니다 .

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