Trình tự vỏ Koopa


19

Trong các trò chơi Super Mario khác nhau, vỏ Koopa Troopa màu xanh lá câyđỏ có thể trượt không ma sát trên bề mặt phẳng và phá hủy các khối gạch cản đường chúng. Khi một viên đạn va vào khối gạch, khối bị vỡ, biến nó thành không gian trống và vỏ Koopa đảo ngược hướng. Ví dụ, xem vỏ màu đỏ ở đây .

Giả sử một cấp độ Super Mario chỉ cao một khối và mỗi ô lưới là một viên gạch hoặc khoảng trống, ngoại trừ ô ngoài cùng bên trái chứa vỏ di chuyển sang phải. Cấp độ cũng là định kỳ , vì vậy nếu vỏ thoát ra khỏi cạnh phải hoặc trái của cấp độ, nó sẽ nhập lại ở phía đối diện. Trong tình huống này, lớp vỏ sẽ tiếp tục bật ra và phá vỡ tất cả các khối gạch trong cấp độ cho đến khi không còn nữa. Vỏ sẽ đi được bao xa sau khi khối gạch cuối cùng bị vỡ?

Thử thách

Viết chương trình hoặc hàm lấy số nguyên thập phân không âm. Số này, được biểu thị dưới dạng nhị phân không có số 0 đứng đầu (ngoại lệ duy nhất là 0), mã hóa bố cục cấp một khối. A 1là một khối gạch và một 0là không gian trống.

Shell Koopa được chèn ở cạnh trái của cấp độ và ban đầu di chuyển sang phải. Ví dụ: mức liên quan đến đầu vào 39

>100111

bởi vì 100111là 39 trong nhị phân, ><đại diện cho các vỏ di chuyển phải và trái tương ứng.

Bạn cần in hoặc trả lại tổng quãng đường mà vỏ đã di chuyển khi khối gạch cuối cùng (aka 1) bị phá vỡ.

Đầu ra cho 397và những thay đổi ở cấp độ trông như thế này:

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

Tương tự, đầu ra cho 61:

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

Mã ngắn nhất tính bằng byte thắng.

Để tham khảo, đây là những kết quả đầu ra cho các đầu vào 0để 20:

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

Và đây là đầu ra cho đến đầu vào 1000.

Câu trả lời:


6

CJam, 29 26 24 byte

Cảm ơn Sp3000 đã lưu 3 byte.

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

Bộ thử nghiệm. (Điều này in tất cả các kết quả từ 0 đến số nguyên được đưa ra trên STDIN.)

Giải trình

Điều này biến thông số kỹ thuật trên đầu của nó một chút: thay vì di chuyển vỏ qua chuỗi nhị phân, chúng ta dịch chuyển và đảo ngược chuỗi nhị phân sao cho vỏ luôn ở phía trước, chỉ về bên phải:

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

Bình thường, 24 byte

&.WsH_XZeaYxZ1 0jQ2ssPBY

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Mã 22 byte sau đây cũng nên thực hiện thủ thuật. Hiện tại nó không hoạt động, do lỗi trong trình biên dịch Pyth.

&u_XGeaYxG1ZjQ2)ssPBPY

chỉnh sửa: Đã sửa lỗi, nhưng tất nhiên giải pháp không được tính.

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

Xen kẽ từ phía trước và phía sau tôi làm như sau:

  • Tôi tìm kiếm 1
  • Ghi nhớ chỉ số này bằng cách đưa nó vào danh sách
  • Cập nhật 1 này thành 0

Khi không còn 1 giây nào nữa, tôi tính khoảng cách. Quan trọng là: Shell di chuyển mỗi khoảng cách trong danh sách hai lần (tiến và lùi), ngoại trừ khoảng cách cuối cùng.

&.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.