我试图将字符串编码为一元,但由于某种原因,它只适用于单个字母。下面是我的代码:
import sys
import math
message = input()
def getNumberFromString(string):
got = ""
for item in bytes(string, "ascii"):
got += str(item)
return int(got)
def getBinaryFromNumber(number):
return int("{0:b}".format(number))
def encode(number):
current = None
number = str(number)
got = ""
for letter in number:
if letter == "0":
if current != "0":
current = "0"
got += " 00 "
got += "0"
else:
if current != "1":
current = "1"
got += " 0 "
got += "0"
return got[1:]
gotNumber = getNumberFromString(message)
gotBinary = getBinaryFromNumber(gotNumber)
print(encode(gotBinary))
codingame。com的挑战,https://www.codingame.com/ide/puzzle/chuck-norris
对于单字母字符串,它工作得很好,例如C。但是对于CC来说,它返回一个错误的一元数:
消息CC:
失败
Found: 0000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
期望:0000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
您可以在处理1和0序列之前将每个字符的位组合成单个位字符串
例如:
def unarize(S):
bits = "".join(f"{ord(c):07b}" for c in S)
bits = bits.replace("01","0 0 1").replace("10","1 00 0")
return "00 "[bits>"1":] + bits.replace("1","0")
print(unarize("CC"))
# 0 0 00 0000 0 000 00 0000 0 00
print(unarize("LOL"))
# 0 0 00 00 0 00 00 00 0 0 00 00 0 00000 00 00 0 00 00 00
顺便说一句,真正的查克诺里斯可能更有效率,只需要在结果开始时显示一次0/00,因为之后0序列在表示1和0之间交替。每个后面的方块前面的0/00是多余的,查克·诺里斯没有多余的动作。