Послідовність раковин Koopa


19

У різних іграх Super Mario зелені та червоні снаряди Koopa Troopa можуть безперешкодно ковзати по рівних поверхнях та знищувати цегляні блоки , які їм заважають . Коли снаряд потрапляє в цегляний блок, блок руйнується, перетворюючи його в порожній простір, і оболонка Koopa повертає напрямок. В якості прикладу, подивіться на червону раковину тут .

Припустимо, рівень Super Mario - лише один блок висоти, і кожна комірка сітки - це цегла або порожній простір, за винятком самої лівої комірки, яка містить оболонку, що рухається праворуч. Рівень також періодичний , тому, якщо оболонка виходить з правого або лівого краю рівня, вона знову встане на протилежну сторону. У цій ситуації оболонка продовжуватиме відбиватися від усіх цегляних блоків на рівні, поки не буде більше. Наскільки далеко проїде снаряд після того, як буде розбитий останній цегляний блок?

Виклик

Напишіть програму або функцію, яка приймає невід'ємне десяткове ціле число. Це число, виражене в двійковій формі без провідних нулів (єдиний виняток - 0), кодує макет на рівні одного блоку. A 1цегляний блок, а а 0- порожній простір.

Оболонка Koopa вставлена ​​в самому лівому краї рівня і спочатку рухається праворуч. Наприклад, рівень, пов'язаний з введенням, 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

Аналогічно, вихід для 6IS 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 байти

Завдяки 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

Коли не залишилося жодної секунди, я обчислюю відстань. Важливо: оболонка переміщує кожну відстань у списку двічі (вперед і назад), за винятком останньої відстані.

&.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.