0

このコードは、picoctf.com で開催予定のコンテストのプレビューです。提供された元のコードを変更してユーザー入力を許可しましたが、テスト #2 が機能しません。1文字以上の10文字の文字列を入力した場合、数字のみを使用できるように印刷したい。現在、ユーザー入力を整数値に変換して実際のシリアルと比較しようとしていますが、文字が存在する場合、文字は整数値に変換できないため、テストは失敗します。

123456789a は、「基数 10 の int() のリテラルが無効です...」

このコードを修正して正しくテストするにはどうすればよいですか?

**

if int(serial) != serial:
            print ("only numbers allowed")
            print ('Failed Test 2')

**

#!/usr/bin/env python
# Your goal is to find the input that will verify your robot's serial number
#solution to keep it handy = 0933427186

serial = input ("Please enter a valid serial number from your RoboCorpIntergalactic purchase")

def check_serial(serial):
    if len(serial) != 10:
        print ('Failed Test 1')
        return False
    if int(serial) != serial:
        print ("only numbers allowed")
        print ('Failed Test 2')
        return False
    if int(serial[0])+int(serial[1]) != 9:
        print ('Failed Test 3')
        return False
    if int(serial[2])*int(serial[3]) != 9:
        print ('Failed Test 4')
        return False
    if int(serial[4])-int(serial[5]) != 2:
        print ('Failed Test 5')
        return False
    if int(serial[5])%int(serial[4]) != 2:
        print ('Failed Test 6')
        return False
    if int(serial[6])/int(serial[7]) != 7:
        print ('Failed Test 7')
        return False
    if int(serial[8])-int(serial[9]) != 2:
        print ('Failed Test 8')
        return False
    if int(serial[7])*int(serial[1]) != 9:
        print ('Failed Test 9')
        return False
    if int(serial[2]) + int(serial[3]) != int(serial[9]):
        print ('Failed Test 10')
        return False
    return True

if check_serial(serial):
    print ("Thank you! Your product has been verified!")
else:
    print ("I'm sorry that is incorrect. Please use a valid RoboCorpIntergalactic serial number")
4

3 に答える 3

5

str.isdigit()すべての文字が数字であるかどうかをテストするために使用します。

>>> 'a1'.isdigit()
False
>>> '11'.isdigit()
True
>>> '1a'.isdigit()
False

すべてのテストを簡単にするために、文字列を整数のシーケンスに変換することお勧めします。serial

s_int = [int(d) for d in serial]

それから

if s_int[0] + s_int[1] != 9:

インデックス、演算子、および期待される結果を使用して、一連のテストを簡単に構築できます。

import operator

tests = (
    (0, 1, operator.add, 9),
    (2, 3, operator.mul, 9),
    (4, 5, operator.sub, 2),
    (5, 4, operator.mod, 2),
    (6, 7, operator.truediv, 7),
    (8, 9, operator.sub, 2),
    (7, 1, operator.mul, 9),
)

for i, (a, b, op, res) in enumerate(tests, 3):
    if op(s_int[a], s_int[b]) != res:
        print("Failed test {}".format(i))
        return False
于 2013-03-21T12:55:41.500 に答える
1

使用するstr.isdigit()

文字列内のすべての文字が数字で、少なくとも 1 文字ある場合は true を返し、そうでない場合は false を返します。

正規表現も使用できます。

import re;
if(re.match('\D', serial)):
    print ('Failed Test 2')
于 2013-03-21T12:56:39.827 に答える
1
try:
    int(serial)
except ValueError:
    print ("only numbers allowed")
    print ('Failed Test 2')

またはMartijnの提案に従う

try:
    s_int = [int(d) for d in serial]
except ValueError:
    s_int = None
    print ("only numbers allowed")
    print ('Failed Test 2')
于 2013-03-21T13:00:45.910 に答える