雙盧恩

Barbara Streisand
Barbara Streisand原創
2024-10-12 12:15:02962瀏覽

Double Luhn

每週挑戰 290

穆罕默德·S·安瓦爾 (Mohammad S. Anwar) 每週都會發出“每週挑戰”,讓我們所有人都有機會為每週兩次的任務提出解決方案。我的解決方案先用Python編寫,然後轉換為Perl。這對我們所有人來說都是練習編碼的好方法。

挑戰,我的解決方案

任務1:雙重存在

任務

給你一個整數數組,@ints。

寫一個腳本來找出是否存在兩個索引 $i 和 $j 使得:

  1. $i != $j
  2. 0
  3. $ints[$i] == 2 * $ints[$j]

我的解決方案

這看起來相對簡單,但有一個巨大的問題希望普華永道團隊的其他成員也注意到。對於此任務,我循環遍歷列表並查看是否存在兩倍於其值的值。

但是,如果值為「0」(因此 0 × 2 = 0),我需要檢查清單中是否至少有兩個零。

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

範例

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

任務 2:Luhn 算法

任務

給你一個字串 $str ,其中包含數字(可能還有其他可以忽略的字元)。最後一位數字是有效負載;分開考慮。從右邊數起,將剩餘數字的第一個、第三個等的值加倍。

對於現在大於 9 的每個值,將其數字相加。

正確的校驗位是加到所有值的總和中,將使總 mod 10 為零。

當且僅當有效負載等於正確的校驗位元時傳回 true。

我的解決方案

我透過從字串中刪除非數字字元來開始此任務,並將反轉的字串轉換為整數列表。

然後,我使用提供的公式,交替添加要計數的值或將其乘以 2 並除去 9。如果結果計數可被 10 整除,我返回 True,否則返回 False。

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

以上是雙盧恩的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn