Koopa Shell Sequence


19

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

Предположим, что уровень Super Mario составляет всего один блок высотой, и каждая ячейка сетки является либо кирпичом, либо пустым пространством, за исключением самой левой ячейки, которая содержит движущуюся вправо оболочку. Уровень также является периодическим , поэтому, если оболочка выходит из правого или левого края уровня, она снова войдет в противоположную сторону. В этой ситуации снаряд продолжит отражаться от всех кирпичных блоков на уровне, пока их больше не будет. Как далеко пройдёт снаряд сразу после того, как сломается последний кирпичный блок?

Вызов

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

Оболочка Купа вставляется в самый левый край уровня и изначально движется вправо. Например, уровень , связанный с входным сигналом 39является

>100111

потому что 10011139 в двоичном, и >и <представляют правую и левую движущиеся оболочки соответственно.

Вам нужно напечатать или вернуть общее расстояние, пройденное оболочкой, после того, как последний кирпичный блок (aka 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

Аналогично, выход для 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

Когда не осталось 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.