Có một cách hay để thực hiện phép nhân dài cho hai số nguyên mà không phải làm gì ngoài việc đếm, đôi khi được chia sẻ trên internet. Bạn viết các chữ số của mỗi số dưới dạng một loạt các đường xiên, với hai số ở góc 90 độ. Sau đó, bạn có thể chỉ cần đếm các giao điểm trong các cột riêng biệt phát sinh. Một sơ đồ có thể sẽ làm rõ điều này. Đây là một ví dụ để tính toán 21 * 32
:
Nếu bạn google cho "nhân dài hình ảnh / đồ họa", bạn sẽ tìm thấy nhiều ví dụ hơn.
Trong thử thách này, bạn phải tạo các sơ đồ này bằng nghệ thuật ASCII. Đối với ví dụ tương tự, đầu ra sẽ như thế này:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Có lẽ dễ nhất để tìm ra các quy tắc xây dựng cho những điều này từ một số ví dụ (xem bên dưới), nhưng ở đây một số chi tiết:
- Các phân đoạn giao nhau là
X
, các phân đoạn không giao nhau của các dòng là/
hoặc\
. - Cần có chính xác một đoạn sau các giao lộ ngoài cùng.
- Cần có chính xác một đoạn giữa các giao điểm thuộc các chữ số khác nhau. Nếu có các chữ số 0, chúng sẽ dẫn đến các phân đoạn
/
hoặc liên tiếp\
. - Bạn phải hỗ trợ bất kỳ đầu vào tích cực nào (ít nhất là đến một số giới hạn hợp lý như 2 16 hoặc 2 32 ) và bất kỳ chữ số nào từ
0
đến9
. Tuy nhiên, bạn có thể cho rằng không có0
s dẫn đầu hay dấu . - Bạn không được in các khoảng trắng hàng đầu bên ngoài hoặc các dòng trống hàng đầu hoặc cuối.
- Bạn có thể in khoảng trắng theo sau nhưng không được vượt quá hộp giới hạn theo trục của sơ đồ.
- Bạn có thể tùy ý in một dòng mới duy nhất.
- Bạn có thể chọn theo thứ tự bạn lấy hai số đầu vào. Tuy nhiên, bạn phải hỗ trợ các số tùy ý cho một trong hai hướng, vì vậy bạn không thể chọn thứ gì đó như "Số lớn hơn được đưa ra trước".
- Nếu bạn đang nhập dữ liệu dưới dạng chuỗi, bạn có thể sử dụng bất kỳ dấu tách không có chữ số nào giữa hai số.
Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).
Đây là mã golf, câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.
Ví dụ
1*1
\ /
X
/ \
2*61
\ /
\ X /
X X /
/ X X /
/ X X /
/ X X /
/ X X
/ X \ /
/ \ X
X \
/ \
45*1
\ /
\ X
\ X \
\ X \
\ X \
X \
\ / \
\ X
\ X \
\ X \
X \
/ \
21001*209
\ /
X /
/ X
/ / \
\ / / \ /
X / X /
\ / X / X /
\ X / \ / / X /
X X \ / / / X /
/ X \ X / / / X /
/ \ \ / X / / / X /
\ X / X / / / X /
X X / X / / / X /
/ X X / X / / / X
/ X X / X / / / \
/ X X / X / /
/ X X / X /
/ X X / X
/ X X / \
/ X X
/ X \
/ \