Ada algoritma memeriksa digit populer seperti Luhn dan kemudian ada yang bagus , misalnya algoritma Damm. Satu-satunya alasan yang mungkin di balik popularitas algoritma seperti Luhn adalah bahwa ada implementasi kode golf dari mereka. Ini berarti bahwa kita sebagai komunitas memiliki kekuatan untuk mengubah dunia dengan menyediakan implementasi algoritme yang lebih baik.
Jadi tantangan ini adalah untuk mengubah dunia dengan menulis fungsi atau program lengkap dalam bahasa pilihan Anda yang menghitung digit periksa menggunakan algoritma Damm . Jawaban dengan jumlah karakter terkecil (bukan byte) akan dipilih sebagai pemenang dalam beberapa minggu. Perhatikan bahwa semua fungsi bantuan dan deklarasi tabel operasi harus dimasukkan dalam jumlah karakter. Dalam kasus seri, jawaban yang paling populer akan dipilih.
Algoritma ini berputar di sekitar tabel operasi yang harus menjadi kuasigroup orde 10. yang benar-benar anti-simetris yang lemah. Tabel operasi yang dapat ditemukan di artikel Wikipedia tentang algoritma Damm adalah yang akan digunakan dalam tantangan ini. Demi kelengkapan saya akan mereproduksi di bawah ini:
| 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
Singkatnya (untuk detail lihat artikel Wikipedia ) algoritme berfungsi sebagai berikut:
- Anda mulai dengan daftar digit yang akan diproses dan digit sementara yang ditetapkan ke 0.
- Untuk setiap digit dalam daftar Anda menghitung angka sementara baru dengan menggunakan angka sebagai indeks kolom dan angka sementara sebelumnya sebagai indeks baris.
- Digit interim final adalah digit periksa. Jika Anda memvalidasi angka yang sudah memiliki digit periksa ditambahkan, angka interim akhir adalah 0 jika angka tersebut valid.
Program atau fungsi Anda harus menerima string yang dapat berisi karakter apa pun kecuali nol, tetapi itu harus hanya menyangkut dirinya sendiri dengan digit dalam string. Ia harus mencetak (jika suatu program) atau mengembalikan (jika suatu fungsi) string asli dengan digit periksa yang dihitung ditambahkan. Jika Anda memilih untuk menulis program, program dapat menerima input sebagai argumen atau sebagai input standar. Jika string input kosong atau tidak mengandung digit apa pun, Anda harus mengembalikan atau menambahkan nol.
Beberapa contoh:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0
Jawaban:
Pyth, 49 karakter
Berisi tuhan yang tahu karakter apa, jadi inilah program Python3 untuk menghasilkan program di atas secara akurat di komputer Anda:
Penjelasan:
sumber
CJam, 54 karakter
Ada satu karakter yang tidak patut dicetak di sana, jadi Anda mungkin ingin menggunakan permalink di bawah ini.
Uji di sini.
Penjelasan
Digit sementara sedang dilacak
T
, yang diinisialisasi CJam menjadi 0sumber
Python 3,
149 141138 karakterContoh:
Terima kasih kepada @MegaTom dan @Sieg karena telah membantu menghapus total 11 karakter
sumber
Ruby, 149 karakter
Diuji pada repl.it
sumber
J, 117 byte
Hanya mengandung ascii yang dapat dicetak. (Saya mengalami kesulitan dengan J dan unicode.) Menghasilkan tabel transisi dari permutasi-indeks dari baris.
Pemakaian:
Cobalah online di sini.
sumber
Haskell, 131 karakter
Uji coba:
sumber
k, 36 karakter
q, 40 karakter (implementasi setara dengan k)
sumber