В этом задании вам предоставляется карта двумерного ландшафта, если смотреть со стороны. К сожалению, некоторые части местности плавают в воздухе, что означает, что они рухнут. Ваша задача - предсказать, где они приземляются.
Вход
Ваш ввод - это одна или несколько строк одинаковой длины, разделенных символом новой строки, которые содержат только символы #
(знак числа, обозначающий камень) или .
(точку, обозначающую пустое пространство).
Выход
Ваш вывод имеет тот же формат, что и вход, но со следующей модификацией. Давайте рассмотрим входную строку как двумерную сетку камней. Каждая скала на входе, которая соединена с основанием сетки путем соседних скал, является твердой ; другие породы свободны . Диагонально смежные породы не считаются смежными. Все свободные камни упадут прямо вниз и окажутся в виде стека на вершине либо твердого камня, либо нижнего ряда. Рыхлые камни не прикреплены друг к другу, поэтому они падают по отдельности, а не как большие образования. На выходе получается результирующая сетка.
Примеры
Вход
..###. .##.#. .#.... .##.#.
не содержит рыхлых камней, поэтому результат идентичен.
Вход
...#.. .#..#. .#..## .#...# .##### .#...#
содержит один свободный камень наверху, который падает на твердый камень под ним. Выход
...... .#..#. .#..## .#.#.# .##### .#...#
Вход
.#####.... .#....#### ###.###..# #.#...##.. .####..#.# ......###. ..#...#..# ..#...#..#
имеет большую группу рыхлых камней слева. Группа распадается, когда камни падают, поэтому результат
.......... ....###### ..#.###..# . #...##.. .##....#.. .##...#### ####..#..# #####.#..#
Разъяснения
- Вы можете либо взять вход из STDIN и вывести в STDOUT, либо написать функцию.
- Это код-гольф, поэтому самая короткая программа (в байтах) является победителем.
- Стандартные лазейки запрещены.
Ответы:
CJam,
180 ... 133 101 ... 94 9087 байтОпределенно возможно много игры в гольф, но я хотел опубликовать ее первым после того, как полностью ее заработал.Принимает сетку камней (составленную из
.
и#
без завершающей строки) из STDIN и печатает вывод в STDOUTОБНОВЛЕНИЕ : Использование неэффективного, но более короткого частичного заполнения для определения твердых пород.
ОБНОВЛЕНИЕ 2 : Изменен алгоритм падения камней. Теперь короче!
ОБНОВЛЕНИЕ 3 : Сделал несколько небольших оптимизаций, и в конце я смог уменьшить количество байтов до половины исходного кода!
Как это работает :
Для заливки мы перебираем время всей длины сетки (сетки). В каждой итерации мы гарантированно конвертируем по крайней мере 1,
#
которая непосредственно касается пробела, в(пробел). Пространство здесь представляет твердую рок-группу. Таким образом, в конце длинных (сеточных) итераций мы гарантируем, что все твердые породы представлены пробелами.
Попробуйте это онлайн здесь
источник
Perl 5: 98
98, включая 2 флага командной строки.
Объяснение:
источник
JavaScript (ES6) 232
Как функция со строковым параметром и возвращающая строку.
Сначала добавьте нижний ряд «1», чтобы определить линию заземления.
Первый цикл ищет фиксированные камни (которые находятся рядом с «1») и помечает их как «1». Поиск повторяется до тех пор, пока не будут найдены более твердые камни.
Второй цикл перемещает оставшиеся символы «#» к нижнему ряду. Опять же, это повторяется до тех пор, пока ни один камень не может быть перемещен.
Наконец, замените «1» на «#» снова и обрежьте нижний ряд.
Меньше гольфа
Тест (Вы можете иметь доказательства того, какие камни твердые, а какие упали)
источник
APL,
130119Поскольку невозможно (насколько я знаю) вводить новые строки при запросе ввода, эта программа принимает в качестве входных данных матрицу символов.
Используемый алгоритм сначала преобразуется в двоичную матрицу (
0
это воздух и1
камень), а затем заливает заливку из нижнего ряда, чтобы отметить твердые камни как2
. Затем разбейте каждую колонку на «промежутки между твердыми камнями» и рассортируйте каждую перегородку, чтобы рыхлая скала «провалилась» в воздух.Edit1: игра в гольф с использованием другого алгоритма заливки
Тестовые прогоны
Выполнить 1
Определите матрицу символов
A
и напечатайте ее:Затем введите
A
в программу:Run 2
источник
JS - 443 байта
Наводнение заполняет камни со дна, а затем опускает незаполненные камни. Использует много рекурсии с заливкой, поэтому она может немного задержаться в вашем браузере.
Это функция - вызовите ее с
g("input")
JSFiddle: http://jsfiddle.net/mh66xge6/1/
Ungolfed JSFiddle: http://jsfiddle.net/mh66xge6/
источник
Python 3, 364 байта
Я уверен, что из этого можно выжать больше ... но в любом случае он никогда не будет конкурировать с CJam и Perl.
Похож на другие ответы. Одна из странностей заключается в том, что сначала она переворачивает сетку вверх ногами (чтобы сделать индексы цикла более удобными) и добавляет дополнительную строку и столбец
.
(чтобы избежать проблем с переносом-1
индексов). Беги по телефонуP(string)
.источник