거울의 방


18

(이 과제는 매우 유사하지만이 현재 과제에는 추가적인 문제가 있습니다.)


벽이 평평한 거울로 도금 된 2 차원 방을 상상해보십시오.

갑자기 벽이없는 방에 빛의 광선이 닿습니다! 광선이 방 주위에서 춤을 추고 벽 거울에 반사되어 결국 방을 떠납니다.

논리

W, H, X, YZ의 5 가지 변수가 제공 됩니다.
이제 그들은 무엇을 의미합니까?

W, H는 방의 크기 (벽 포함)이며 W는 너비이고 H는 높이입니다.
X, Y는 벽에 구멍이있는 좌표입니다. 이것이 항상 벽 타일에 있다고 가정 할 수 있습니다. 좌표는 0을 기준으로하며 X 축은 오른쪽을 가리키고 Y 축은 아래쪽을 가리 킵니다.
Z는 빛이 하나의 방에 속하는 것을 지시 나타내는 단일 문자 \또는 /.

방은 다음 문자들로 구성되어야합니다 :

  • | 수평 벽용
  • - 수직 벽용
  • + 코너

예 : (W = 7, H = 4)

+-----+
|     |
|     |
+-----+

이제 방이 생겼으므로 벽 타일 중 하나를 파괴하여 광선이 방으로 떨어집니다. 빛의 광선에 의해 표현 대각선입니다 \/문자.

X = 2, Y = 0에서 벽 타일을 \광선으로 교체합시다 .

+-\---+
|     |
|     |
+-----+

들어오는 빛은 거울 벽에 닿을 때까지 방을 가로 질러 대각선으로 이동합니다. 벽에 충돌하면 방향이 벽 축을 따라 반전되고 빔이 이동합니다.

+-\---+
|\ \/\|
| \/\/|
+-----+

이 예에서 광선은 벽의 모서리에 닿는 지점에 도달하여 광선이 완전히 뒤집히고 뒤로 완전히 이동하여 결국 방을 떠나게됩니다.

당신의 작업

방을 다시 떠나거나 무한 루프로 반복 될 때까지 방과 광선의 전체 경로를 인쇄하는 프로그램을 작성하십시오.

입력

입력은 임의의 적절한 형식으로 수신 될 수 있지만 4 개의 정수 W, H, X, Y 및 문자 Z를 포함해야합니다 (예 :) [10, 8, 0, 3, \].

다음과 같이 가정 할 수 있습니다.

  • W, H> = 3
  • X, Y는 항상 벽에 있습니다
  • Z는 값을 포함 할 수있을 것입니다 \/.

산출

문자열을 반환할지 또는로 직접 출력할지 결정할 수 있습니다 stdout.
방의 벽과 광선을 포함해야합니다 (위의 ASCII 문자로 정의).

규칙

  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 언어에서 바이트 단위의 가장 짧은 코드가 승리합니다.
  • 이 과제를 게시하기 전에 만들어진 모든 코딩 언어가 허용됩니다.

입력: [5, 4, 2, 0, /]

+-/-+
|/ /|
|\/ |
+---+

입력: [20, 3, 0, 1, \]

+------------------+
\/\/\/\/\/\/\/\/\/\|
+------------------+

입력 : [10, 8, 0, 3, \] (방을 다시 떠나지 않는 무한 루프의 예)

+--------+
|/\/\/\/\|
|\/\/\/\/|
\/\/\/\/\|
|\/\/\/\/|
|/\/\/\/\|
|\/\/\/\/|
+--------+

행운을 빕니다!

답변:


5

, 55 바이트

BNNJNNPψ↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1W¬℅KK«¹F³¿∧κ℅KK«↷κ¶↷κ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : 이유를 모르겠지만 현재 해당 코드가 작동하지 않습니다. 여기 에 비틀어 진 버전이 있습니다. 원래 코드에 대한 설명 :

BNN

외부 상자를 그립니다.

JNNPψ

커서를 진입 점으로 이동하고이 시점에서 상자에 구멍을 뚫어 배경이됩니다.

↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1P

초기 선분을 인쇄하려면 적절한 방향으로 회전하십시오.

W¬℅KK«¹

커서가 구멍 위에있는 동안 다음 선 세그먼트를 그립니다.

F³¿∧κ℅KK«↷κ¶↷κ

다음 선분을 그릴 구멍을 찾으십시오. 동일한 코드를 세 번 반복하여 작동합니다. 처음으로 아무 일도 일어나지 않습니다. 두 번째로 커서가 구멍 위에 있지 않으면 오른쪽으로 45도 회전 한 다음 오른쪽으로 한 단계 이동 한 다음 오른쪽으로 45도 회전합니다. 이것은 하나의 축에 반영하는 효과가 있습니다. 세 번째로 커서가 여전히 구멍 위에 있지 않으면 오른쪽으로 90도 회전 한 다음 오른쪽으로 한 단계 이동 한 다음 오른쪽으로 90도 회전합니다. 이것은 반사를 다른 축으로 변경하는 효과가 있습니다. 여전히 구멍이 없으면 모서리 또는 무한 루프에 도달하여 외부 루프가 정지됩니다.


1
사람들이 귀하의 코드 작동을 테스트하려면 자세한 버전을 별도로 사용하여 온라인으로 골프 코드에 대한 링크를 얻는 것이 좋습니다.
trichoplax



@trichoplax TIO 링크는 실제로 출력 된 골프 코드를 보여줍니다. 여기서 복사하여 붙여 넣습니다.
Neil

1
@trichoplax 사용하면 -v -sl실제로 번역 된 간결 코드가 인쇄되어 실행됩니다. 물론 올바른 간결 코드를 생성하는 디버 보시 파이어에 의존합니다. 그렇지 않은 경우 원래 상세 코드가 기술적으로 정확하더라도 생성 된 코드가 실패하기 때문입니다.
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.