无法将多个字符编码为一元字符,只能编码为单个字符
Can't encode multiple characters into unary, only single ones
我正在尝试将字符串编码为一元,但出于某种原因,它只适用于单个字母。
这是我的代码:
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 例如,它返回一个错误的一元:
留言抄送:
失败
找到:0 00 00 0 0 0 00 00 0 00 00 0 0 0000
预期:0 0 00 0000 0 000 00 0000 0 00
在处理 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
顺便说一句,真正的 Chuck Norris 可能会更有效率,并且只需要在结果开头使用一次 0/00 指示符,因为之后零序列在表示 1 和 0 之间交替。每个后续块前面的 0/00 都是多余的,Chuck Norris 没有做多余的动作。
我正在尝试将字符串编码为一元,但出于某种原因,它只适用于单个字母。 这是我的代码:
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 例如,它返回一个错误的一元:
留言抄送:
失败
找到:0 00 00 0 0 0 00 00 0 00 00 0 0 0000
预期:0 0 00 0000 0 000 00 0000 0 00
在处理 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
顺便说一句,真正的 Chuck Norris 可能会更有效率,并且只需要在结果开头使用一次 0/00 指示符,因为之后零序列在表示 1 和 0 之间交替。每个后续块前面的 0/00 都是多余的,Chuck Norris 没有做多余的动作。