쿠파 쉘 시퀀스


19

다양한 슈퍼 마리오 게임에서 녹색빨간색 Koopa Troopa 쉘은 평평한 표면에서 마찰없이 미끄러 져 움직일 수있는 벽돌 블록 을 파괴 할 수 있습니다. 껍질이 벽돌 블록에 닿으면 블록이 깨져 빈 공간으로 바뀌고 Koopa 껍질이 방향을 바꿉니다. 예를 들어 여기 에서 빨간 껍질을 보십시오 .

슈퍼 마리오 레벨이 한 블록 높이이고 모든 그리드 셀이 오른쪽으로 이동하는 쉘을 포함하는 가장 왼쪽 셀을 제외하고 벽돌 또는 빈 공간이라고 가정하십시오. 레벨도 주기적 이므로 쉘이 레벨의 오른쪽 또는 왼쪽 가장자리를 벗어나면 반대쪽으로 다시 들어갑니다. 이 상황에서 쉘은 더 이상 없을 때까지 레벨의 모든 벽돌 블록을 계속 튕겨 나눕니다. 마지막 벽돌 블록이 부서진 직후 껍질이 얼마나 멀리 여행 했습니까?

도전

음수가 아닌 10 진수를 취하는 프로그램이나 함수를 작성하십시오. 선행 0이없는 이진수로 표현 된이 숫자 (단 하나의 예외는 0 자체 임)는 한 블록 높은 수준의 레이아웃을 인코딩합니다. A 1는 벽돌 블록이고 0빈 공간입니다.

Koopa Shell은 레벨의 가장 왼쪽 가장자리에 삽입되며 처음에는 오른쪽으로 이동합니다. 예를 들어 입력과 관련된 레벨 39

>100111

때문에이 100111이진 (39)이며, >그리고 <바로 나타 각각 포탄 이동 떠났다.

마지막 벽돌 블록 (일명 1)이 깨지면 쉘이 이동 한 총 거리를 인쇄하거나 반환해야합니다 .

의 출력 39IS 7와 같은 수준 모양의 변화 :

Level      Cumulative Distance
>100111    0
<000111    0
>000110    0
0>00110    1
00>0110    2
000>110    3
000<010    3
00<0010    4
0<00010    5
<000010    6
000001<    7
000000>    7  <-- output

마찬가지로 출력 61다음과 같습니다.

Level    Cumulative Distance
>110     0
<010     0
001<     1
000>     1  <-- output

의 짧은 코드는 승리 바이트.

참고로, 다음에 대한 입력 출력은 다음 020같습니다.

0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 0
9 0
10 1
11 2
12 2
13 1
14 3
15 3
16 0
17 0
18 1
19 3
20 2

그리고 여기까지 입력까지의 출력이 1000있습니다.

답변:


6

CJam, 29 26 24 바이트

3 바이트를 절약 한 Sp3000에 감사합니다.

q~2b{_1&}{W\({%}*0+}w],(

테스트 스위트. (이것은 모든 결과를 0에서 STDIN에 주어진 정수로 인쇄합니다.)

설명

이것은 이진 문자열을 통해 쉘을 이동시키는 대신, 이진 문자열을 시프트하고 뒤집어 쉘이 항상 앞을 향하게하여 오른쪽을 가리 킵니다.

q~      e# Read and evaluate the input.
2b      e# Convert to base-2 to get the "level".
{_1&}{  e# While there is a 1 in the level...
  W\    e#   Put a -1 below the level.
  (     e#   Pull off the first digit, i.e. the cell the shell is pointing at.
  {     e#   If it's a 1 (i.e. a brick)...
    %   e#     Reverse the level, consuming the -1. This isequivalent to reversing the 
        e#     shell in place.
  }*
  0+    e#   Append a zero. If the cell was a brick, this just replaces it with an empty
        e#   cell. Otherwise, this rotates the level by one cell. This is equivalent 
        e#   to moving the shell one cell through the periodic level.
        e#   Note that if the leading cell was 0, the -1 remains on the stack.
}w
],(     e# Wrap the stack in an array, get its length and decrement.

5

Pyth, 24 바이트

&.WsH_XZeaYxZ1 0jQ2ssPBY

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

다음 22 바이트 코드도 트릭을 수행해야합니다. Pyth 컴파일러의 버그로 인해 현재 작동하지 않습니다.

&u_XGeaYxG1ZjQ2)ssPBPY

편집 : 버그가 수정되었지만 물론 솔루션은 계산되지 않습니다.

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

앞면과 뒷면을 번갈아 가며 다음을 수행합니다.

  • 나는 1을 검색
  • 이 색인을 목록에 넣어서 기억하십시오
  • 이 1을 0으로 업데이트

남은 1이 없으면 거리를 계산합니다. 중요 : 쉘은 마지막 거리를 제외하고 목록의 각 거리를 앞뒤로 두 번 이동합니다.

&.WsH_XZeaYxZ1 0jQ2ssPBY   implicit: Y = empty list
                jQ2        convert input number to binary
 .WsH                      start with Z=^; 
                           while the sum(Z) > 0, apply the the following to Z:
           xZ1                index of 1 in Z
         aY                   append this to Y
        e                     take the last element of Y (=this index)
      XZ       0              set this 1 (at index ^) in Z to 0
     _                        and revert the order of Z
                           this returns a list of zeros
&                          don't print ^, print the next thing
                     PBY   creates the list [Y, Y[:-1]]
                    s      combine these lists
                   s       sum up the distances
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.