Існує хороший спосіб виконати довге множення двох цілих чисел, не роблячи нічого, крім підрахунку, який час від часу ділиться в Інтернеті. Цифри кожного числа ви записуєте як купу нахилених ліній, з двома числами під кутом 90 градусів. Тоді ви можете просто порахувати перехрестя в окремих стовпцях, що виникають. Діаграма, ймовірно, прояснить це. Ось приклад для розрахунку 21 * 32
:
Якщо ви перейдете на Google для "візуального / графічного довгого множення", ви знайдете набагато більше прикладів.
У цьому виклику ви повинні генерувати ці діаграми, використовуючи арт. ASCII. У цьому ж прикладі результат буде виглядати так:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Напевно, найпростіше з’ясувати правила побудови для них з деяких прикладів (див. Нижче), але ось деякі деталі:
- Пересічні сегменти -
X
це непересічні відрізки ліній/
або\
. - Після самих зовнішніх перехрестів має бути рівно один відрізок.
- Між перехрестями, що належать до різних цифр, має бути рівно один відрізок. Якщо є нульові цифри, це призведе до послідовних
/
або\
сегментів. - Ви повинні підтримувати будь-які позитивні дані (принаймні, до певного розумного обмеження, наприклад 2 16 або 2 32 ), і будь-які цифри від
0
до9
. Однак, ви можете припустити, що немає ні провідних, ні кінцевих0
с. - Ви не повинні друкувати сторонні пробіли або провідні чи кінцеві порожні рядки.
- Ви можете надрукувати пробіли пробілу, але він не повинен перевищувати вікно діаграми, що вирівнюється по осі.
- Ви необов'язково можете надрукувати один зворотний рядок.
- Ви можете вибрати, в якому порядку ви берете два вхідні номери. Однак ви повинні підтримувати довільні числа для будь-якої орієнтації, тому ви не можете вибрати щось на кшталт "Більше число задається першим".
- Якщо ви приймаєте введення як рядок, ви можете використовувати будь-який нецифровий роздільник між двома номерами.
Ви можете написати програму або функцію, взявши введення через 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 \
/ \