introduction
Définissons une nouvelle opération arithmétique, que j'appelle la multiplication à glissière . Pour zipper multiplier deux entiers non négatifs, vous ajoutez des zéros de tête pour faire correspondre les longueurs, multipliez les 10 chiffres de base correspondants des nombres, ajoutez des zéros de tête aux résultats pour obtenir des nombres à 2 chiffres, concaténez-les et enfin supprimez les zéros de tête.
Voici un exemple avec A = 1276 et 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
L'opération est étendue à tous les entiers avec les règles de signe habituelles: les temps positifs négatifs sont négatifs, les temps négatifs négatifs sont positifs et ainsi de suite.
La tâche
Vos entrées sont deux entiers, et votre sortie est leur multiplication à glissière. Vous devriez pouvoir gérer des entrées arbitrairement grandes. L'entrée et / ou la sortie peuvent être au format chaîne (et doivent l'être, si votre langue ne prend pas en charge des entiers arbitrairement grands). Notez que ce -0
n'est pas une entrée ou une sortie valide.
Règles et notation
Vous pouvez écrire un programme complet ou une fonction, et le nombre d'octets le plus bas l'emporte.
Cas de test
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
la source
b⁵
parD
pour obtenir les 10 octets. : PPython 2, 99 octets
Beaucoup d'octets sont là pour tenir compte du signe en cas d'entrée négative. En Python,
n%d
est toujours non négatif sid
est positif 1 . À mon avis, cela est généralement souhaitable, mais ici cela semble gênant: supprimer les appels àabs
casserait le code ci-dessus. Pendant ce temps,p
garde une trace de la «valeur de position» (un, des centaines, etc.) et se souvient également du signe souhaité de la sortie.Le code est fondamentalement symétrique dans
a
etb
sauf dans lawhile
condition: nous continuons jusqu'à ce quea
soit zéro, et nous terminons à ce moment. Bien sûr, sib
zéro est d'abord, nous finirons par ajouter des zéros pendant un certain temps jusqu'à ce quea
zéro soit également.1 Par exemple,
(-33)%10
renvoie7
et le quotient entier de(-33)/10
est-4
. C'est correct parce que(-4)*10 + 7 = -33
. Cependant, le produit de fermeture éclair de(-33)
avec33
doit se terminer par3*3 = 09
plutôt que7*3 = 21
.la source
JavaScript (ES6), 44 octets
Idéalement, cela fonctionne automatiquement pour les nombres négatifs.
la source
f=
dans le nombre d'octets. De plus,|0
c'est parce que j'ai besoin d'une division entière, je ne sais pas comment vous pensez que vous obtenez la bonne réponse sans elle.|0
. Peut-être que la réaffectation de la nouvelle fonction à f n'a pas fonctionné et j'ai quand même testé l'ancienne version avec|0
.C, 77 octets
-2 octets pour supprimer les accolades redondantes (
*
est associatif).t
= 1,100,10000, ... est utilisé pour le rembourrage. Tant quea
oub
n'est pas nul, multipliez le dernier chiffre%10
avect
et accumulez. Effacez ensuite le dernier chiffre dea
etb
(/=10
) et décalezt
de 2 chiffres (*=100
).Non golfé et utilisation:
la source
for(r=0;a|b;t*=100)r+=a%10*t*(b%10),a/=10,b/=10
place der=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100
En fait ,
2319 octetsL'entrée est considérée comme deux chaînes. De plus, essayer de convertir à partir de la base 100, comme le fait ais523 dans sa réponse Jelly, ne fonctionne pas si bien dans Actually. Aurait économisé 9 octets aussi si cela avait fonctionné: / Suggestions de golf bienvenues! Essayez-le en ligne!
Modifier: -4 octets de changer la façon dont le résultat est construit dans un nouveau nombre.
Ungolfing
la source
Mathematica 66 octets
Non golfé:
où% signifie le rendement précédent
la source
R,
18211010786 bytesCe 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.
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:
Donc, ici, nous prenons un nombre
x
et appliquons modulo avec 99 autres nombres (à10^99
travers10^1
). R se répète implicitementx
99 fois, renvoyant un vecteur (liste) avec 99 éléments. (x %% 10^99
,x %% 10^98
,x %% 10^97
, Etc.)Nous utilisons à
10^99
travers10^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 en99..1
utilisant moins d'octets.Car
x = 1276
cela nous donneEnsuite, nous utilisons la division entière par des puissances décroissantes de 10 pour arrondir les nombres:
Cela donne
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:(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.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 par10^(98:0)
:ce qui équivaut à
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:
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.)
Et nous prenons la somme de tout cela, et nous avons presque terminé:
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 retourne1
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:Enfin, le tout est enveloppé dans une fonction anonyme qui prend
a
etb
comme entrée:Supprimez l'espace et c'est 86 octets.
la source
Python 3 ,
92 octets, 119 octetsEssayez-le en ligne!
Correctif pour la gestion des nombres négatifs coûte 29 octets: /
la source
lstrip
pièce en enveloppant tout à l'intérieurint()
et en renvoyant un numéro.Pyke, 16 octets
Essayez-le ici!
Où est l'octet
0x84
ou132
la source
PHP, 84 octets
légèrement plus long avec concaténation de chaînes (86 octets):
la source
Raquette 325 octets
Non golfé:
Essai:
Production:
la source
PowerShell ,
153151 octetsEssayez-le en ligne!
Moins golfé:
la source
Perl 5
-MList::Util=min
, 140 octetsEssayez-le en ligne!
la source