R, 182 110 107 86 byte
Không còn là câu trả lời dài nhất (cảm ơn, Vợt), và trên thực tế ngắn hơn giải pháp Python (một điều trị hiếm gặp)! Một hàm ẩn danh có hai số nguyên làm đầu vào.
function(a,b)sum((s=function(x)abs(x)%%10^(99:1)%/%(e=10^(98:0))*e)(a)*s(b))*sign(a*b)
Đây là cách nó hoạt động.
Phép nhân dây kéo liên quan đến việc chia các số đầu vào thành các chữ số cấu thành của chúng. Chúng tôi lấy giá trị tuyệt đối của số và thực hiện modulo để giảm dần 10:
abs(x) %% 10^(99:1)
Vì vậy, ở đây chúng tôi lấy một số xvà áp dụng modulo với 99 số khác ( 10^99thông qua 10^1). R ngầm lặp lại x99 lần, trả về một vectơ (danh sách) với 99 phần tử. (x %% 10^99 , x %% 10^98, x %% 10^97, Vv)
Chúng tôi sử dụng 10^99 thông qua 10^1. Việc triển khai hiệu quả hơn sẽ sử dụng giá trị số chữ số trong số dài nhất (kiểm tra lịch sử chỉnh sửa của bài đăng này; các phiên bản trước đã làm điều này), nhưng chỉ cần 99..1sử dụng ít byte hơn.
Vì x = 1276điều này cho chúng ta
1276 1276 1276 ... 1276 276 76 6
Tiếp theo, chúng tôi sử dụng phép chia số nguyên bằng cách giảm 10 lũy thừa để làm tròn các số:
abs(x) %% 10^(99:1) %/% 10^(98:0)
Sản lượng này
0 0 0 ... 1 2 7 6
đó chính xác là đại diện mà chúng ta muốn. Trong mã, cuối cùng chúng tôi muốn sử dụng 10^(98:0)lại, vì vậy chúng tôi gán nó cho một biến:
abs(x) %% 10^(99:1) %/% (e = 10^(98:0))
(Bao bì một biểu thức trong ngoặc đơn trong R thường đánh giá biểu thức (trong trường hợp này, gán giá trị của 10^(98:0)để e), và sau đó cũng trả về kết quả của biểu thức, cho phép chúng tôi tập biến nhúng trong tính toán khác.)
Tiếp theo, chúng tôi thực hiện phép nhân cặp số của các chữ số trong đầu vào. Đầu ra sau đó được đệm thành hai chữ số và nối. Việc đệm thành hai chữ số và ghép nối tương đương với nhân mỗi số với 10^n, trong đón là khoảng cách từ cạnh phải, và sau đó tổng hợp tất cả các số.
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
Đáng chú ý, bởi vì nhân là giao hoán, chúng ta có thể thực hiện các phép nhân bởi 10^n trước khi chúng tôi nhân Một bằng B . Vì vậy, chúng tôi thực hiện tính toán trước đó của chúng tôi và nhân với 10^(98:0):
abs(x) %% 10^(99:1) %/% 10^(98:0) * 10^(98:0)
tương đương với
abs(x) %% 10^(99:1) %/% (e = 10^(98:0)) * e
Sau khi áp dụng này để Một , sau đó chúng tôi sẽ muốn lặp lại toàn bộ thao tác này trên B . Nhưng điều đó cần các byte quý giá, vì vậy chúng tôi xác định một hàm vì vậy chúng tôi chỉ phải viết nó một lần:
s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e
Chúng tôi thực hiện thủ thuật nhúng dấu ngoặc đơn để cho phép chúng tôi xác định và áp dụng một hàm cùng một lúc, để gọi hàm này trên A và B và nhân chúng với nhau. (Chúng ta có thể đã định nghĩa nó trên một dòng riêng biệt, nhưng vì cuối cùng chúng ta sẽ đưa tất cả những thứ này vào một hàm ẩn danh, nếu chúng ta có nhiều hơn một dòng mã thì mọi thứ cần phải được bọc trong các dấu ngoặc nhọn, có giá trị byte.)
(s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)
Và chúng tôi lấy tổng của tất cả những điều này, và chúng tôi sắp hoàn thành:
sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b))
Điều duy nhất cần xem xét bây giờ là dấu hiệu của đầu vào. Chúng tôi muốn tuân theo các quy tắc nhân thông thường, vì vậy nếu một và chỉ một trong A và B là âm, thì đầu ra là âm. Chúng tôi sử dụng hàm signtrả về 1khi được cho một số dương và -1khi được cho một số âm, để đưa ra một hệ số mà chúng tôi nhân toàn bộ phép tính của chúng tôi bằng cách:
sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)) * sign(a * b)
Cuối cùng, toàn bộ điều được gói vào một hàm ẩn danh nhận avà blàm đầu vào:
function(a, b) sum((s = function(x) abs(x) %% 10^(99:1) %/% (e=10^(98:0)) * e)(a) * s(b)) * sign(a * b)
Xóa khoảng trắng và nó là 86 byte.
b⁵bằngDđể có được 10 byte. : P