서클 미로 검사기


12

물체가 미로를 움직일 위치가 작은 볼 베어링이 달린 나무 장난감을 알고 있습니까? 이것은 그런 식입니다. 미로와 일련의 움직임이 주어지면 공이 끝나는 위치를 결정하십시오.

보드는 수직으로 고정되며 보드가 회전 할 때 공이 중력에 의해서만 움직입니다. 각 "이동"은 회전 (라디안)입니다.

미로는 단순히 동심원 모양의 원형 벽이며 각 벽에는 외부 복도로 정확히 하나의 개구부가 있습니다.

미궁

보시다시피, 공은 중간에서 시작하여 나 가려고합니다. 공이 회전 도중에 있어도 올바른 방향에 도달 하면 즉시 공이 떨어집니다. 한 번의 회전으로 볼이 여러 개의 개구부를 통해 떨어질 수 있습니다. 예를 들어 회전 >= n * 2 * pi은 미로를 피하기에 충분합니다.

게임의 목적 상 0.001, 개구부의 라디안 내에있는 공 은 "적합"으로 간주되어 다음 복도로 넘어갑니다.

입력:

입력은 두 부분으로되어 있습니다.

  • 미로는 미로에 n얼마나 많은 벽 / 개구가 있는지를 나타내는 정수로 주어진다 . 그 다음에는 한 n줄의 번호가 있고 다음 복도로가는 통로를 나타냅니다.

  • 움직임은 m몇 번의 움직임이 수행되었는지를 나타내는 정수로 주어 지며 (따라서 별도의 라인으로) 보드m시계 방향으로 라디안 으로 회전 합니다 (음은 반 시계 방향).

모든 통과 위치는로 표시되며 0 rad = up양의 라디안은 시계 방향으로 이동합니다.

위의 샘플 이미지의 경우 입력은 다음과 같습니다.

7                        // 7 openings
0
0.785398163
3.14159265
1.74532925
4.71238898
4.01425728
0
3                        // 3 moves
-3.92699082
3.14159265
0.81245687

출력 : 볼이 끝나는 복도 번호를 출력합니다. 복도는 중앙에서 시작하여 인덱스가 0이므로 시작 0합니다. 하나의 개구부를 통과하면 복도에 있습니다 1. 전체 미로를 탈출하면 정수를 출력하십시오.>= n

샘플 입력에는 세 가지 동작이 있습니다. 첫 번째는 공이 두 개의 구멍을 통해 떨어지게합니다 . 두 번째는 개구부를 찾지 못하고 세 번째는 하나를 찾습니다 . 공은 이제 복도 3에 있으므로 예상 출력은 다음과 같습니다.

3

유효하지 않은 입력에 대해 동작이 정의되지 않았습니다. 유효한 입력으로 잘 형성되어 n >= 1하고 m >= 0.

스코어링은 표준 코드 골프이며, 가장 적은 수의 바이트가 이깁니다. 표준 허점 은 금지되어 있습니다. 입력은 하드 코딩되어서는 안되지만 표준 입력, 인수, 콘솔 등에서 가져올 수 있습니다. 출력은 콘솔, 파일 등으로 출력 할 수 있습니다.


"잘못된 입력에 대해 동작이 정의되지 않았습니다." <<-이것은 모든 퍼즐에 넣어야합니다!
TheDoctor

이 가상의 경우, 필요할 때마다 가변 정확도로 π를 계산하여 공이 떨어졌는지 여부를 알기에 충분할 때까지 정확도를 올릴 수 있습니다. 내가 맞춤에 대한 허용 오차 (또는 적어도 현재 단어)에 대한 문제는 A) 연속 맞춤이 서로 0.001보다 가까워서 공차가 고려 될 때 공이 두 수준으로 떨어지도록하는 것입니다. 공은 구멍의 0.001 내에 있으며 구멍으로 점프합니다 (실제로 문구로 무언가를 읽으려는 경우).
Wrzlprmft

@Wrzlprmft 공이 구멍으로 뛰지 않습니다. 임계 값은 구멍이 공보다 약간 넓다는 의미로 생각하십시오. 여전히 같은 위치로 한 단계 더 떨어집니다. 임계 값이 1이라고 생각하면 큰 구멍으로 작업하고 공이 떨어질 때 구멍의 중심으로 점프하지 않습니다.
Geobits

입력이 왜 이렇게 불편한 형식입니까? 나는 내가 읽어야 할 것보다 더 짧은 전체 프로그램을 골라 냈다고 확신한다 : /
Tal

답변:


2

펄, 211 (191)

가독성을위한 줄 바꿈 및 들여 쓰기

$p=atan2 0,-1;
@n=map~~<>,1..<>;
<>;
while(<>){
    $_=atan2(sin,cos)for@n;
    $y=abs($n[$-]+$_)<$p-.001
        ?$_
        :($_<=>0)*$p-$n[$-];
    $_+=$y for@n;
    $p-.001<abs$n[$-]&&++$-==@n&&last;
    $_-=$y;
    .001<abs&&redo
}
print$-

입력의 이동 수는 삭제되고 stdin의 eof는 이동의 끝을 나타냅니다.


5

자바 스크립트 200

function f(i){with(Math)for(m=i.split('\n'),o=m.slice(1,t=+m[0]+1),m=m.slice(t+1),c=PI,p=2*c,r=0,s=1e-3;m.length;c%=p)abs(c-o[r])<s?r++:abs(t=m[0])<s?m.shift(c+=t):(b=t<0?-s:s,c+=p-b,m[0]-=b);return r}

편집 : 다음은 이 솔버가 작동한다는 것을 보여주는 애니메이션 예제입니다. http://jsfiddle.net/F74AP/4/

생기 있는

입력 문자열을 전달하여 함수를 호출해야합니다.
다음은 OP가 제공 한 예제의 호출입니다.

f("7\n0\n0.785398163\n3.14159265\n1.74532925\n4.71238898\n4.01425728\n0\n3\n-3.92699082\n3.14159265\n0.81245687");

3의도 한대로 반환 됩니다.


2
도전에서 "... 입력은 하드 코딩되어서는 안된다 ..." . 내가 실수하지 않는 한, 그것은 당신이 그것을 읽고, 또한 완전한 프로그램을 가져야한다는 것을 의미합니다. 이것은 단지 함수처럼 보입니다.
Rainbolt

2
이해할 수 없습니다. 값이 하드 코딩되지 않았습니다! "... 입력은 하드 코딩되지 않아야 하지만 표준 입력, 인수, 콘솔 등에서 가져올 수 있습니다. ". 완전한 프로그램에 관해서는 , 그것이 어디에서 지정되었는지 알 수 없으며 어쨌든 IMO는 완전한 JS 솔루션입니다.
Michael M.

전체 프로그램을 지정하지 않았으므로 함수에만 문제가 없습니다. 그러나 입력 아직 기본 배열로 정렬되지 않은 개행으로 구분되어 지정됩니다. 그것은 만족하기 간단해야합니다.
Geobits

1
@Geobits, 나중에 수정하고이 바이올린을 살펴보십시오. jsfiddle.net/F74AP/1
Michael M.

1
@Geobits, 맞아! 단순 부호 오류 ... 수정 ;-)
Michael M.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.