下面这段压缩和解压的代码为什么无法正确解压换行符

压缩

def crt(a, n):
    s, p = 0, 1
    for x in n:
        p *= x
    for x, y in zip(a, n):
        q = p // y
        s += q * x * pow(q, -1, y)
    return s % p

def compress3to1(code):
    compressed=""
    for i in range(0, len(code), 3):
        a = [ord(c) - 32 for c in code[i:i+3]]
        compressed += chr(crt(a, [101, 102, 103]))
    print(compressed)

compress3to1(for i in range(69):\n print(i))

运行后得到一段乱码运行后得到一段乱码,输入到下面三个点的位置就可以运行code中的代码,但每次换行符都无法正确解压,被替换成了字符p

解压


exec(bytes(ord(c)%i+32 for c in '...' for i in b'efg'))

这段代码的原理是将3个字符的 ascii - 32
然后分别对101 102 103取模,再合成成一个数字(用了CRT,中国同余定理)
很显然,用这个代码必须保证原字符串的ascii在32-132之间
很明显,这个范围不包括那些ascii低于32的字符,比如换行回车。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7440213
  • 以下回答来自chatgpt:

    根据代码片段的特征,该段代码看起来是使用Python编写的。以下是完整的代码片段:

    import numpy as np
    
    def driving_time_one_moment(W_I,M_J,TRAVELTIME_IJ,Y_IJ):
        print(np.sum(np.dot(np.dot(W_I,Y_IJ),TRAVELTIME_IJ.T)))
        return np.sum(np.dot(np.dot(W_I,Y_IJ),TRAVELTIME_IJ.T))
    
    def waiting_time_one_moment(W_I,M_J,TRAVELTIME_IJ,Y_IJ):
        tc=8           # 服务时间,24小时提供服务;
        tf=2           #每辆车充电时长;
        # 第一步:计算用户达到率
        Tao_J=np.dot(W_I,Y_IJ/tc)
    
        # 第二步:单位时间内充电站平均服务能力
        U_J=M_J/tf
    
        # 第三步:充电站排队系统服务强度:,由于ROU_J会存在大于1的情况,从而会促使后面求解
        ROU_J=Tao_J/U_J
    
        # 第四步:充电站内充电桩全部空闲概率:
        P_J=np.full(shape=(1,M_J.shape[1]),fill_value=0.0)
        for j in range(M_J.shape[1]):
            temp = 0
            for k in range(M_J.shape[1]):
                temp+=(np.power(M_J[0,j]*ROU_J[0,j],k))/(np.math.factorial(k))
            p_j0=1/(temp+(np.power(M_J[0,j]*ROU_J[0,j],M_J[0,j]))/(np.math.factorial(M_J[0,j])*(1-ROU_J[0,j])))
            P_J[0,j]=p_j0
    
        # 第五步:计算排队等候时间期望
        W_Jq=np.full(shape=(1,M_J.shape[1]),fill_value=0.0)
        for j in range(M_J.shape[1]):
            w_jq=(np.power(M_J[0,j],M_J[0,j])*np.power(ROU_J[0,j],M_J[0,j]+1)*P_J[0,j])/(ROU_J[0,j]*np.math.factorial(M_J[0,j])*np.power(1-ROU_J[0,j],2))
            W_Jq[0,j]=w_jq
    
        # 第六步:所有用户的总的等待花费时间
        T2=0
        for j in range(M_J.shape[1]):
            T2+=W_Jq[0,j]*Tao_J[0,j]*tc
        print(T2)
    
    if __name__ == '__main__':
        # 需求量;
        W_I = np.array([[10, 20, 30, 50]])
        # 充电桩供给量;
        M_J = np.array([[5, 10, 15]])
        # 行是demand,列是provider
        TRAVELTIME_IJ = np.array([[1, 1.5, 2.5],
                                  [1.5, 1, 2],
                                  [1, 1.5, 1],
                                  [2.5, 1.5, 1]])
        # 出行时间的阻尼函数,衰减函数
        F_DIJ = 1 / TRAVELTIME_IJ
        Sum_Dij_I = np.sum(F_DIJ, axis=1)
        # 计算选择权重
        Y_IJ = np.full(shape=(TRAVELTIME_IJ.shape), fill_value=0.0)
        for i in range(W_I.shape[1]):
            Y_IJ[i, :] = F_DIJ[i, :] / Sum_Dij_I[i]
    
        # 计算驾车时间
        driving_time_one_moment(W_I,M_J,TRAVELTIME_IJ,Y_IJ)
        # 计算等候时间
        waiting_time_one_moment(W_I,M_J,TRAVELTIME_IJ,Y_IJ)
    

    该段代码定义了两个函数,driving_time_one_momentwaiting_time_one_moment,并在main函数中调用了这两个函数。这两个函数分别用于计算驾车时间和等候时间。

    waiting_time_one_moment函数中,首先计算了用户达到率Tao_J、单位时间内充电站平均服务能力U_J和充电站排队系统服务强度ROU_J。然后通过循环计算充电站内充电桩全部空闲概率P_J、排队等候时间期望W_Jq和所有用户的总等待时间T2

    main函数中,定义了需求量W_I、充电桩供给量M_J和出行时间阻尼函数TRAVELTIME_IJ等变量,然后调用了driving_time_one_momentwaiting_time_one_moment两个函数进行计算。

    通过运行这段代码,可以得到驾车时间和等候时间的计算结果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^