CCF计算机职业资格考试 201903-3损坏的RAID5 Python实现

CCF计算机职业资格考试

201903-3损坏的RAID5 Python实现

题目见搜索引擎或者官网。
我的GitHub还有其他CCF-CSP题目的python实现,可以交流交流。

发现一个基本上没有人注意的漏洞…
CCF-CSP官网的测试样例没有考虑缺失块的处理…
在把无法推算的两种情况与读取块在已知硬盘中情况考虑后 我把代码提交上去就是100分!!但是我还没写读取块在缺失盘上的情况
不知道在上次考试的时候是怎么给的测试样例…大家可以去试试
我还是把代码写完整。

参考了他人的C++代码的思路,很聪明的方法!

注意:所有编号均从0开始
根据观察与规律:(e.g. y以x为周期变化, 则考虑y%x)

  • 块的编号 x
  • 条带编号 y = x // s {因为: 由题目y=floor(x/s)}
  • 第y号条带所在行号 k = y // (n - 1) {因为: 每一行有(n-1)条带在编号}
  • 第k行冗余带所在列(盘)号 c = n - k % n - 1 {因为: 冗余带以n为周期在每一行出现}
  • 第y号条带所在列(盘)号 d = (c + y % (n - 1) + 1) % n {因为: 条带以n-1为周期出现; 条带所在列=冗余带所在列往左y%(n-1)+1个单位 若超出总列数则继续从第一列向左}
  • 细化到第d号盘的第b个块:b = x % s + k * s + 1
def Mapping(x: int, n: int, s: int) -> int:
    y = x // s
    k = y // (n - 1)
    c = n - k % n - 1
    d = (c + y % (n - 1) + 1) % n
    b = x % s + k * s
    return (b, d) # 第d号盘的第b个块 则从8 * b号位开始输出硬盘内容8位

def xor(a: str, b: str) -> str:
    l = len(a) # len(a) == len(b)
    dec_a, dec_b = int(a, base=16), int(b, base=16)
    x = hex(dec_a ^ dec_b)[2 :].rjust(l).upper()
    return x

def XOR(all: dict, start: int) -> str:
    keys = list(all)
    l = len(keys)
    result = xor(all[keys[0]][start : start + 8], all[keys[1]][start : start + 8])
    i = 2
    while i < l:
        result = xor(result, keys[i][start : start + 8])
        i += 1
    return result

n, s, l = map(int, input().split())
left_disks = dict()
max_b = 0 # 最大块号
for i in range(l):
    temp = input().split()
    left_disks[temp[0]] = temp[1]
    max_b = len(temp[1]) // 8
r = int(input())
read = []
for i in range(r):
    read.append(Mapping(int(input()), n, s))

for i in read:
    b, d = i
    if b > max_b: # 指定的块超出阵列总长度
        print('-')
    elif str(d) in left_disks.keys(): # 块在已知硬盘中
        print(left_disks[str(d)][8 * b : 8 * b + 8])
    elif l == n - 1: # 最多缺失一个硬盘
        print(XOR(left_disks, 8 * b))
    else: # 无法推算
        print('-')

# 测试样例
'''
2 1 2
0 000102030405060710111213141516172021222324252627
1 000102030405060710111213141516172021222324252627
2
0
1

3 2 2
0 000102030405060710111213141516172021222324252627
1 A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7
2
2
5
'''
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值