Есть хороший способ выполнить длинное умножение для двух целых чисел без необходимости делать что-либо, кроме подсчета, которое иногда используется в интернете. Вы пишете цифры каждого числа в виде ряда наклонных линий с двумя числами под углом 90 градусов. Тогда вы можете просто посчитать пересечения в отдельных столбцах, которые возникают. Диаграмма, вероятно, прояснит это. Вот пример для расчета 21 * 32
:
Если вы воспользуетесь «визуальным / графическим длинным умножением», вы найдете гораздо больше примеров
В этой задаче вы должны сгенерировать эти диаграммы, используя искусство ASCII. Для того же примера вывод будет выглядеть так:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Вероятно, проще всего выяснить правила построения для них из некоторых примеров (см. Ниже), но здесь некоторые детали:
- Пересекающиеся сегменты
X
, не пересекаются отрезки линий/
или\
. - Должен быть ровно один сегмент после самых внешних пересечений.
- Между пересечениями должен быть ровно один сегмент, принадлежащий разным цифрам. Если есть нулевые цифры, это приведет к последовательным
/
или\
сегментам. - Вы должны поддерживать любой положительный ввод (по крайней мере, до некоторого разумного предела, например 2 16 или 2 32 ) и любые цифры от
0
до9
. Тем не менее, вы можете предположить, что нет ни ведущих, ни конечных0
s. - Вы не должны печатать лишние начальные пробелы или начальные или конечные пустые строки.
- Вы можете напечатать конечный пробел, но он не должен превышать ограничивающий прямоугольник диаграммы.
- При желании вы можете распечатать один завершающий символ новой строки.
- Вы можете выбрать, в каком порядке вы берете два входных номера. Однако, вы должны поддерживать произвольные числа для любой ориентации, поэтому вы не можете выбрать что-то вроде «Чем больше число дается первым».
- Если вы принимаете ввод как строку, вы можете использовать любой нецифровый разделитель между двумя числами.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Это код гольф, самый короткий ответ (в байтах) выигрывает.
Примеры
1*1
\ /
X
/ \
2*61
\ /
\ X /
X X /
/ X X /
/ X X /
/ X X /
/ X X
/ X \ /
/ \ X
X \
/ \
45*1
\ /
\ X
\ X \
\ X \
\ X \
X \
\ / \
\ X
\ X \
\ X \
X \
/ \
21001*209
\ /
X /
/ X
/ / \
\ / / \ /
X / X /
\ / X / X /
\ X / \ / / X /
X X \ / / / X /
/ X \ X / / / X /
/ \ \ / X / / / X /
\ X / X / / / X /
X X / X / / / X /
/ X X / X / / / X
/ X X / X / / / \
/ X X / X / /
/ X X / X /
/ X X / X
/ X X / \
/ X X
/ X \
/ \