Introducción
Definamos una nueva operación aritmética, que llamo multiplicación de cremallera . Para que la cremallera multiplique dos enteros no negativos, agrega ceros a la izquierda para hacer que las longitudes coincidan, multiplique los dígitos de base 10 correspondientes de los números, agregue ceros a los resultados para obtener números de 2 dígitos, concatenelos y finalmente suelte los ceros a la izquierda.
Aquí hay un ejemplo con A = 1276 y 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
La operación se extiende a todos los enteros con las reglas de signos habituales: los tiempos positivos negativos son negativos, los tiempos negativos negativos son positivos y así sucesivamente.
La tarea
Sus entradas son dos enteros, y su salida es su multiplicación de cremallera. Debería poder manejar entradas arbitrariamente grandes. La entrada y / o salida puede estar en formato de cadena (y de hecho debe estarlo, si su idioma no admite enteros arbitrariamente grandes). Tenga en cuenta que -0
no es una entrada o salida válida.
Reglas y puntaje
Puede escribir un programa completo o una función, y gana el conteo de bytes más bajo.
Casos de prueba
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
fuente
b⁵
conD
para obtener los 10 bytes. : PPython 2, 99 bytes
Muchos de los bytes están ahí para dar cuenta del signo en caso de entrada negativa. En Python,
n%d
siempre es no negativo sid
es positivo 1 . En mi opinión, esto es generalmente deseable, pero aquí parece inconveniente: eliminar las llamadas aabs
rompería el código anterior. Mientras tanto,p
realiza un seguimiento del "valor posicional" (unos, cientos, etc.) y también recuerda el signo deseado de la salida.El código es básicamente simétrico en
a
yb
excepto en lawhile
condición: continuamos hasta quea
es cero y terminamos en ese momento. Por supuesto, sib
es cero primero, entonces terminaremos agregando ceros por un tiempo hasta que tambiéna
sea cero.1 Por ejemplo,
(-33)%10
devuelve7
, y el cociente entero de(-33)/10
is-4
. Esto es correcto porque(-4)*10 + 7 = -33
. Sin embargo, el producto de la cremallera de(-33)
with33
debe terminar en3*3 = 09
lugar de7*3 = 21
.fuente
JavaScript (ES6), 44 bytes
Convenientemente, esto funciona automáticamente para números negativos.
fuente
f=
en el conteo de bytes. Además,|0
es porque necesito una división entera, no sé cómo crees que estás obteniendo la respuesta correcta sin ella.|0
. Tal vez la reasignación de la nueva función a f no funcionó y todavía probé la versión anterior con|0
.C, 77 bytes
-2 bytes para eliminar llaves redundantes (
*
es asociativo).t
= 1,100,10000, ... se usa para relleno. Mientrasa
ob
no sea cero, sigue multiplicando el último dígito%10
cont
y acumula. Luego, elimine el último dígito dea
yb
(/=10
) y cambiet
2 dígitos (*=100
).Sin golf y uso:
fuente
for(r=0;a|b;t*=100)r+=a%10*t*(b%10),a/=10,b/=10
lugar der=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100
En realidad ,
2319 bytesLa entrada se toma como dos cadenas. Además, aparentemente intentar convertir desde la base 100, como ais523 hace en su respuesta Jelly, no funciona tan bien en realidad. Hubiera ahorrado 9 bytes también si hubiera funcionado: / ¡Se aceptan sugerencias de golf! Pruébalo en línea!
Editar: -4 bytes desde cambiar la forma en que el resultado se construye en un nuevo número.
No golfista
fuente
Mathematica 66 Bytes
Sin golf:
donde% significa los rendimientos de producción anteriores
fuente
R,
182,110,107,86 bytes¡Ya no es la respuesta más larga (gracias, Racket), y de hecho es más corta que la solución Python (un regalo raro)! Una función anónima que toma dos enteros como entrada.
Así es como funciona.
La multiplicación de la cremallera implica dividir los números de entrada en sus dígitos constituyentes. Tomamos el valor absoluto del número y realizamos el módulo para potencias descendentes de 10:
Así que aquí estamos tomando un número,
x
y aplicando módulo con otros 99 números (a10^99
través10^1
). R repite implícitamentex
99 veces, devolviendo un vector (lista) con 99 elementos. (x %% 10^99
,x %% 10^98
,x %% 10^97
, Etc.)Usamos a
10^99
través de10^1
. Una implementación más eficiente usaría el valor del número de dígitos en el número más largo (verifique el historial de edición de esta publicación; las versiones anteriores lo hicieron), pero simplemente toma99..1
menos bytes.Por
x = 1276
esto nos daA continuación, usamos la división de enteros mediante poderes descendentes de 10 para redondear los números:
Esto produce
cuál es exactamente la representación que queremos. En el código, terminamos queriendo usar
10^(98:0)
nuevamente más tarde, por lo que lo asignamos a una variable:(Ajustar una expresión entre paréntesis en R generalmente evalúa la expresión (en este caso, asignando el valor de
10^(98:0)
toe
), y luego también devuelve el resultado de la expresión, lo que nos permite incrustar asignaciones variables dentro de otros cálculos).A continuación, realizamos la multiplicación por pares de los dígitos en la entrada. La salida se rellena luego con dos dígitos y se concatena. El relleno de dos dígitos y la concatenación es equivalente a multiplicar cada número por
10^n
, donden
está la distancia desde el borde derecho, y luego sumar todos los números.En particular, ya que la multiplicación es conmutativa, podemos realizar la multiplicación por
10^n
delante de multiplicamos A por B . Entonces, tomamos nuestro cálculo anterior y lo multiplicamos por10^(98:0)
:que es equivalente a
Después de aplicar esto a A , tendríamos entonces querrá repetir toda esta operación en B . Pero eso requiere bytes preciosos, por lo que definimos una función para que solo tengamos que escribirla una vez:
Hacemos nuestro truco de incrustación entre paréntesis para permitirnos definir y aplicar una función al mismo tiempo, llamar a esta función en A y B y multiplicarlas. (Podríamos haberlo definido en una línea separada, pero debido a que eventualmente pondremos todo esto en una función anónima, si tenemos más de una línea de código, entonces todo debe estar envuelto en llaves, lo que cuesta valioso bytes)
Y tomamos la suma de todo esto, y casi hemos terminado:
Lo único a considerar ahora es el signo de la entrada. Queremos seguir reglas de multiplicación regulares, por lo que si uno y solo uno de A y B es negativo, la salida es negativa. Usamos la función
sign
que regresa1
cuando se le da un número positivo y-1
cuando se le da un número negativo, para generar un coeficiente que multiplicamos todo nuestro cálculo por:Finalmente, todo está envuelto en una función anónima que toma
a
yb
como entrada:Elimina el espacio en blanco y son 86 bytes.
fuente
Python 3 ,
92 bytes, 119 bytesPruébalo en línea!
La solución para manejar números negativos cuesta 29 bytes: /
fuente
lstrip
parte envolviendo todo dentroint()
y devolviendo un número.Pyke, 16 bytes
Pruébalo aquí!
Donde es el byte
0x84
o132
fuente
PHP, 84 bytes
ligeramente más largo con concatenación de cadenas (86 bytes):
fuente
Raqueta 325 bytes
Sin golf:
Pruebas:
Salida:
fuente
PowerShell ,
153151bytesPruébalo en línea!
Menos golfizado:
fuente
Perl 5
-MList::Util=min
, 140 bytesPruébalo en línea!
fuente