Вызов
Вам предоставляется представление символов ASCII на плоскости в качестве ввода любым разумным способом. Это будет содержать только:
[a-z]
представляющие подвижные персонажи. Каждая буква появится на доске не более одного раза.#
представляющие неподвижные стены.
представляет пустое пространство
Например:
abcdef.gh#..
.......ij.#.
#..#.......#
...#.#...###
.#.......#q#
.........###
Вам также дают строку, представляющую изменения в гравитации. Это будет содержать только:
>
представляет изменение в правой гравитации<
представляющий изменение в левой гравитации^
представляет изменение в сторону увеличения силы тяжестиv
представляющий изменение в нисходящей гравитации
Например:
v>^
Ваша программа должна симулировать каждое изменение гравитации последовательно, пока все персонажи не перестанут двигаться (они ударяются о стену или другого персонажа). Символы, которые «падают с края карты», навсегда удаляются, и персонажи могут «укладываться» друг на друга.
В этом примере, в начале есть вниз сила тяжести ( v
), так что c
, e
, g
, h
, i
, и j
упасть в нижней части карты. Все остальные персонажи скользят вниз до удара о стену, оставляя карту так:
.........#..
a..d......#.
#..#.f.....#
.b.#.#...###
.#.......#q#
.........###
Затем мы переходим к правой гравитации ( >
), что оставляет нас с этим: Обратите внимание, как a
стеки рядом с d
.
.........#..
........ad#.
#..#......f#
..b#.#...###
.#.......#q#
.........###
Наконец, мы моделируем восходящую гравитацию ( ^
), во время которой a
и b
падают с карты.
.........#..
.........d#.
#..#......f#
...#.#...###
.#.......#q#
.........###
Ваша задача - вывести оставшиеся символы после гравитационных сдвигов. Они могут быть даны в любом порядке. Для этого примера вы можете вывести любую перестановку dfq
.
Testcases
Для следующей карты:
abcde
.....
##.##
v = abde
v> = <nothing>
Для следующей карты:
######
#....#
abcdef
#.gh..
######
> = <nothing>
< = gh
^> = bcde
v< = bghef
Ответы:
JavaScript (ES6),
251233 байтаИзменить: Сохранено 18 байт благодаря @WashingtonGuedes.
Работает, поворачивая входную сетку четыре раза для каждого символа направления, но в направлении, где символ направления соответствует символу цикла, мы делаем левую гравитацию. псевдокод:
источник
JavaScript (ES6), 199
Тот же алгоритм ответа @ Нейла. Сетка вращается четыре раза для каждого символа направления, когда в правильном положении гравитационный сдвиг влево применяется к каждому ряду.
источник
Pyth, 143 байта
(Нам действительно нужно столько байтов?)
Попробуйте онлайн!
Как это устроено
Мы определяем функцию,
left
которая выполняет левую гравитацию.Затем другие направления реализуются путём связывания с массивом, так что желаемое направление влево, а затем делайте
left
.Алгоритм
left
здесь:".X"
на"X."
, гдеX
представляет букву.Вся программа разделена на следующие 6 разделов:
Первый раздел
Второй раздел
Третий раздел
Четвертый раздел
Пятый раздел
Шестой раздел
источник
Рубин, 306 байт
Анонимная функция. Довольно обходная техника, которая, вероятно, может быть оптимизирована.
источник