Codingame平台“CHUCK NORRIS”的Python实现
CodinGame平台“CHUCK NORRIS”的Python实现
一、CodinGame平台极简介绍
CodinGame是一个家法国创业公司打造的创新型编程学习平台。将编程与游戏结合,但又不是游戏开发,也不是游戏化,只是将程序代码的逻辑与实际游戏相连,能够或得实时视觉反馈。
对于每一种练习,可以从20种语言(Python、Java、C等)中选择自己喜欢的进行编程;平台提供多人游戏模式,通过编程游戏对抗,看看谁的代码效率更高。
二、CHUCK NORRIS介绍
该练习在平台上属于Easy类别,通过率目前为73%,可以说平台上大部分人都会尝试解答。涉及的知识有Conditions、Loops、Encoding、Strings,本文通过Python 3 进行编程解决。
1、 The Goal
带有0和1的二进制数很好,但是只有0或几乎为0的二进制数更好!这是 Chuck Norris设计的一个概念,用来发送所谓的一元信息。
编写一个程序,该程序将传入的消息作为输入,并将使用Chuck Norris的方法编码的消息显示为输出。
2、Rule
(1). 输入消息由ASCII字符(7位)组成
(2). 编码的输出消息由0个块组成
(3). 一个块与另一个块之间用一个空格隔开
(4). 两个连续的块用于产生一系列相同的值位(只有1或0个值)
-第一块:总是0或00。如果它是0,那么这个级数包含1,如果不是,它包含0
-第二个数据块:这个数据块中的0是这个序列中的比特数
3、Example
C在二进制中表示为1000011,用该方法编码为:0 0 00 0000 0 00
0 0(第一个数据块只有一个1)
00 0000 (第二个数据块有四个0)
0 00 (第三个数据块有两个1)
三、分析及注意点
每个块第一部分的的0分表代表二进制中的1或0,其中0→1,00→0
每个快中第二部分0的个数代表第一部分所表示数字的个数,即
0 0 表示一个1
0 00表示两个1
0 000表示三个1
…
00 0 表示一个0
00 00表示两个0
00 0000表示四个0
值得注意的是输进的字符二进制编码不全为7位数,例如**%**的二进制表示为100101,为六位数,则需要在前面补0。
四、代码如下
std_input = input()
#得到字符的二进制编码
str=[bin(ord(c)).replace('0b', '') for c in std_input]
for i in range(len(str)):
#如果该字符的二进制不满足7位,则用0补足
if str[i] != 7:
str[i] = '0'*(7-len(str[i]))+str[i]
message=''.join(str) #将二进制连接
code = ''
n = 1;m=1
for i in range(len(message)):
'''
将最后一个元素与其他元素分开
进行判断和赋值
'''
a = message[i]
if i < (len(message) - 1):
if a == '1':
#若当前元素与下一元素相等,则计数加1,否则,对当前元素编码,赋值
if a == message[i + 1]:
n += 1
else:
code += '0' + ' ' + '0' * n + ' '
n = 1
else:
if a == message[i + 1]:
m += 1
else:
code += '00' + ' ' + '0' * m + ' '
m = 1
else:
#最后一个元素若与前一个元素相等,则进行*n赋值操作,若不等,则对最后一个元素进行编码,赋值
if a == '1':
if a == message[i - 1]:
code += '0' + ' ' + '0' * n
else:
code += '0' + ' ' + '0'
else:
if a == message[i - 1]:
code += '00' + ' ' + '0' * m
else:
code += '00' + ' ' + '0'
print(code)
粗制版FLowchart流程图如下
五、总结与思考
平台上一道简单的练习,对目前博主目前水平还是有点吃力,难点在退出的条件,想了很久才写出这个方法,希望能见到更简洁舒适流程的代码段。
博主对本题的理解是计算列表中连续相同元素的个数,难点是最后一个元素的判断和退出条件。本题将最后一个元素与其它元素区分开进行判断和退出,此方法还可运用在计算列表中最多相邻元素个数、计算指定元素最大连续个数等变式中。