Có các thuật toán kiểm tra chữ số phổ biến như Luhn và sau đó có các thuật toán tốt , ví dụ như thuật toán Damm. Lý do duy nhất có thể đằng sau sự phổ biến của các thuật toán như Luhn là có tồn tại các mã triển khai đánh gôn của chúng. Điều này có nghĩa là chúng ta với tư cách là một cộng đồng có khả năng thay đổi thế giới bằng cách cung cấp các triển khai được đánh gôn bằng các thuật toán tốt hơn.
Vì vậy, thách thức này là thay đổi thế giới bằng cách viết một hàm hoặc một chương trình hoàn chỉnh bằng ngôn ngữ bạn chọn để tính toán một chữ số kiểm tra bằng thuật toán Damm . Câu trả lời có số lượng ký tự nhỏ nhất (không phải byte) sẽ được chọn là người chiến thắng trong một vài tuần. Lưu ý rằng tất cả các chức năng trợ giúp và khai báo của bảng thao tác phải được bao gồm trong số ký tự. Trong trường hợp hòa, câu trả lời phổ biến nhất sẽ được chọn.
Thuật toán này xoay quanh một bảng thao tác phải là một nhóm chuẩn đối xứng hoàn toàn yếu đối với thứ tự 10. Bảng thao tác có thể tìm thấy trong bài viết Wikipedia về thuật toán Damm là một thuật toán được sử dụng trong thử thách này. Để hoàn thiện, tôi sẽ sao chép nó dưới đây:
| 0 1 2 3 4 5 6 7 8 9
----+----------------------------------------
0 | 0 3 1 7 5 9 8 6 4 2
1 | 7 0 9 2 1 5 4 8 6 3
2 | 4 2 0 6 8 7 1 3 5 9
3 | 1 7 5 0 9 8 3 4 2 6
4 | 6 1 2 3 0 4 5 9 7 8
5 | 3 6 7 4 2 0 9 5 8 1
6 | 5 8 6 9 7 2 0 1 3 4
7 | 8 9 4 5 3 6 2 0 1 7
8 | 9 4 3 8 6 1 7 2 0 5
9 | 2 5 8 1 4 3 6 7 9 0
Tóm lại (để biết chi tiết xem bài viết Wikipedia ) thuật toán hoạt động như sau:
- Bạn bắt đầu với một danh sách các chữ số sẽ được xử lý và một chữ số tạm thời được đặt thành 0.
- Đối với mỗi chữ số trong danh sách, bạn tính toán một chữ số tạm thời mới bằng cách sử dụng chữ số làm chỉ số cột và chữ số tạm thời trước đó làm chỉ số hàng.
- Chữ số tạm thời cuối cùng là chữ số kiểm tra. Nếu bạn đang xác thực một số đã có chữ số kiểm tra bổ sung, chữ số tạm thời cuối cùng là 0 nếu số đó hợp lệ.
Chương trình hoặc hàm của bạn phải chấp nhận một chuỗi có thể chứa bất kỳ ký tự nào ngoại trừ null, nhưng nó chỉ nên liên quan đến chính các chữ số trong chuỗi. Nó phải in (nếu là chương trình) hoặc trả về (nếu là hàm) chuỗi gốc với chữ số kiểm tra được tính toán được nối thêm. Nếu bạn chọn viết chương trình, chương trình có thể chấp nhận đầu vào là đối số hoặc là đầu vào tiêu chuẩn. Nếu chuỗi đầu vào trống hoặc không chứa bất kỳ chữ số nào, bạn phải trả về hoặc nối thêm số không.
Vài ví dụ:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0