Introdução
Vamos definir uma nova operação aritmética, que chamo de multiplicação de zíper . Para multiplicar por zíper dois números inteiros não negativos, adicione zeros à esquerda para fazer coincidir os comprimentos, multiplique os dígitos da base 10 correspondentes dos números, adicione zeros à esquerda aos resultados para obter números de 2 dígitos, concatená-los e, finalmente, soltar zeros à esquerda.
Aqui está um exemplo com A = 1276 e 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
A operação é estendida a todos os números inteiros com as regras usuais de sinal: tempos positivos negativos são negativos, tempos negativos negativos são positivos e assim por diante.
A tarefa
Suas entradas são dois números inteiros e sua saída é a multiplicação de zíper. Você deve poder manipular entradas arbitrariamente grandes. A entrada e / ou a saída podem estar no formato de string (e de fato devem estar, se o seu idioma não suportar números inteiros arbitrariamente grandes). Observe que -0
não é uma entrada ou saída válida.
Regras e pontuação
Você pode escrever um programa completo ou uma função, e a menor contagem de bytes vence.
Casos de teste
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
fonte
b⁵
porD
para obter os 10 bytes. : PPython 2, 99 bytes
Muitos bytes existem para contabilizar o sinal em caso de entrada negativa. Em Python,
n%d
sempre é não negativo sed
for positivo 1 . Na minha opinião, isso geralmente é desejável, mas aqui parece inconveniente: remover as chamadas paraabs
quebraria o código acima. Enquanto isso,p
mantém o controle do "valor de posição" (uns, centenas, etc.) e também se lembra do sinal desejado da saída.O código é basicamente simétrico
a
eb
exceto nawhile
condição: continuamos atéa
zero e terminamos nesse momento. É claro que seb
for zero primeiro, acabaremos adicionando zeros por um tempo até quea
seja zero também.1 Por exemplo,
(-33)%10
retorna7
e o quociente inteiro de(-33)/10
é-4
. Isso está correto porque(-4)*10 + 7 = -33
. No entanto, o produto(-33)
com zíper de33
deve terminar em3*3 = 09
vez de7*3 = 21
.fonte
JavaScript (ES6), 44 bytes
Convenientemente, isso funciona automaticamente para números negativos.
fonte
f=
na contagem de bytes. Além disso,|0
é porque eu preciso de divisão inteira, não sei como você acha que está obtendo a resposta certa sem ela.|0
. Talvez a reatribuição da nova função para f não funcionou e eu ainda testei a versão antiga|0
.C, 77 bytes
-2 bytes para remover chaves redundantes (
*
é associativo).t
= 1.100.10000, ... é usado para preenchimento. Enquantoa
oub
não for zero, continue multiplicando o último dígito%10
comt
e acumule. Em seguida, apague o último dígito dea
eb
(/=10
) e desloque-ot
2 dígitos (*=100
).Ungolfed e uso:
fonte
for(r=0;a|b;t*=100)r+=a%10*t*(b%10),a/=10,b/=10
vez der=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100
Na verdade ,
2319 bytesA entrada é tomada como duas cadeias. Além disso, aparentemente, tentar converter da base 100, como ais523 faz em sua resposta Jelly, não funciona tão bem na verdade. Também teria economizado 9 bytes se funcionasse: / Sugestões de golfe são bem-vindas! Experimente online!
Edit: -4 bytes, alterando a forma como o resultado é incorporado em um novo número.
Ungolfing
fonte
Mathematica 66 Bytes
Ungolfed:
onde% significa que a produção anterior produz
fonte
R,
18211010786 bytesNão é mais a resposta mais longa (obrigado, Racket) e, na verdade, mais curta que a solução Python (um tratamento raro)! Uma função anônima que recebe dois números inteiros como entrada.
Aqui está como isso funciona.
A multiplicação do zíper envolve a divisão dos números de entrada em seus dígitos constituintes. Tomamos o valor absoluto do número e executamos o módulo para potências descendentes de 10:
Então, aqui estamos pegando um número
x
,, e aplicando o módulo com outros 99 números (10^99
através10^1
). R repete implicitamentex
99 vezes, retornando um vetor (lista) com 99 elementos. (x %% 10^99
,x %% 10^98
,x %% 10^97
, Etc.)Nós usamos
10^99
através10^1
. Uma implementação mais eficiente usaria o valor do número de dígitos no número mais longo (verifique o histórico de edição desta postagem; as versões anteriores fizeram isso), mas simplesmente usando99..1
usar menos bytes.Pois
x = 1276
isso nos dáEm seguida, usamos a divisão inteira por potências decrescentes de 10 para arredondar os números:
Isso gera
que é exatamente a representação que queremos. No código, acabamos querendo usar
10^(98:0)
novamente mais tarde, então atribuímos a uma variável:(O agrupamento de uma expressão entre parênteses em R geralmente avalia a expressão (nesse caso, atribuindo o valor de
10^(98:0)
ae
) e também retorna a saída da expressão, permitindo incorporar atribuições de variáveis em outros cálculos.)Em seguida, realizamos a multiplicação em pares dos dígitos na entrada. A saída é preenchida com dois dígitos e concatenada. O preenchimento com dois dígitos e a concatenação é equivalente a multiplicar cada número por
10^n
, onden
está a distância da borda direita e depois somar todos os números.Notavelmente, porque a multiplicação é comutativa, podemos realizar a multiplicação por
10^n
diante nós multiplicar A por B . Portanto, tomamos nosso cálculo anterior e multiplicamos por10^(98:0)
:que é equivalente a
Depois de aplicar esta para A , teríamos então quero repetir esta operação inteira em B . Mas isso requer bytes preciosos, por isso definimos uma função e precisamos escrevê-la apenas uma vez:
Realizamos nosso truque de incorporar parênteses para nos permitir definir e aplicar uma função ao mesmo tempo, para chamar essa função em A e B e multiplicá-las. (Poderíamos defini-lo em uma linha separada, mas, como eventualmente colocaremos tudo isso em uma função anônima, se tivermos mais de uma linha de código, tudo precisará ser envolvido em chaves, o que custa um valor valioso bytes.)
E pegamos a soma de tudo isso, e estamos quase terminando:
A única coisa a considerar agora é o sinal da entrada. Queremos seguir regras regulares de multiplicação; portanto, se um e apenas um de A e B for negativo, a saída será negativa. Usamos a função
sign
que retorna1
quando recebe um número positivo e-1
recebe um número negativo, para gerar um coeficiente que multiplicamos todo o cálculo por:Finalmente, tudo está envolvido em uma função anônima que recebe
a
eb
como entrada:Remova o espaço em branco e são 86 bytes.
fonte
Python 3 ,
92 bytes, 119 bytesExperimente online!
A correção para manipular números negativos custa 29 bytes: /
fonte
lstrip
peça envolvendo tudo dentroint()
e retornando um número.Pyke, 16 bytes
Experimente aqui!
Onde é o byte
0x84
ou132
fonte
PHP, 84 bytes
um pouco mais com concatenação de strings (86 bytes):
fonte
Raquete 325 bytes
Ungolfed:
Teste:
Saída:
fonte
PowerShell ,
153151 bytesExperimente online!
Menos golfe:
fonte
Perl 5
-MList::Util=min
, 140 bytesExperimente online!
fonte