R, 182 110 107 86 byte
Tidak lagi jawaban terpanjang (terima kasih, Racket), dan bahkan lebih pendek dari solusi Python (yang jarang terjadi)! Fungsi anonim yang mengambil dua bilangan bulat sebagai input.
function(a,b)sum((s=function(x)abs(x)%%10^(99:1)%/%(e=10^(98:0))*e)(a)*s(b))*sign(a*b)
Begini cara kerjanya.
Penggandaan ritsleting melibatkan pemisahan angka-angka input ke dalam digit konstituennya. Kami mengambil nilai absolut dari angka dan melakukan modulo untuk menurunkan daya 10:
abs(x) %% 10^(99:1)
Jadi di sini kita mengambil satu angka x
,, dan menerapkan modulo dengan 99 nomor lainnya ( 10^99
sampai 10^1
). R mengulangi secara implisit x
99 kali, mengembalikan vektor (daftar) dengan 99 elemen. ( x %% 10^99
, x %% 10^98
, x %% 10^97
, Dll)
Kami menggunakan 10^99
melalui 10^1
. Implementasi yang lebih efisien akan menggunakan nilai jumlah digit dalam jumlah terpanjang (periksa riwayat edit posting ini; versi sebelumnya melakukan ini), tetapi hanya mengambil99..1
menggunakan byte lebih sedikit.
Untuk x = 1276
ini memberi kita
1276 1276 1276 ... 1276 276 76 6
Selanjutnya, kami menggunakan divisi integer dengan menurunkan kekuatan 10 untuk melengkapi angka:
abs(x) %% 10^(99:1) %/% 10^(98:0)
Ini menghasilkan
0 0 0 ... 1 2 7 6
yang merupakan representasi yang kita inginkan. Dalam kode, kami akhirnya ingin menggunakan 10^(98:0)
lagi nanti, jadi kami menetapkannya ke variabel:
abs(x) %% 10^(99:1) %/% (e = 10^(98:0))
(Membungkus ekspresi dalam tanda kurung di R umumnya mengevaluasi ekspresi (dalam hal ini, menetapkan nilai 10^(98:0)
untuke
), dan kemudian juga mengembalikan output dari ekspresi, memungkinkan kami untuk menanamkan penugasan variabel dalam perhitungan lain.)
Selanjutnya, kami melakukan penggandaan digit secara berpasangan pada input. Outputnya kemudian diisi hingga dua digit dan digabungkan. Padding ke dua digit dan penggabungan setara dengan mengalikan setiap angka dengan 10^n
, di mana n
jarak dari tepi kanan, dan kemudian menjumlahkan semua angka.
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
Terutama, karena perkalian komutatif, kita dapat melakukan perkalian dengan 10^n
sebelum kita kalikan A dengan B . Jadi, kami mengambil perhitungan sebelumnya dan mengalikannya dengan 10^(98:0)
:
abs(x) %% 10^(99:1) %/% 10^(98:0) * 10^(98:0)
yang setara dengan
abs(x) %% 10^(99:1) %/% (e = 10^(98:0)) * e
Setelah menerapkan ini untuk A , kita kemudian akan ingin mengulang seluruh operasi ini pada B . Tapi itu membutuhkan byte yang berharga, jadi kita mendefinisikan suatu fungsi jadi kita hanya perlu menulisnya sekali:
s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e
Kami melakukan trik embedding-in-kurung kami untuk memungkinkan kami mendefinisikan dan menerapkan fungsi pada saat yang sama, untuk memanggil fungsi ini pada A dan B dan melipatgandakannya bersama-sama. (Kita bisa mendefinisikannya pada baris terpisah, tetapi karena kita akhirnya akan menempatkan semua ini ke dalam fungsi anonim, jika kita memiliki lebih dari satu baris kode maka semuanya perlu dibungkus dengan kurung kurawal, yang harganya berharga byte.)
(s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)
Dan kita mengambil jumlah semua ini, dan kita hampir selesai:
sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b))
Satu-satunya hal yang perlu dipertimbangkan sekarang adalah tanda input. Kami ingin mengikuti aturan perkalian reguler, jadi jika satu dan hanya satu dari A dan B negatif, hasilnya negatif. Kami menggunakan fungsi sign
yang mengembalikan 1
ketika diberi angka positif dan -1
ketika diberi angka negatif, untuk menghasilkan koefisien yang kami kalikan seluruh perhitungan kami dengan:
sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)) * sign(a * b)
Akhirnya, semuanya dibungkus menjadi fungsi anonim yang mengambil a
dan b
sebagai input:
function(a, b) sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)) * sign(a * b)
Hapus spasi dan itu 86 byte.
b⁵
denganD
untuk mendapatkan 10 byte. : P