вступление
Рассмотрим сетку символов, 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*
** *
** *
f
с/A
если вода падает наA
. Для всех проблем было бы хорошо уточнить,\A
является ли корыто. Для третьего вызова следуетA
ли предположить , что 3 падающие на единицу единицы делятся1.5 / 1.5
(так что на самом деле вход представляет собой одно рациональное число) или это так2 / 1
, и в каком случае какая сторона получает2
?A
то обе стороны получат 1,5. Это зависит от кодера, чтобы убедиться, что точность с плавающей точкой не является проблемой.)Ответы:
Все испытания C # 690 байт (416 байт + 274 байт)
Задачи 1 и 2 C #
579446 416байтЭто полная программа, которая должна выполнить задачи 1 и 2, примерно. Он читает строки ввода из стандартного ввода, пока не получит пустую строку. Он выводит результат для Challenge 2, а затем результат для Challenge 1. Использует десятичный класс .NET, чтобы избежать ошибок округления.
Менее гольф:
Тестовый прогон (с отсутствием пробелов, которые, я обещаю, есть):
Задача 3 C # 274 байта
Это полная программа, которая должна завершить задачу 3. Мне удалось сэкономить 6 байтов, написав свой собственный целочисленный синтаксический анализатор для чтения входных данных вместо того, чтобы
Split
использоватьReadLine
и использоватьlong.Parse
;Менее гольф:
Тестовый прогон (опять же с отсутствием пробелов, которые, я обещаю, есть):
источник
Прежде всего, у меня есть вопрос относительно проблемы. Поскольку у меня недостаточно репутации, чтобы комментировать вопрос, я пишу это здесь:
/A
(вода течет по A),//
(вода течет по правой стороне) и вариации этого принципа? Вода течет к первому «свободному месту» сбоку или течет «ниже» своего соседа?Просто попробуйте, это может быть упрощено (что я сделаю позже, отредактировав этот пост).
Изменить: Вторая версия, немного меньше. Я пошел по другому подходу: вместо того, чтобы искать каждую ячейку, чтобы проверить, что идет сверху и сбоку, я начинаю с кранов и «теку» вниз с рекурсией.
Javascript, 226 байт (Задача 1)
Javascript, 204 байта (Задача 2)
Javascript, 238 байт (Задача 1 + 2)
Как пользоваться
Обеспечьте двухмерное представление карты. Вот пример, приведенный в вопросе:
Выход
Задача 1: Он просто создаст диалоговое окно (предупреждение) с результатом (0,75 для примера выше).
Задача 2: Он напрямую изменит карту. Должен ли я распечатать это? Если так, будет ли console.log принят? как действительный вывод?
Задача 1 + 2: оба из вышеперечисленных, очевидно, ...
источник
A
или косые черты. Я уточнил это в вопросе.Output must go to stdout.
str[0]
строки. Это был бы массив строк вместо массива символов.Python 3, 186 байт (задача 3)
Я взял идею сетки из ответа VisualMelon . Функция должна выводить действительную сетку в стандартный вывод для произвольно больших T и K, если это возможно (конечно-размерная сетка), конечно.
Как пользоваться
Вызовите
c
функцию с общей суммой и суммой, чтобы сохранить в качестве аргументов.источник