Python编程练习 codewars:Unary Messages

题目链接codewars网站:

codewars:Unary Messages

题目大意

通常的二进制是用0和1来进行编码和解码的,但是本题希望能够只用0来表示。在用0进行编码的时候,需要遵守的规则有以下几点:

  • 字符信息都要用七位二进制来表示(未满7位的要补满)
  • 连续相同的数字为有两部分组成,前一部分为数字的种类,后一部分为这个连续数字的长度个0构成
  • 各个部分都要用空格来分割
  • 数字的种类:0 用 00表示,1用0表示
    本题要我们写两个函数,send(s)和receive(s)

例子:

send(“C”)->“0 0 00 0000 0 00”
receive(“0 0 00 0000 0 00”)->“C”

我的分析

因为我做这种练习是为了蓝桥杯准备的,所以在考虑的时候,我尽量不去使用第三方库。对于我而言,send函数更加费脑子一点,当你把它转换为七位二进制后,要怎么去数出对应的0和1的个数呢。
我是用了old和new这两个参数,来进行对照,如果相同就保存,不同就给他输出。开始我并没有注意到一定要七位二进制。
后来写receive函数时,发现是给我们降低了难度。
直接看代码吧,注释的应该很详细了。

我的代码

def send(s):
    num=''
    out=''
    mid=''
    for i in s:#将字符转换为七位二进制并保存在num中
        l=bin(ord(i))[2:]
        if len(l)<7:
            l='0'*(7-len(l))+l
        num=num+l
    old=num[0]
    for new in num:        
        if old!=new:#当old和new不一样的时候,就把mid中的字符转换到out里面        
            if old=='1':
                out+='0 '+'0'*len(mid)+' '
            else:
                out+='00 '+'0'*len(mid)+' '
            mid=''
        mid+=new
        old=new
    return out+'0 '+'0'*len(mid) if old=='1' else out+'00 '+'0'*len(mid) #因为最后一次的mid没有输出,手动给他输出,当然我是懒得再想了,应该还有好方法的
    
def receive(s):
    l=s.split(' ')
    mid=''
    out=''
    for i in range(0,len(l),2):
        if l[i]=='0':
            mid+='1'*len(l[i+1])
        else:
            mid+='0'*len(l[i+1])
    for i in range(0,len(mid),7):
        out+=chr(int(mid[i:i+7],base=2))
    return out

当然后续我看了以下其他人的代码,很多都是用了正则表达式,代码也确实简洁了很多,大家如果感兴趣也可以自己去写写看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zhanghp947

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

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

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

打赏作者

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

抵扣说明:

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

余额充值