我被指派创建一个应用程序,该应用程序采用用户的名字和名字(确保它们不超过 10 个字符)并根据此网格计算他们的“幸运名字号码”:
例如,John Smith 将是:
= (1 + 6 + 8 + 5) + (1 + 4 + 9 + 2 + 8)
= 20 + 24
然后将每个值中的数字相加:
= (2 + 0) + (2 + 4)
= 2 + 6
= 8 <- 他们的幸运号码。
这是我目前的代码:
while True:
first_name = input("What is your first name? ")
if len(first_name) < 10:
print("Hello " + first_name + ", nice name!")
break
else:
print("First name is too long, please enter a shorter name.")
while True:
second_name = input("What is your second name? ")
if len(second_name) < 10:
print ("Wow, " + first_name + " " + second_name + " is a really cool name. Let's see how lucky you are...")
break
else:
print ("Second name is too long, please enter a shorter name.")
但是,我不确定我的下一步是什么,因为我需要获取名称中的每个字母并使其成为特定值。
我能想到的唯一方法是像这样列出每个字母及其分配的值:
A = 1
B = 2
C = 3
D = 4
E = 5
F = 6
G = 7
H = 8
I = 9
J = 1
K = 2
L = 3
M = 4
N = 5
O = 6
P = 7
Q = 8
R = 9
S = 1
T = 2
U = 3
V = 4
W = 5
X = 6
Y = 7
Z = 8
fletter_1 = first_name[0]
fletter_2 = first_name[1]
fletter_3 = first_name[2]
fletter_4 = first_name[3]
fletter_5 = first_name[4]
fletter_6 = first_name[5]
fletter_7 = first_name[6]
fletter_8 = first_name[7]
fletter_9 = first_name[8]
fletter_10 = first_name[9]
print fletter_1 + fletter_2 + fletter_3 + fletter_4 + fletter_5 + fletter_6 + fletter_7 + fletter_8 + fletter_9
但这是一个极其漫长的过程,并不是最好的编码方式。
请有人指导我如何以最好的方式完成下一步,因为我不确定该怎么做。
请您参考如下方法:
如果您还没有听说过 ASCII table ,这几乎是如何用二进制表示字符的约定。 python 中的函数 ord(c) 根据 ASCII 表为您提供给定字符的值。 我注意到您的幸运姓名数字网格每 9 个字母给出相同的值,在数学中可以表示为 % 9。因此:
# ASCII value of A
>>> ord('A')
65
# Except that we wanted 1 for A
>>> ord('A') - 64
1
# And we also want 1 for J and S
>>> (ord('J') - 64) % 9
1
>>> (ord('S') - 64) % 9
1
>>> (ord('Z') - 64) % 9
8
您可以使用最后一个公式:(ord(c) - 64) % 9
编辑: 正如 Loïc G. 所指出的,我的公式有一个小错误,因为模函数有时会返回 0,而您的表格网格的索引从 1 开始。这是最终版本:
ord(c.lower()) - ord('a')) % 9) + 1
ord('a') 返回 97(避免对值进行硬编码),而 c.lower() 使函数适用于小写和大写字符。与第一个算法的最大区别在于最后的 + 1,根据网格的要求将所有索引移动 1。
