ลำดับเปลือก Koopa


19

ในเกมซูเปอร์มาริโอที่หลากหลายเปลือกหอยสีเขียวและสีแดงของ Koopa Troopaสามารถเลื่อนลงบนพื้นผิวเรียบได้อย่างไม่น่าเชื่อและทำลายบล็อกอิฐที่ขวางทาง เมื่อกระสุนกระทบกับบล็อกอิฐบล็อกจะแตกตัวกลายเป็นพื้นที่ว่างเปล่าและกระสุน Koopa กลับทิศทาง เป็นตัวอย่างที่ดูเปลือกสีแดงที่นี่

สมมติว่าระดับซูเปอร์มาริโอนั้นสูงเพียงหนึ่งบล็อกและเซลล์กริดทุกเซลล์เป็นอิฐหรือพื้นที่ว่างยกเว้นเซลล์ที่อยู่ด้านซ้ายสุดที่มีกระสุนเคลื่อนที่ไปทางขวา ระดับยังเป็นระยะดังนั้นหากเชลล์ออกจากขอบขวาหรือซ้ายของระดับมันจะกลับเข้าสู่ฝั่งตรงข้าม ในสถานการณ์เช่นนี้เปลือกจะยังคงกระเด็นและทำลายบล็อกอิฐทั้งหมดในระดับจนกว่าจะไม่มีอีกต่อไป เปลือกจะเดินทางไกลแค่ไหนหลังจากที่บล็อกอิฐก้อนสุดท้ายแตก?

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในจำนวนเต็มทศนิยมที่ไม่เป็นลบ หมายเลขนี้ซึ่งแสดงในรูปแบบไบนารีโดยไม่มีศูนย์นำหน้า (ข้อยกเว้นเพียงอย่างเดียวคือ 0 เอง) เข้ารหัสเค้าโครงเลย์เอาต์ระดับสูงหนึ่งบล็อก A 1คือบล็อกอิฐและ a 0คือพื้นที่ว่าง

Koopa Shell ถูกแทรกที่ขอบด้านซ้ายของระดับและเริ่มขยับไปทางขวา ตัวอย่างเช่นระดับที่เกี่ยวข้องกับการป้อนข้อมูล39คือ

>100111

เพราะ100111เป็น 39 ในไบนารี่และ>และ<เป็นตัวแทนของเชลล์ที่เคลื่อนที่ทั้งซ้ายและขวาตามลำดับ

คุณต้องพิมพ์หรือคืนค่าระยะทางทั้งหมดที่กระสุนเดินทางเมื่อเปลือกอิฐก้อนสุดท้าย (อาคา1) แตกหัก

ผลลัพธ์สำหรับ39คือ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

ในทำนองเดียวกันผลลัพธ์สำหรับ6คือ1:

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

สำหรับการอ้างอิงต่อไปนี้เป็นผลลัพธ์สำหรับอินพุต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

1000และนี่คือจะแสดงถึงการป้อนข้อมูล

คำตอบ:


6

CJam, 29 26 24 bytes

ขอบคุณ Sp3000 สำหรับการบันทึก 3 ไบต์

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.