Предположим, что эта сетка пространств и X
s представляет поперечное сечение некоторых странных форм пустых лотков для кубиков льда :
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Столбцы без X
's представляют собой дыры или щели в лотках, которые не могут удерживать воду, стекающие в бесконечный сток. Вода, падающая с самого левого или правого края сетки, также попадает в эту бесконечную раковину.
Если бы мы поместили кран над тарелками и позволили им наполняться водой до тех пор, пока уровень воды во всех отсеках не станет стабильным, точные отсеки, которые будут заполнены, будут зависеть от того, где именно поток воды был расположен над тарелками. (Предположим, тонкий, устойчивый поток воды без брызг.)
Например, если наш кран F
был выше самого левого столбца сетки
F
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
вода будет опускаться до самого верха X
в этой колонне и распространяться влево и вправо, левая половина разливается в раковину внизу, а правая половина заполняет отсек 2 × 1. Как только отсек заполняется, правой половине потока воды больше некуда течь, кроме как в раковину, и уровень воды везде остается практически стабильным.
Выключая кран, лоток теперь выглядит так: (с ~
водой)
X X X
X~~X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Аналогично, если мы расположим кран следующим образом:
F
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Он заполнит два крайних левых отсека, но остальная часть воды уйдет:
X X X
X~~X~X XX X XX X
XXXXXX XXXXXXXXXXXXX
Если мы расположим кран следующим образом:
F
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Левая половина потока будет течь в раковину, но правая половина в конечном итоге заполнит три крайних правых отсека, потому что нет предела тому, как далеко вода может проходить горизонтально на плоской поверхности:
X X~X
X X X XX~X~~XX~~~X
XXXXXX XXXXXXXXXXXXX
Однако позиционируется так:
F
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Вся вода стекает, а отсеки не заполняются:
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Вызов
Напишите программу или функцию, которая принимает прямоугольную сетку из пробелов X
и единиц F
. Верхняя строка всегда будет содержать F
и, в противном случае, только пробелы. В X
«s в каждом столбце (если таковой имеется) будет проходить в виде сплошной линии вверх от основания решетки, то есть не будут никаких пещер или свесов.
Напечатайте или верните решетку после того, как кран F
заполнит водой воду, ~
как описано выше. Оставьте верхний F
ряд за пределами вывода.
Сетка отдельно от ряда кранов будет как минимум 1 × 1, поэтому
F X
это наименьший вклад, который вам нужно поддерживать.
Ввод будет выполнен как полный текстовый прямоугольник. Начальные и конечные пробелы имеют значение при вводе и выводе. например, вход
F X X XXXX
должно привести к
X~~X XXXX
(обратите внимание на начальные и конечные пробелы)
Хорошо иметь только один завершающий символ новой строки на входе или выходе.
Вы можете использовать любые четыре различных печатаемые ASCII символов вместо пространства
X
,F
,~
.
Самый короткий код в байтах побеждает.
Большой пример:
Входные данные:
F
X X
X X X
X XXX X X X X X
X X XXXXXXX X XXX XXXXXXX X X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX
Выход:
X~~~~~~~~~~~~~X
X~~~~~~~~~~~~~X~X
X~~~~~~~~~~~~XXX~~~~~~~X~~~~X~X~~~~~~~~~~~X X
X~~~X~~~~~XXXXXXX~~~~~~X~~~~XXX~~~~~XXXXXXX X X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX
zip()
<3Ответы:
perl -p0, 204 + 2 байта
IDEA
X *X
es наX~*X
es на этом острове.X *X
es наX~*X
es между стоком на нижней стороне и точкой, ближайшей к F, которая выше верхней части нижней стороны.Земля непосредственно ниже F считается частью обеих сторон здесь.
ГОЛЬФ
ЗАМЕТКИ
В этой реализации может быть сложно распознать исходный алгоритм, поскольку Perl не поддерживает вид сзади переменной длины.
источник
Lua 5.2, 581 байт
Опять же, медленный старт с таким неэффективным языком для игры в гольф и с неэффективным алгоритмом. Но я поправлюсь :)
Контрольные примеры (с источником воды):
из bash это можно проверить таким образом, но это выглядит не так красиво:
источник
Javascript, 460 байт
Демо онлайн (в консоли, протестировано в текущих Chrome и Firefox).
Бросить вызов себе не так весело, но все же возможно. Тот же алгоритм, что и у Lua, теперь в javascript.
источник