코드 골프 : 우주선의 운명은 무엇입니까? [ASCII 아트 버전]


14

배경

은하 (아마 우주)에서 멀리 떨어져있는 우주선과 많은 행성들이있었습니다. 기내 오작동으로 인해 우주선의 연료가 부족했습니다. 이제는 행성 클러스터 근처에서 위험한 속도로 움직이며 탈출해야합니다! 승무원의 운명은 무엇입니까?

도전

귀하는 USS StackExchange의 수석 프로그래머입니다. 따라서, 당신은 행성에 땅을 부딪 칠 운명인지, 행성계를 탈출 할 것인지, 영원히 궤도에 갇 힐지 여부를 나타내는 시뮬레이터를 작성하려고합니다.

그러나 우주선의 폭발은 계산 자원이 매우 제한되어 있음을 의미합니다. 프로그램은 가능한 작아야합니다. 또한 이것은 시뮬레이션을 실행할 수있는 유일한 방법은 ASCII 아트를 통해서만 가능하다는 것을 의미합니다.

시뮬레이션

이 우주의 사분면에서 물리학의 법칙은 ASCII 예술을 수용하기 위해 약간 변경됩니다. 이것은 우주가 세포로 나뉘어져 있음을 의미합니다. 이동은 셀 단위로 설명되며 시간은 시간 단위 단위로 표시됩니다.

배 자체는 추진력이 있습니다. 선박이 이전 시간 단계에서 x 축에서 +2 개의 셀과 y 축에서 -1 개의 셀 ((2, -1)로 축약)을 이동하고 중력장이없는 경우, 선박은 정확한 위치로 이동합니다 다음 시간 단계에서 동일한 속도.

몇 개의 행성이있을 것입니다.이 행성들은 모두 즉시 그것을 둘러싼 8 개의 세포에 중력장을 가하여 배의 속도에 영향을 미치고 배를 행성에 더 가깝게 끌어 당길 것입니다. 행성의 단지 "북쪽"은 (-1,0)의 힘으로 우주선 하나의 셀을 "남쪽"으로 끌어 당기는 필드를 초래할 것입니다. 행성의 "동북"에있는 것만으로도 선박은 하나의 셀을 "남쪽"으로 끌어 당기고 한 유닛은 "-1, -1"의 힘으로 "서쪽"으로 당기게됩니다.

중력장은 세포를 중력으로 떠나면서 선박의 운동량에 벡터를 추가합니다. 만약 배가 이전에 (2, -1) 개의 세포를 움직 였고 현재 (-1,1)의 중력장에 있다면,이 다음 단계에서는 (1,0) 개의 세포를 움직일 것입니다. 배가 여러 행성에 가까이 있으면 추가 할 벡터가 여러 개있을 것입니다.

입력

STDIN에서는 행성의 좌표와 우주선의 현재 속도를 보여주는 행성 시스템의 ASCII 예술 표현을 받게됩니다. @ 기호의 형태로 여러 개의 행성이있을 것이며 av ^ <> 기호의 형태로 한 개의 우주선이있을 것입니다. 선박의 기호 선택은 선박의 현재 속도를 나타냅니다 (중력이 추가되기 전). 예를 들어, <는 서쪽으로 한 셀의 속도를 의미하고 ^는 북쪽으로 한 셀의 속도를 의미합니다. 모든 빈 공간은 마침표로 구성되며 모든 선은 동일한 너비로 채워집니다. 빈 줄은 입력 끝을 나타냅니다. 다음은 입력 예입니다.

.................
...@.@........v..
......@..@..@@...
..@..............
.......@..@......
.................

산출

출력은 STDOUT에서 한 단어로 배가 중력을 벗어날 지, 지구를 행성으로 추락시킬 것인지, 영원히 궤도를 돌릴 것인지를 알려줍니다.

중력으로부터의 탈출은 선박이지도에서 벗어나는 것으로 정의됩니다. 배가 탈출하면, 프로그램은 "탈출"이라는 단어를 인쇄해야합니다.

충돌 착륙은 배가 행성을 직접 지나가거나 시간 단계 동안 같은 셀에서 끝나는 경우입니다. 배가 매 단계마다 어디에 있는지 간단히 계산하는 것만으로는 충분하지 않습니다. (5,5)의 속도로 움직이는 배는 간단한 계산으로 인해 해당 셀을 방문하지 않더라도 (1,1)에 위치한 행성으로 추락합니다. 그러나 속도가 (5,6) 인 배는 지구로 땅을 추락시키지 않습니다. 우주선 충돌이 발생하면 프로그램은 "충돌"이라는 단어를 인쇄해야합니다.

