人工智能 实验1

Task 1 ★
给定一个字符串并判断这个字符串是否是回文字符串。回文是一个向前和向后读取相同的字符串,本题
中只考虑字母和数字字符。如果是,输出 True ;否则输出 False 。
测试用例:

用例1:A man, a plan, a canal: Panama
用例2:race a car
用例3:1111111111111111111121111111111111111111
#回文字符串: 不论是从左往右,还是从右往左,字符的顺序都是一样的(如aba,abcba,abba等)
#本题中的回文字符串只考虑数字和字母(不考虑大小写),不考虑其他字符
def is_curcle(ss): #判断ss是否为回文字符串
    k = 0
    j = len(ss)-1
    while k <= j:
        key = ord(ss[k]) - ord(ss[j])
        if key == 0 or key == 32 or key == -32:
            k = k + 1
            j = j - 1
        else:
            return False
    return True


def num_or_char(s0): #判断s0是否为数字或字符
    key = ord(s0)
    if 48 <= key and key <= 57:
        return True
    elif 65 <= key and key <= 90:
        return True
    elif 97 <= key and key <= 122:
        return True
    else:
        return False


s0 = "s0"
while s0 != "":
    s0 = input()
    if s0 == "":
        break
    s0_len = len(s0)
    s1 = ""
    #将s0转化为只含数字和字母的字符串并保存在s1中
    for i in range(s0_len):
        if num_or_char(s0[i]):
            s1 = s1 + s0[i]
    #print(s1)
    if is_curcle(s1):
        print("True")
    else:
        print("False")

#A man, a plan, a canal: Panama - True
#race a car - False
#1111111111111111111121111111111111111111 - False

#t1_simple
#回文字符串: 不论是从左往右,还是从右往左,字符的顺序都是一样的(如aba,abcba,abba等)
#本题中的回文字符串只考虑数字和字母(不考虑大小写???),不考虑其他字符
def is_curcle(ss): #判断ss是否为回文字符串
    return ss == ss[::-1]


def num_or_char(s0): #判断s0是否为数字或字符
    key = ord(s0)
    if 48 <= key and key <= 57\
        or 65 <= key and key <= 90\
        or 97 <= key and key <= 122:
        return True
    else:
        return False


s0 = "s0"
while s0 != "": #当输入字符串为空时停止
    s0 = input()
    if s0 == "":
        break
    s0_len = len(s0)
    s1 = ""
    #将s0转化为只含数字和字母的字符串并保存在s1中
    for i in range(s0_len):
        if num_or_char(s0[i]):
            s1 = s1 + s0[i]
    #print(s1)
    if is_curcle(s1):
        print("True")
    else:
        print("False")

#A man, a plan, a canal: Panama - False
#race a car - False
#1111111111111111111121111111111111111111 - False

Task 2 ★
制作一个两人石头剪刀布游戏。 (提示:使用 input 输入两个玩家的选择,比较它们,打印出祝贺获胜
者的消息,并询问玩家是否想开始新游戏,输入 y 则重新开始游戏,输入 n 退出游戏,石头:Rock,剪
刀:Scissors,布:Paper)
示例输入:

Player1 input: Rock
Player2 input: Paper

示例输出:

Congratulate Player2!
Try new game?
'''
石头:Rock,剪刀:Scissors,布:Paper)
Player1 input: Rock
Player2 input: Paper
Congratulate Player2!
Try new game?
'''
keep = True
while keep:
    print("Player1 input:")
    p1 = input()
    print("Player2 input:")
    p2 = input()
    if (p1 == "Rock" and p2 == "Scissors")\
            or (p1 == "Scissors" and p2 == "Paper") \
            or (p1 == "Paper" and p2 == "Rock"):
        print("Congratulate Player1!")
    elif p1 == p2:
        print("No Winner!") #两人平局
    else:
        print("Congratulate Player2!")
    print("Try new game?")
    new_game = input()
    if new_game == "y":
        keep = True
    elif new_game == "n":
        keep = False

Task 3 ★★★
实现一个可以打印出帕斯卡三角形前 n 行的函数。(帕斯卡三角形,又称杨辉三角,每个数等于它上方两数之和)
示例输入:

6

示例输出:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
#帕斯卡三角形: data_n[i] = data_n-1[i-1]+data_n-1[i] , i-1或i越过[0,n-2]的界时取0
num = int(input("Enter the number: "))
list1 = [] #an empty list
for i in range(num):
    list1.append([])
    list1[i].append(1)
    for j in range(1, i):
        list1[i].append(list1[i - 1][j - 1] + list1[i - 1][j])
    if num != 0:
        list1[i].append(1)
for i in range(num):
    print("[1", end="")
    for j in range(1, i+1):
        print(", ", list1[i][j], end="", sep="")
    print("]")
# better
# 帕斯卡三角形: data_n[i] = data_n-1[i-1]+data_n-1[i] , i-1或i越过[0,n-2]的界时取0
num = int(input("Enter the number: "))
list1 = []  # 空列表
for i in range(num):
    list1.append([])        # 使用线性表,第i行有i个数
    list1[i].append(1)      # 每行第一个数为1
    for j in range(1, i):
        # 给每行中间非1的数赋值,i的范围为2~num-1,从第3行到最后一行,避免越界
        list1[i].append(list1[i - 1][j - 1] + list1[i - 1][j])
    if i != 0:              # 第一行只有1个数
        list1[i].append(1)  # 每行最后一个为1
for i in range(num):        # 输出每行
    print(list1[i])

Task 4 ★★
实现一个关于列表的类 MyList,该类包括以下方法:

  1. 添加元素:push(args),参数元素类型为字符串或整型,将 args 添加到列表末尾;
  2. 获取元素:get(num),参数为整型,从列表中随机获取 num 个元素并打印;
  3. 获取列表长度:len(),打印列表长度;
  4. 删除元素:del(),删除列表第一个元素并打印;
  5. 清空列表:clear(),清空列表元素。
    在代码中实例化类并测试每个方法,并打印每次操作后的列表。

示例:

temp_list = MyList([123, 'abc'])
temp_list.add(456)
print(temp_list.memory) # 这里假设类 MyList 有一个属性 memory 来记录列表
temp_list.get(3)
...
import copy  # 用于深拷贝


class MyList:
    mylist = []

    def __init__(self):
        self.mylist = []

    def __init__(self, list00):
        self.mylist = copy.deepcopy(list00)

    def push(self, args):
        self.mylist.append(args)

    def get(self, num):
        print(self.mylist[num])

    def len0(self):
        print(len(self.mylist))

    def del0(self):
        print(self.mylist.pop(0))

    def clear(self):
        while len(self.mylist) > 0:
            self.mylist.pop()

    def print0(self):   # 用于输出列表
        print(self.mylist)


list0 = ['sb', '2sb', '3sb']    # 以下为实例化测试
list1 = MyList(list0)   # 构造函数
list1.print0()          # 这里输出应为 ['sb', '2sb', '3sb']
list1.len0()            # len()函数,此处输出应为3
list1.push('4sb')       # push(args)函数
list1.len0()            # len()函数,应输出4
list1.print0()          # 这里输出应为 ['sb', '2sb', '3sb', '4sb']
list1.get(2)            # get(num)函数 ,应输出第2个元素(从0开始)为 3sb
list1.del0()            # del()函数 ,删除首个元素并输出,应输出 sb
list1.print0()          # 应输出 ['2sb', '3sb', '4sb']
list1.clear()           # clear()函数
list1.print0()          # 应输出[]
list1.len0()            # 应输出0
上一篇: 没有了 下一篇: 数据结构期末复习题集8~12
支持 makedown语法