202112-3 登机牌条码(50分)不知道错哪了

有注释,大佬们帮忙看一看

w,s=map(int, input().split()) # w、s分别表示有效数据区每行能容纳的码字数和校验级别
words = input() # 校验的字符串

psd417= [ord(words[i]) for i in range(len(words))] # 用作判断
PSD417 = psd417.copy() # 用作记录
'''
'A'~'Z' = 65~90
'a'~'z' = 97~122 
'0'~'9' = 48~57 
''' 
# 将输入字符串进行编码
big_w = range(65,91)
small_w = range(97,123)
num = range(48,58)
i = j = 0
while j<len(psd417):
    if psd417[j] in num:
        PSD417[i] = PSD417[i]-48
        if j==0 or (j>0 and psd417[j-1] not in num):
            PSD417[i:i] = [28]
            i += 1

    elif psd417[j] in big_w:
        PSD417[i] = PSD417[i]-65
        if j>0 : 
            if psd417[j-1]  in num:
                PSD417[i:i] = [28]
                i += 1
            if psd417[j-1] in small_w:
                PSD417[i:i] = [28,28]
                i += 2
    else:
        PSD417[i] = PSD417[i]-97       
        if j==0 or (j>0 and psd417[j-1]  not in small_w):
                PSD417[i:i] = [27]
                i += 1
    i += 1
    j += 1
# 将输入字符串进行补充,并计算码字
if len(PSD417)%2 == 1:
    PSD417.append(29) 
psd417_final = []
for i in range(0,len(PSD417),2):
    psd417_final.append(PSD417[i]*30+PSD417[i+1])

if s==-1:
    k=0
else:
    k = 2**(s+1)
# 若宽度不够,进行填充900
psd417_final_len =1+len(psd417_final)+k # 增加计算码和校验码
if psd417_final_len % w != 0:
    psd417_final.extend([900]*(w-psd417_final_len % w)) 
psd417_final[0:0] = [len(psd417_final)+1] 


# 加效验码
def add_poly(L1, L2):  # 多项式加法,同次项系数相加
    R = []
    if len(L1) > len(L2):  # 默认L2比较长
        L1, L2 = L2, L1
    i = 0
    while i < len(L1):
        R.append(L1[i] + L2[i])  # 从低次项开始对应相加
        i += 1
    R = R + L2[len(L1):len(L2)]  # 较长的多项式高次项直接复制
    return R


def subtract_poly(L1, L2):  # 多项式减法
    L2 = L2[:]  # 为了不改变传入的L2
    for i in range(len(L2)):
        L2[i] = -L2[i]
    return (add_poly(L1, L2))


def multiply_poly(L1, L2):  # 多项式乘法
    if len(L1) > len(L2):
        L1, L2 = L2, L1
    zero = []
    R = []
    for i in L1:
        T = zero[:]  # 存储中间产生的结果多项式,每次更新结果多项式的列表长度
        for j in L2:  # 一个单项式乘以多项式的每一项
            T.append(i * j)
        R = add_poly(R, T)
        zero = zero + [0]  # 每一个新的多形式都要比前一个多项式次数高1,列表长度增加,所以多补一个0
    return R


def divide_poly(L1, L2):
    if len(L1) < len(L2): 
        return 0, L1  # 商为0的情况

    d = len(L1) - len(L2)  # 循环除的次数为d+1
    T = L1[:]  # 被除数
    R = []  # 商
    for i in range(d+1):
        n = T[len(T) - 1] / L2[len(L2) - 1]  # 被除数的最高次项系数除以除数的最高次项的系数
        R = [n] + R
        T1 = [0] * (d - i) + [n]  # 对得到的商补若干个0
        T2 = multiply_poly(T1, L2)  # 商乘以除数结果为T2
        T = subtract_poly(T, T2)  # 被除数减去T2
        T = T[:len(T) - 1]  # 切片,被除数减少一次方
    return R, T
if k>0:
    # 求g(k)
    def g(k):
        L1 = [1]
        for i in range(1,k+1):
            G = [-3**i,1]
            L1 = multiply_poly(L1, G)
        return L1

    # 求d(x)
    def d(psd417_final):
        L = list(reversed(psd417_final))
        return L

    # 求r(x)
    d_x = d(psd417_final)
    g_x = g(k)
    # 扩大x**k
    L = [0]*k+d_x
    Business,yushu = divide_poly(L, g_x)
    q_x_g_x = multiply_poly(Business, g_x)
    r_x = subtract_poly(q_x_g_x, L)
    c = [] # 校验集合
    for i in r_x:
        if i !=0:
            c.append(int(i)%929)
    c.reverse()

    psd417_final = psd417_final + c


# 求 x**k*d(x)/g(x)的余数r(x)
for i in psd417_final:
    print(i)
对于CCF CSP(中国计算机学会程序设计竞赛)的登机牌条码,你可以使用Python来解析和处理。你可以使用Python的第三方库来实现这个功能,比如pyzbar和opencv-python。首先,你需要安装这两个库。你可以使用以下命令来安装它们: ``` pip install pyzbar pip install opencv-python ``` 然后,你可以使用以下代码来读取和解析登机牌条码: ```python import cv2 from pyzbar import pyzbar # 读取图像 image = cv2.imread('boarding_pass.png') # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 使用pyzbar库解析条码 barcodes = pyzbar.decode(gray) # 遍历解析到的条码 for barcode in barcodes: # 提取条码的边界框坐标 (x, y, w, h) = barcode.rect # 绘制边界框 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 提取条码数据 barcode_data = barcode.data.decode("utf-8") barcode_type = barcode.type # 在图像上绘制条码数据和类型 text = "{} ({})".format(barcode_data, barcode_type) cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 显示图像 cv2.imshow("Image", image) cv2.waitKey(0) ``` 请注意,你需要将代码中的`boarding_pass.png`替换为你实际的登机牌条码图像文件路径。这段代码将读取图像,将其转换为灰度图像,然后使用pyzbar库解析条码。最后,它会在图像上绘制条码的边界框和数据,并显示图像。 希望这可以帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿明同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值