Вам дано несколько пробирок ASCII, ваша задача - уменьшить количество пробирок.
Каждая пробирка выглядит так:
| |
| |
| |
|~~|
| |
| |
| |
| |
|__|
Очевидно, ~~
это уровень воды. Пробирка также может быть пустой, в этом случае ~~
внутри нет символов. Одиночная труба может содержать до 8 единиц уровня воды.
Вам дают конечное количество пробирок с различным уровнем воды внутри. Вы должны налить воду в наименьшее количество пробирок и вывести результат.
| | | | | | | | |~~| | |
| | | | | | | | | | | |
| | |~~| | | | | | | | |
|~~| | | | | | | | | |~~|
| | | | | | | | ------> | | | |
| | | | | | | | | | | |
| | | | |~~| | | | | | |
| | | | | | | | | | | |
|__| |__| |__| |__| |__| |__|
05 + 06 + 02 + 00 ------> 08 + 05
Как видите, пробирки разделены одним пробелом. Пустые пробирки не должны отображаться на выходе. Это код гольф, поэтому выигрывает код с наименьшим количеством байтов.
Тестовые случаи: http://pastebin.com/BC0C0uii
Удачного игры в гольф!
Ответы:
Пиф,
484544 байтаПопробуйте онлайн.
Печатает один пробел в каждой строке.
источник
JavaScript (ES6),
159148 байтВыводит завершающий перевод строки. Редактировать: Сохранено 11 байт с помощью @Arnauld.
источник
s.replace(/~~/g,(_,i)=>n+=9-i/s.indexOf`\n`|0,n=0)
должен сохранить 4 байта. Вы можете инициализировать n вместо -1 и использоватьn>>3
и,~n&7^i
чтобы сохранить еще один байт.-1
идею, но я смог улучшить ееreplace
.1/"\n"
был правдой.Perl, 150 байт
149 байт кода +
-n
флаг.Я не буду объяснять весь код, только несколько вещей:
$l+=9-$.for/~~/g
подсчитывает, сколько воды на входе.Вторая часть кода печатает вывод. Идея состоит в том, чтобы поместить как можно больше полностью заполненных пробирок и последнюю, в которой содержится оставшаяся вода (если есть). Таким образом, алгоритм в 4 -х частей: печатает первую линию воды (вершина труб):
say"|~~| "x$v.($@="| | ")x$r
. Затем напечатайте пустые части труб до тех пор , пока не достигнет уровня воды последней трубы:say$:=$@x$%for$l%8..6
. Затем распечатайте уровень , где последняя труба воды:say$@x$v."|~~|"x$r
. Затем напечатать все оставшиеся «пустые» уровни:say$:for 2..$l%8;
. И , наконец, печать в нижней строке:say"|__| "x$%
.Имена переменных делают его трудно читать (
$%
,$@
,$:
) , но позволяет ключевые слова , какx
иfor
записываться после переменной без пробела.Чтобы запустить это:
Я не очень доволен тем, как долго этот ответ. Я пытался извлечь максимальную пользу из моего алгоритма, но другой подход мог бы быть короче. Я постараюсь работать над этим в ближайшее время.
источник
Befunge,
144138 байтПопробуйте онлайн!
Первые две строки обрабатывают ввод, в основном игнорируя все, кроме первого символа в каждой трубе, который может быть маркером уровня. Мы берем ASCII-значение этого символа, делим на 2 и mod 2 (давая нам 1 или 0 в зависимости от того, находимся ли мы на маркере уровня или нет), умножаем это на номер строки (начиная с 8, что дает нам значение уровня для этой трубки), и добавьте его к промежуточному итогу.
Вывод обрабатывается во вторых двух строках, по сути, начиная с крайнего правого края третьей строки. Сначала мы рассчитываем количество трубок, беря общий уровень воды плюс 7, деленное на 8. Затем при переборе по строкам всех трубок мы вычисляем символ, который будет отображаться внутри определенной трубки ( t , считая до 0) для заданный ряд ( r , считающий от 8 до 0) следующим образом:
Рассчитываются char_type -1 для нижнего ряда (основание трубки), 0 для любой другой области, которая не является уровнем воды, и 1 для уровня воды. Таким образом, он может использоваться как простой поиск в таблице для соответствующего символа для вывода (вы можете увидеть эту таблицу в начале строки 4).
источник
Haskell, 186 байт
Пример использования:
Помещает пробел в каждой строке. Как это устроено:
Основной болью было отсутствие функции, которая подсчитывает, как часто в строке встречается подстрока. Там же
count
вData.Text
, но импортирования приводит к связке конфликтов имен, которые слишком дороги , чтобы решить.источник
Python, 261 байт
Я чувствую, что что-то упускаю. Кроме того, если несколько пустых строк допустимы для пустого вывода, я могу потерять несколько байтов. Принимает участие как
'| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n|__| |__| |__|'
.источник
Рубин , 139 байт
(138 байт кода плюс один байт для
-n
)Попробуйте онлайн!
Несколько объяснений:
Обновление 1: добавлены подробности о переменных,
gsub
хитрости иEND{
...}
фазе.Обновление 2: (± 0 байт в целом)
n||=0
вместоn=n||0
(-1 байт)-n
(+1 байт)источник
Python 3, 404 байта
Эта программа создает полный предполагаемый результат с уровнями воды как в ASCII, так и в числовом формате.
источник