вступление
Рассмотрим сетку символов, f A\/таких как
f f f
A
A / \
\ / A
A \/
/
\/
где:
fпредставляет собой кран, который льет поток воды внизAразветвляется поток воды выше, так что ровно половина идет влево, а ровно половина идет вправо\смещает поток воды вверх вправо на одну единицу/смещает поток воды выше на одну единицу- комбинации
\/создают желоб с бесконечной емкостью, который собирает потоки воды над ним [space]пустое пространство, через которое вода может пройти
Исходя из этого, мы можем представить себе путь, по *которому будет идти water ( ), когда он выходит из смесителей и падает либо в желоба, либо из области сетки:
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
Предполагая, что 3 крана выводят одинаковое количество воды по одному, мы видим, что
- Вся вода первого крана поступает в нижний желоб.
- Одна половина воды второго крана поступает в нижний желоб, а другая половина делится между нижним желобом и падает с решетки.
- Одна четверть воды третьего крана поступает в нижнюю впадину, одна четверть падает с нижней части решетки, одна четверть попадает в верхнюю впадину, а одна четверть падает с решетки вправо.
Отсюда можно сказать, что (1 + 3/4 + 1/4 + 1/4) / 3 = 75%вода попадает в кормушки и (1/4 + 1/4 + 1/4) / 3 = 25%падает с сетки.
проблемы
Вы можете выполнить любую или все эти задачи, связанные с данной настройкой потока воды ASCII. Все они - код-гольф, самый короткий ответ на каждый вызов - победитель. Принятым ответом будет тот, кто выполнит большинство задач, с общей длиной кода в качестве тай-брейка.
Задача 1
Напишите программу, которая выводит долю воды, которая течет в впадины для данной сетки. Выход из приведенного выше примера будет просто 0.75.
Задача 2
Напишите программу, которая, учитывая сетку, рисует *в местах, где течет вода, как я делал выше. Вы не должны перезаписывать ничего, кроме пробелов, и сетка не должна изменять размер. Так что для чего-то вроде
f
/A
ничего не нужно делать, поскольку, хотя вода течет по обе стороны от А, ее нельзя нарисовать влево, не удалив, /и нельзя нарисовать вправо, не увеличив размер сетки 2 × 2.
Задача 3 (обновлено)
Напишите программу, которая принимает два неотрицательных целых числа, общее количество T и сумму, которую нужно сохранить K (T> = K). Создайте и нарисуйте сетку с ровно одной fтакой, чтобы, когда этот кран изливал Т единиц воды, точно K попадет в желоба. Если это невозможно сделать в конечной сетке для конкретной пары (T, K), выведите «Impossible».
Разъяснения (применимо ко всем задачам)
- Ввод может быть через стандартный ввод, или файл, или даже вызов функции для строкового представления сетки. Просто сделайте очевидным, как запустить разные входы.
- Выход должен идти в стандартный вывод.
\AаA/иAAтакже впадины , как и следовало ожидать.- Сетка w на h всегда будет хорошо отформатированным прямоугольником с символами w * h без учета перевода строки. Не будет пропущенных пробелов и вхождений
*. - Размеры сетки могут быть как 1 × 1, так и произвольно большими. (Произвольно большой в пределах разумного, int.maxValue или тому подобное является приемлемым пределом. То же самое касается T и K.)
- Поток выше потока
fтечет прямо через него. - Смесители могут быть где угодно, а не только в верхнем ряду.
Aвсегда делит количество налитой на него воды ровно пополам.
Примечание: такие вещи, как /Aи //являются совершенно действительными. Вода делает свободно перетекать между символами (хотя для задачи 2 там не хватает места , чтобы сделать это).
Итак, в настройках
ff
/A
Левый fпоток льется вниз, ударяется /и смещается влево. Правый fпоток льется вниз, ударяется о A, половина идет вправо, а половина идет влево между Aи /.
например
ff
**
*/A*
** *
** *
/Aесли вода падает на A. Для всех проблем было бы хорошо уточнить, \Aявляется ли корыто. Для третьего вызова следует Aли предположить , что 3 падающие на единицу единицы делятся 1.5 / 1.5(так что на самом деле вход представляет собой одно рациональное число) или это так 2 / 1, и в каком случае какая сторона получает 2?
Aто обе стороны получат 1,5. Это зависит от кодера, чтобы убедиться, что точность с плавающей точкой не является проблемой.)
fс