궤도를 탐지하는 것이 가장 어려울 수 있습니다. 궤도는 우주선이 같은 셀을 두 번 같은 속도로 방문 할 때마다 발생합니다. 선박이 궤도를 돌면 "궤도"라는 단어를 인쇄해야합니다.

위 예제의 결과는 다음과 같습니다.

escape

설명

위의 예에서 각 시간 단계에서 우주선이 이동 한 곳을 보여주는지도는 다음과 같습니다.

   ^
.................
...@.@........v..
....^.@..@..@@...
..@..<.<<<.<.v...
.......@..@......
.................

남쪽으로 갔다가 서쪽으로 향하고 복도로 내려 갔으며 북쪽으로 향했고 모든 중력의 속도를 가진 행성으로 좁게 탈출했다.


더 많은 검사 사례

...
^@.
...
orbit
...........
.>@.@......
.@......@..
....@......
crash (it crashes into the easternmost planet)
...
.@.
.v.
crash (momentum can't overcome gravity)
........
..@.....
..<.....
...@....
........
orbit (it gets trapped in a gravity well between two planets)

규칙, 규정 및 참고 사항

이것은 코드 골프입니다. 표준 코드 골프 규칙이 적용됩니다. 프로그램은 인쇄 가능한 ASCII로 작성해야합니다. 외부 데이터베이스에 액세스 할 수 없습니다.

전송 종료


입력 섹션 바로 위의 줄에 오타가있는 것 같습니다. 행성이라고 생각하십니까? :-)
Gaffi

실제로 전체 부분 단락을 삭제해야했고 정보는 출력 섹션에서 반복됩니다.
PhiNotPi

1
나는 약간 덜 변경된 물리학으로 이것을 더 잘하고 싶습니다 ...이 사이트는 조금 비싼 비싼 부동 소수점 산술과 관련된 더 많은 문제로 할 수 있습니다.
반 시계 회전을 중지

1
@leftaroundabout 다음 도전일지도 모르겠습니다.
PhiNotPi

행성에 얼마나 가까이 접근해야합니까?
피터 테일러

답변:


6

C # 991 984

struct P{public P(int x,int y){X=x;Y=y;}public int X,Y;}
class O:Exception{}
class C:O{}
List<P>p=new List<P>();
List<string>h=new List<string>();
P r,v,u;
void S(){
var i=0;
for(var l=Console.ReadLine();l!="";l=Console.ReadLine())
{u.X=l.Select((c,j)=>
{if(c=='@')p.Add(new P(j,i));else if(c!='.')
{r=new P(j,i);v=(c=='v'?new P(0,1):c=='<'?new P(-1,0):c=='^'?new P(0,-1):new P(1,0));}
return u;}).Count();i++;}
u.Y=i;
var x=new Action<string>(Console.WriteLine);
try{
while(true){
p.ForEach(q=>{var a=q.X-r.X;var b=q.Y-r.Y;
if(a<2&&a>-2&&b<2&&b>-2){v.X+=a;v.Y+=b;}});
var c=string.Join(".",r.X,r.Y,v.X,v.Y);
if(h.Contains(c))throw new O();
h.Add(c);
var z=new P(r.X,r.Y);var k=new[]{v.X,v.Y};var m=k.Min();var M=k.Max();
for(var j=1;j<=M;j++)
if((j*m)%M==0){
if(p.Contains(new P(z.X+(v.X==M?j:j*m/M),z.Y+(v.Y==M?j:j*m/M))))throw new C();}
r.X+=v.X;r.Y+=v.Y;
if(r.X<0||r.X>=u.X||r.Y<0||r.Y>=u.Y)throw new Exception();}}
catch(C){x("crush");}
catch(O){x("orbit");}
catch{x("escape");}}

ungolfed (약간 리팩토링 된) 버전은 http://pastebin.com/yAKYvwQf 에서 구할 수 있습니다

실행중인 버전 : https://compilify.net/1n9 이것은 complify에서 실행되도록 약간 수정되었습니다.

  • 암시 적 배열 생성 없음-예 : new[]{1,2}
  • compilify.net이 작동하는 방식이기 때문에 return <string>대신에 사용Console.WriteLine
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.