卡在 CS50 Python Week2 pset 问题“Vanity Plates” - 不确定我的代码出了什么问题

问题描述 投票:0回答:1

我今天刚刚开始使用 CS50 课程学习 python,在进入第 2 周练习集后,我被这个问题“Vanity Plates”困住了。今天之前我没有任何编码背景,我对难度的突然跳跃有点不知所措:(整个问题如下:

在哈佛大学所在地马萨诸塞州,可以为您的汽车申请一个个性化车牌,您可以选择字母和数字,而不是随机的。不过,其中的要求包括:

“所有梳妆台必须至少以两个字母开头。”

“……个性铭牌最多可包含 6 个字符(字母或数字),最少 2 个字符。”

“数字不能用在盘子中间;他们必须在最后到来。例如,AAA222 将是可接受的……虚荣板; AAA22A 是不可接受的。使用的第一个数字不能是‘0’。”

“不允许使用句点、空格或标点符号。”

在plates.py中,实现一个程序,提示用户输入化妆牌,然后如果满足所有要求则输出Valid,如果不满足则输出Invalid。假设用户输入中的所有字母均为大写。根据以下内容构建您的程序,其中如果 s 满足所有要求,则 is_valid 返回 True,如果不满足,则返回 False。假设 s 将是一个 str。欢迎您实现 is_valid 调用的附加函数(例如,每个要求一个函数)。

我编写了一段代码,当我使用给定的测试运行它时,其中一些通过了,一些失败了。对于失败的测试,我的代码在输入后运行,但没有输出任何结果,我将不得不终止它。我不确定出了什么问题,因为没有语法错误,而且我真的无法发现错误。我将复制下面的代码,希望能够找到一些帮助。非常感谢:)

注意:由于这个问题是在我查看之前的回复和解决方案之前发布的,虽然我理解其中的一些内容,但我想知道我的代码中出了什么问题,以便从错误中学习。

def main():
    plate = input("Plate: ").upper()
    if is_valid(plate):
        print("Valid")
    else:
        print("Invalid")


def is_valid(s):

    n = 0
    flag = True

    #check for length
    if len(s) < 2 or len(s) > 6:
        flag = False

    #check for punctuations by eliminating upperchar/num unicode
    for i in s:
        if (ord(i) < 48) or (57 < ord(i) < 65) or (90 < ord(i)):
                flag = False

    #check for first two letter
    for i in s[0:2]:
        if ord(i) < ord("A"):
            flag = False

    #check if there are letters after numbers
    for i in range(0, len(s)):
        while (ord(s[i]) < ord("A")) and (i < (len(s)-1)):
            n = n + 1
            if ord(s[i+1]) > 57:
                flag = False

        #check if first number is 0
        if (48 <= ord(s[i]) <= 57) and (n == 1):
            if s[i] == 0:
                flag = False

    return flag

main()

测试失败:CS50、ECTO88、CS05、50、CS50P2、PI3.14 测试通过:NRVOUS、H、OUTATIME

python function for-loop while-loop cs50
1个回答
0
投票

Python 有许多函数可以简化要执行的检查。

  • isalnum():返回一个布尔值,说明字符串是否仅包含字母和数字。
  • isalpha:返回一个布尔值,说明字符串是否仅包含字母。
  • isdigit:返回一个布尔值,说明字符串是否仅包含数字。

要确定字母是否出现在数字后面,您需要查找并比较字符串中最后一个字母和第一个数字的位置。

def is_valid(s):
    # Check if the given string meets length requirements.
    if len(s) < 2 or len(s) > 6:
        return False

    # Check if all characters are alphanumeric
    if not s.isalnum():
        return False

    # Check if the string starts with at least two letters.
    if not s[:2].isalpha():
        return False

    # Find the position of the first digit in the string
    first_digit_index = 99  # A sensible default value
    for index, char in enumerate(s):
        if char.isdigit():
            first_digit_index = index
            break

    # Find the position of the last letter in the string
    last_alpha_index = -1
    for index, char in enumerate(s[::-1]):
        if char.isalpha():
            last_alpha_index = len(s) - index
            break

    # Check if the first digit appears before the last letter
    if first_digit_index < last_alpha_index:
        return False

    return True
© www.soinside.com 2019 - 2024. All rights reserved.