Вступление
Давайте определим новую арифметическую операцию, которую я называю умножением молнии . Для умножения двух неотрицательных чисел на молнию вы добавляете начальные нули, чтобы привести в соответствие длины, умножаете соответствующие цифры на 10 оснований, добавляете к результатам ведущие нули, чтобы получить двузначные числа, объединяете их и, наконец, отбрасываете ведущие нули.
Вот пример с A = 1276 и B = 933024 :
1. Add leading zeros
A = 001276
B = 933024
2. Multiply digit-wise
A = 0 0 1 2 7 6
B = 9 9 3 0 2 4
-> 0 0 3 0 14 24
3. Pad to 2 digits
-> 00 00 03 00 14 24
4. Concatenate
-> 000003001424
5. Drop leading zeros
-> 3001424
Операция распространяется на все целые числа с обычными правилами знака: положительное время отрицательное отрицательное, отрицательное время отрицательное положительное и так далее.
Задание
Ваши входные данные представляют собой два целых числа, а ваши выходные данные - их умножение на молнии. Вы должны быть в состоянии обрабатывать произвольно большие входные данные. Ввод и / или вывод могут быть в строковом формате (и действительно должны быть, если ваш язык не поддерживает произвольно большие целые числа). Обратите внимание, что -0
это недопустимый ввод или вывод.
Правила и оценки
Вы можете написать полную программу или функцию, и побеждает меньшее количество байтов.
Контрольные примеры
0 0 -> 0
302 40 -> 0
302 -40 -> 0
-4352 448 -> -122016
0 6623 -> 0
0 -6623 -> 0
20643 -56721 -> -1000420803
63196 21220 -> 1203021800
1276 933024 -> 3001424
-1276 933024 -> -3001424
-1276 -933024 -> 3001424
5007204555 350073039 -> 12001545
-612137119 -8088606033 -> 816060042000327
3389903661 -6619166963 -> -18180881090018543603
-23082746128560880381 1116941217 -> -8050600723200060807
-668336881543038127783364011867 896431401738330915057436190556 -> -485448120906320001351224000900090235004021121824000900403042
402878826066336701417493206805490000415 312487283677673237790517973105761463808 -> 120004325656161618004242182118140007280900200921180018080025285400000000320040
источник
b⁵
на,D
чтобы получить 10 байтов. : PPython 2, 99 байт
Многие байты предназначены для учета знака в случае отрицательного ввода. В Python
n%d
всегда неотрицательно, еслиd
положительно 1 . На мой взгляд, это, как правило, желательно, но здесь это кажется неудобным: удаление вызововabs
нарушит приведенный выше код. Тем временемp
отслеживает «значение места» (единицы, сотни и т. Д.), А также запоминает желаемый знак вывода.Код в основном симметричен в
a
иb
за исключениемwhile
условия: мы продолжаем идти до тех пор, покаa
не достигнем нуля, и завершаем в это время. Конечно, еслиb
сначала ноль, то мы в конечном итоге добавим нули на некоторое время, пока также неa
будет ноль.1 Например,
(-33)%10
возвращает7
, а целочисленное отношение(-33)/10
является-4
. Это правильно, потому что(-4)*10 + 7 = -33
. Тем не менее, молния продукт(-33)
с33
должен закончиться ,3*3 = 09
а не7*3 = 21
.источник
JavaScript (ES6), 44 байта
Удобно, это автоматически работает для отрицательных чисел.
источник
f=
в число байтов. Кроме того,|0
потому что мне нужно целочисленное деление, я не знаю, как вы думаете, вы получите правильный ответ без него.|0
. Возможно, переназначение новой функции для f не сработало, и я все еще тестировал старую версию с|0
.C 77 байт
-2 байта для удаления лишних скобок (
*
является ассоциативным).t
= 1,100,10000, ... используется для заполнения. Пока нольa
илиb
нет, продолжайте умножать последнюю цифру%10
наt
и накапливать. Затем уменьшите последнюю цифруa
иb
(/=10
) и сдвиньте наt
2 цифры (*=100
).Ungolfed и использование:
источник
for(r=0;a|b;t*=100)r+=a%10*t*(b%10),a/=10,b/=10
вместоr=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100
На самом деле ,
2319 байтовВвод принимается в виде двух строк. Кроме того, очевидно, что попытка выполнить конвертацию из базы 100, как это делает ais523 в ответе Jelly, на самом деле не очень хорошо работает. Сэкономил бы 9 байтов тоже, если бы это работало: / Гольф предложения приветствуются! Попробуйте онлайн!
Изменить: -4 байта от изменения того, как результат встроен в новый номер.
Ungolfing
источник
Mathematica 66 байт
Ungolfed:
где% означает предыдущий выход
источник
R
18211010786 байтБольше не самый длинный ответ (спасибо, Ракетка), и фактически короче, чем решение Python (редкое удовольствие)! Анонимная функция, которая принимает два целых числа в качестве входных данных.
Вот как это работает.
Умножение на молнии включает в себя разбиение входных чисел на составляющие их цифры. Мы берем абсолютное значение числа и выполняем по модулю для убывающих степеней 10:
Итак, здесь мы берем одно число
x
и применяем по модулю 99 других чисел (10^99
через10^1
). R неявно повторяетсяx
99 раз, возвращая вектор (список) с 99 элементами. (x %% 10^99
,x %% 10^98
,x %% 10^97
И т.д.)Мы используем до
10^99
конца10^1
. Более эффективная реализация будет использовать значение числа цифр в самом длинном числе (проверьте историю редактирования этого поста; предыдущие версии делали это), но просто взятие99..1
использует меньше байтов.Ибо
x = 1276
это дает намДалее мы используем целочисленное деление на убывающие степени 10, чтобы округлить числа:
Это дает
это именно то представление, которое мы хотим. В коде мы хотим
10^(98:0)
снова использовать его позже, поэтому мы присваиваем его переменной:(Заключение выражения в круглые скобки в R обычно оценивает выражение (в этом случае присваивая значение
10^(98:0)
toe
), а затем также возвращает вывод выражения, позволяя нам встраивать присваивания переменных в другие вычисления.)Далее мы выполняем попарное умножение цифр на входе. Выходные данные затем дополняются до двух цифр и объединяются. Заполнение до двух цифр и объединение эквивалентны умножению каждого числа на
10^n
, гдеn
расстояние от правого края, а затем суммированию всех чисел.В частности, потому , что умножение коммутативно, мы можем выполнить умножение ,
10^n
прежде чем мы умножаем A по B . Итак, мы берем наш предыдущий расчет и умножаем на10^(98:0)
:что эквивалентно
После применения этого к А , мы бы тогда хотим повторить всю эту операцию B . Но это занимает драгоценные байты, поэтому мы определяем функцию, поэтому нам нужно написать ее только один раз:
Мы делаем трюк с встраиванием в скобки, чтобы позволить нам одновременно определять и применять функцию, вызывать эту функцию для A и B и умножать их вместе. (Мы могли бы определить это в отдельной строке, но поскольку в конечном итоге мы собираемся поместить все это в анонимную функцию, если у нас более одной строки кода, все должно быть заключено в фигурные скобки, что стоит ценно байт.)
И мы берем сумму всего этого, и мы почти закончили:
Единственное, что нужно учесть - это знак ввода. Мы хотим следовать обычным правилам умножения, поэтому, если один и только один из A и B отрицателен, результат будет отрицательным. Мы используем функцию,
sign
которая возвращает,1
когда дано положительное число, а-1
когда дано отрицательное число, чтобы вывести коэффициент, который мы умножаем во всех наших вычислениях на:Наконец, все это обернуто в анонимную функцию, которая принимает
a
и вb
качестве входных данных:Удалите пробелы, и это 86 байтов.
источник
Python 3 ,
92 байта, 119 байтовПопробуйте онлайн!
Исправление для обработки отрицательных чисел стоимостью 29 байт: /
источник
lstrip
часть, обернув все внутриint()
и вернув число.Пайк, 16 байт
Попробуй это здесь!
Где - байт
0x84
или132
источник
PHP, 84 байта
немного длиннее с конкатенацией строк (86 байт):
источник
Ракетка 325 байт
Ungolfed:
Тестирование:
Выход:
источник
PowerShell ,
153151 байтПопробуйте онлайн!
Менее гольф:
источник
Perl 5
-MList::Util=min
, 140 байтПопробуйте онлайн!
источник