穆罕默德·S·安瓦爾 (Mohammad S. Anwar) 每週都會發出“每週挑戰”,讓我們所有人都有機會為每週兩次的任務提出解決方案。我的解決方案先用Python編寫,然後轉換為Perl。這對我們所有人來說都是練習編碼的好方法。
挑戰,我的解決方案
給你一個整數數組,@ints。
寫一個腳本來找出是否存在兩個索引 $i 和 $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
給你一個字串 $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中文網其他相關文章!