Orada popüler tür Luhn olarak kontrol basamağı algoritmaları ve sonra orada iyi Damm algoritma örneğin, olanları. Luhn gibi algoritmaların popülaritesinin arkasındaki tek olası neden, bunların kodlu golf uygulamalarının mevcut olmasıdır. Bu, bir topluluk olarak, daha iyi algoritmaların golf uygulamalarını sunarak dünyayı değiştirme gücüne sahip olduğumuz anlamına gelir.
Dolayısıyla bu zorluk, Damm algoritmasını kullanarak bir kontrol basamağını hesaplayan, kendi dilinizde bir işlev veya tam bir program yazarak dünyayı değiştirmektir . En az sayıda karakter içeren (bayt değil) cevap birkaç hafta içinde kazanan olarak seçilecektir. Tüm yardım işlevlerinin ve işlem tablosunun bildiriminin karakter sayısına dahil edilmesi gerektiğini unutmayın. Beraberlik durumunda en popüler cevap seçilecektir.
Bu algoritma, zayıf bir şekilde tamamen anti-simetrik sıralı 10. sıraya sahip olması gereken bir operasyon tablosu etrafında döner . Damm algoritması hakkındaki Wikipedia makalesinde bulunabilen operasyon tablosu, bu meydan okumada kullanılacak olan çalışma tablosudur . Tamlık uğruna aşağıda çoğaltacağım:
| 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
Kısacası (ayrıntılar için Wikipedia makalesine bakın ) algoritma aşağıdaki gibi çalışır:
- İşlenecek basamakların bir listesi ve 0 olarak ayarlanmış bir ara basamak ile başlarsınız.
- Listedeki her basamak için, rakamı sütun dizini olarak ve önceki ara basamağı satır dizini olarak kullanarak yeni bir ara basamak hesaplarsınız.
- Son ara hane kontrol basamağıdır. Zaten eklenmiş bir kontrol basamağı olan bir sayıyı doğrulıyorsanız, sayı geçerliyse son ara basamağı 0 olur.
Programınız veya işleviniz null dışında herhangi bir karakter içerebilen bir dize kabul etmelidir, ancak yalnızca dizedeki rakamlarla ilgilenmelidir. Hesaplanan kontrol basamağı eklenmiş olarak orijinal dizgiyi yazdırmalı (bir program varsa) veya döndürmeli (bir işlevse). Bir program yazmayı seçtiyseniz, program girişi bağımsız değişken veya standart girdi olarak kabul edebilir. Giriş dizesi boşsa veya herhangi bir rakam içermiyorsa, döndürmeniz veya sıfır eklemeniz gerekir.
Bazı örnekler:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0