Есть хороший способ выполнить длинное умножение для двух целых чисел без необходимости делать что-либо, кроме подсчета, которое иногда используется в интернете. Вы пишете цифры каждого числа в виде ряда наклонных линий с двумя числами под углом 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 \
/ \
Ответы:
Pyth - 79 байт
Перевод ответа @ AlexeyBurdin. Возможно, можно играть в гольф намного больше.
Принимает ввод в виде двух чисел, разделенных новой строкой. Объяснение в ближайшее время.
Попробуйте это онлайн здесь .
источник
питон, 303
Я думаю, что это достаточно читабельно для человека.
Проверка:
источник
reversed
это то же самое[::-1]
, что вы можете поместить содержимое цикла for в одну строку, чтобы сэкономить на отступах,len(a)+len(b)
корочеsum(map(len,[a,b]))
, не использоватьxrange
в гольфе, пространство) for
можно убрать, и так как вы используя python2, вы можете комбинировать пробелы и табуляции в отступе.276
от простой синтаксической игры в гольф: gist.github.com/Maltysen/e8231c0a9b585e2a4941e=enumerate
в начале игры в гольф 4Python 3, 205 байт
Выражения довольно длинные, поэтому я думаю, что есть много возможностей для улучшения, но в любом случае ...
Принимает ввод через пробел через STDIN, например
В некоторых строках возможен конечный пробел, но он
A+B-2
гарантирует, что все конечные пробелы находятся в ограничительной рамке.источник
C #, 451 байт
Отформатирован для удобства чтения, функция в контексте:
Побитовое ИЛИ было просто для удовольствия, но сложение тоже сработало бы.
источник
JavaScript ( ES6 ) 271
Я уверен, что есть решение, которое строит выходные строки построчно, перебирая математические и x, y координаты (x + y == k, xy == k ...). Но я все еще не могу прибить это.
Итак, вот решение, которое просто рисует линии одну за другой.
Запустите фрагмент в Firefox для проверки.
источник
VC ++
(289)280использование
Полученные результаты
источник
---48
?...)-- - 48)...
.Холст , 41 байт
Попробуй это здесь!
источник
С (329 б)
ПОПЫТАЙСЯ
источник
R , 294 байта
Попробуйте онлайн!
источник
Желе , 58 байт
Попробуйте онлайн!
объяснение
Полная программа, которая принимает два числа в виде списка из двух целых чисел и возвращает строку.
Вспомогательная ссылка 1: повернуть матрицу
Вспомогательная ссылка 2: генерировать шаблоны строк и столбцов
Главная ссылка
источник