Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Double Luhn

Double Luhn

Barbara Streisand
Barbara Streisandasal
2024-10-12 12:15:02929semak imbas

Double Luhn

Cabaran Mingguan 290

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

Tugasan 1: Wujud Berganda

Tugasan

Anda diberi tatasusunan integer, @ints.

Tulis skrip untuk mencari sama ada terdapat dua indeks $i dan $j supaya:

  1. $i != $j
  2. 0 <= ($i, $j) < skalar @ints
  3. $ints[$i] == 2 * $ints[$j]

penyelesaian saya

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

Tugasan 2: Algoritma Luhn

Tugasan

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.

penyelesaian saya

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

Contoh

$ ./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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn