вступление
Рассмотрим сетку символов, 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
с