Rumah > Artikel > pembangunan bahagian belakang > Double Luhn
Setiap minggu Mohammad S. Anwar menghantar Cabaran Mingguan, peluang untuk kita semua mencari penyelesaian kepada dua tugas mingguan. Penyelesaian saya ditulis dalam Python terlebih dahulu, dan kemudian ditukar kepada Perl. Ini cara yang bagus untuk kita semua mempraktikkan beberapa pengekodan.
Cabaran, Penyelesaian saya
Anda diberi tatasusunan integer, @ints.
Tulis skrip untuk mencari sama ada terdapat dua indeks $i dan $j supaya:
Ini nampaknya agak lurus ke hadapan, tetapi terdapat gotcha besar-besaran yang diharapkan ahli Pasukan PWC yang lain turut perasan. Untuk tugasan ini, saya mengulangi senarai dan melihat sama ada nilai yang dua kali ganda nilainya wujud.
Walau bagaimanapun, jika nilainya ialah '0' (dan dengan itu 0 × 2 = 0), saya perlu menyemak sama ada terdapat sekurang-kurangnya dua sifar dalam senarai.
def double_exists(ints: list) -> bool: for i in ints: if i * 2 in ints: if i != 0 or ints.count(0) > 1: return True return False <h3> Contoh </h3> <pre class="brush:php;toolbar:false">$ ./ch-1.py 6 2 3 3 true $ ./ch-1.py 3 1 4 13 false $ ./ch-1.py 2 1 4 2 true $ ./ch-1.py 1 3 0 false $ ./ch-1.py 1 0 3 0 true
Anda diberi rentetan $str yang mengandungi digit (dan mungkin aksara lain yang boleh diabaikan). Digit terakhir ialah muatan; pertimbangkan secara berasingan. Mengira dari kanan, dua kali ganda nilai digit pertama, ketiga, dsb. daripada baki digit.
Untuk setiap nilai yang kini lebih besar daripada 9, jumlahkan digitnya.
Digit semakan yang betul ialah digit yang, ditambah pada jumlah semua nilai, akan menjadikan jumlah mod 10 kepada sifar.
Kembali benar jika dan hanya jika muatan adalah sama dengan digit semakan yang betul.
Saya memulakan tugas ini dengan mengalih keluar aksara bukan digit daripada rentetan dan menukar rentetan terbalik kepada senarai integer.
Saya kemudian menggunakan formula yang dibekalkan, berselang seli antara menambah nilai untuk mengira atau mendarabkannya dengan dua dan mengalih keluar 9. Jika kiraan yang terhasil boleh dibahagikan dengan 10, saya kembalikan Benar, jika tidak, saya kembalikan Salah.
def luhn_algorithm(s: str) -> bool: s = re.sub('[^0-9]', '', s) ints = [int(n) for n in s[::-1]] count = 0 for pos, i in enumerate(ints): if pos % 2 == 1: i *= 2 if i > 9: i -= 9 count += i return count % 10 == 0
$ ./ch-2.py 17893729974 true $ ./ch-2.py "4137 8947 1175 5904" true $ ./ch-2.py "4137 8974 1175 5904" false
Atas ialah kandungan terperinci Double Luhn. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!