Как стать автором
Обновить

Комментарии 10

Хорошая статья, спасибо!


Насчет состояния: можно было бы просто перед сдвигом проводить фазу "слияния" — если есть две одинаковых плитки в направлении сдвига то они заменяются на одну удвоенного значения. Тогда у плиток не будет никакого особого собственного состояния. Чтобы не сливать одну и ту же клетку 2 раза достаточно просто никогда не смотреть назад. Тогда получится что-то вроде:


8 8 2 2 0 -->
        ^
8 8 2 2 0 -->
      ^
8 8 2 2 0 -->
    ^
8 8 0 4 0 -->
    ^
8 8 0 4 0 -->
  ^
8 8 0 4 0 -->
^
0 16 0 4 0 -->
^
0 0 0 16 4 -->
^

Хорошая идея, вот только пример у вас как раз смотрит назад. Замените в нем исходную 8 на 4 и все сломается. Правильный пример:


  8 8 2 2 0 -->
          ^ (следующее 2!=0, идем вперед)
  8 8 2 2 0 -->
        ^ (следующее 2==2, заменяем нашу 2 на 4, а следующее 2 на 0, переходим на 2 позиции вперед)
  8 8 0 4 0 -->
    ^ (следующее 8==8, заменяем нашу 8 на 16, а следующее 8 на 0, переходим на 2 позиции вперед)
  0 16 0 4 0 -->
^ (оказались за пределами мира, сдвигаем все к правой границе)
  0 0 0 16 4 -->

Не понял, что должно сломаться. Какая разница мы из iй смотрим в i+1 или из i+1 смотрим в i?

Судя по вашему примеру, вы смотрите на предыдущую цифру, когда решаете, нужно слияние или нет (если что, направление "вперед" — справа налево, вот так: <---).


Так как вы утверждаете, что хранить состояние клетки не нужно, то в ситуации:


8 8 0 4 0 -->
  ^

вы не знаете, 4 уже была или получена слиянием. И если в вашем примере вместо этого будет


8 4 0 4 0 -->
  ^

то вы сольете эти 2 четверки

Не солью, у нас правая граница проходит по нулю. То есть у нас скорее два указателя, на текущий и предыдущий. Просто на картинке решил этого не показывать, видимо зря.

А если начнем с ситуации


8 4 0 4 0

то тоже не сольете? А если сольете, то как вы отличите ее от ситуации с уже произведенным слиянием, если мы не храним состояние ячейки — т.е. не знаем, была она слита за эту итерацию, или с самого начала итерации была такой?

Достаточно смотреть рамки в которых мы смотрим слияние

Как yew по удобности? Всё хочу попробовать, да руки на дошли

Документации маловато.

Огонь статья, спасибо!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории