代码应该采用5位数的邮政编码输入并将其转换为条形码作为输出。每个数字的条形码是:
{1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'}
例如,邮政编码95014应该产生:
!!.!.. .!.!. !!... ...!! .!..! ...!!!
在开始和结束时有一个额外的!
,用于确定条形码的开始和停止位置。请注意,条形码的末尾是一个额外的...!!
,它是1.这是校验位,您可以通过以下方式获得校验位:
例如,邮政编码95014
的总和 Z = 9 + 5 + 0 + 1 + 4 = 19,因此校验位 C 为1使总和 Z + C 等于20,这是10的倍数。
def printDigit(digit):
digit_dict = {1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'}
return digit_dict[digit]
def printBarCode(zip_code):
sum_digits=0
num=zip_code
while num!=0:
sum_digits+=(num%10)
num/=10
rem = 20-(sum_digits%20)
answer=[]
for i in str(zip_code):
answer.append(printDigit(int(i)))
final='!'+' '.join(answer)+'!'
return final
print printBarCode(95014)
我目前的代码产生了
的输出 !!.!.. .!.!. !!... ...!! .!..!!
表示缺少校验位的邮政编码95014
。我的代码中是否缺少导致代码不输出校验位的内容?另外,在我的代码中包含哪些内容要求用户输入邮政编码?
答案 0 :(得分:1)
您的代码根据数字的总和计算rem
,但您从不使用它来将校验位条添加到输出(answer
和final
)。您需要添加代码才能获得正确的答案。我怀疑你还没有正确计算rem
,因为你使用的是%20
而不是%10
。
我用以下代码替换你函数的最后几行:
rem = (10 - sum_digits) % 10 # correct computation for the check digit
answer=[]
for i in str(zip_code):
answer.append(printDigit(int(i)))
answer.append(printDigit(rem)) # add the check digit to the answer!
final='!'+' '.join(answer)+'!'
return final
答案 1 :(得分:0)
有趣的问题。我注意到你作为C风格的程序员解决了这个问题。我猜测你的背景是用C / C ++编写的。我想提供更多的Pythonic方式:
def printBarCode(zip_code):
digit_dict = {1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',
6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'}
zip_code_list = [int(num) for num in str(zip_code)]
bar_code = ' '.join([digit_dict[num] for num in zip_code_list])
check_code = digit_dict[10 - sum(zip_code_list) % 10]
return '!{} {}!'.format(bar_code, check_code)
print printBarCode(95014)
我使用list comprehension来处理每个数字而不是迭代。我可以使用map()函数使其更具可读性,但列表理解更像Pythonic。另外,我使用Python 3.x格式进行字符串格式化。这是输出:
!!.!.. .!.!. !!... ...!! .!..! ...!!!
>>>