R, 182 110 107 86 bytes
Ce n'est plus la réponse la plus longue (merci, Racket), et en fait plus courte que la solution Python (un plaisir rare)! Une fonction anonyme qui prend deux entiers en entrée.
function(a,b)sum((s=function(x)abs(x)%%10^(99:1)%/%(e=10^(98:0))*e)(a)*s(b))*sign(a*b)
Voici comment ça fonctionne.
La multiplication de la fermeture à glissière consiste à diviser les nombres entrés en leurs chiffres constitutifs.Nous prenons la valeur absolue du nombre et effectuons le modulo pour des puissances décroissantes de 10:
abs(x) %% 10^(99:1)
Donc, ici, nous prenons un nombre x
et appliquons modulo avec 99 autres nombres (à 10^99
travers 10^1
). R se répète implicitement x
99 fois, renvoyant un vecteur (liste) avec 99 éléments. ( x %% 10^99
, x %% 10^98
, x %% 10^97
, Etc.)
Nous utilisons à 10^99
travers 10^1
. Une implémentation plus efficace utiliserait la valeur du nombre de chiffres dans le nombre le plus long (vérifiez l'historique des modifications de ce message; les versions précédentes l'ont fait), mais simplement en 99..1
utilisant moins d'octets.
Car x = 1276
cela nous donne
1276 1276 1276 ... 1276 276 76 6
Ensuite, nous utilisons la division entière par des puissances décroissantes de 10 pour arrondir les nombres:
abs(x) %% 10^(99:1) %/% 10^(98:0)
Cela donne
0 0 0 ... 1 2 7 6
qui est exactement la représentation que nous voulons. Dans le code, on finit par vouloir réutiliser 10^(98:0)
plus tard, donc on l'assigne à une variable:
abs(x) %% 10^(99:1) %/% (e = 10^(98:0))
(L'encapsulation d'une expression entre parenthèses dans R évalue généralement l'expression (dans ce cas, attribue la valeur de 10^(98:0)
à e
), puis renvoie également la sortie de l'expression, ce qui nous permet d'incorporer des affectations de variables dans d'autres calculs.)
Ensuite, nous effectuons une multiplication par paire des chiffres dans l'entrée. La sortie est ensuite complétée à deux chiffres et concaténée. Le remplissage à deux chiffres et la concaténation équivaut à multiplier chaque nombre par 10^n
, où n
est la distance à partir du bord droit, puis à additionner tous les nombres.
A = 0 0 1 2 7 6
B = 9 9 3 0 2 4
-> 0 0 3 0 14 24
-> 00 00 03 00 14 24
-> 0*10^6 + 0*10^5 + 3*10^4 + 0*10^3 + 14*10^2 + 24*10^1
= 000003001424
Notamment parce que la multiplication est commutative, nous pouvons effectuer la multiplication par 10^n
avant nous multiplier A par B . Donc, nous prenons notre calcul précédent et multiplions par 10^(98:0)
:
abs(x) %% 10^(99:1) %/% 10^(98:0) * 10^(98:0)
ce qui équivaut à
abs(x) %% 10^(99:1) %/% (e = 10^(98:0)) * e
Après avoir appliqué ce à A , nous voulons alors répéter cette opération tout sur B . Mais cela prend des octets précieux, nous définissons donc une fonction, nous n'avons donc à l'écrire qu'une seule fois:
s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e
Nous faisons notre astuce d'intégration entre parenthèses pour nous permettre de définir et d'appliquer une fonction en même temps, d'appeler cette fonction sur A et B et de les multiplier ensemble. (Nous aurions pu le définir sur une ligne distincte, mais parce que nous allons finalement mettre tout cela dans une fonction anonyme, si nous avons plus d'une ligne de code, tout doit être entouré d'accolades, ce qui coûte cher octets.)
(s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)
Et nous prenons la somme de tout cela, et nous avons presque terminé:
sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b))
La seule chose à considérer maintenant est le signe de l'entrée. Nous voulons suivre des règles de multiplication régulières, donc si un et un seul de A et B est négatif, la sortie est négative. Nous utilisons la fonction sign
qui retourne 1
quand on lui donne un nombre positif et -1
quand on lui donne un nombre négatif, pour produire un coefficient que nous multiplions tout notre calcul par:
sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)) * sign(a * b)
Enfin, le tout est enveloppé dans une fonction anonyme qui prend a
et b
comme entrée:
function(a, b) sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)) * sign(a * b)
Supprimez l'espace et c'est 86 octets.
b⁵
parD
pour obtenir les 10 octets. : P