So, I've been working at this for hours and hours, this is a homework assignment and I just can't figure out why the code doesn't execute completely. I provided all the code to see if there was something I missed outside of the 'assign2' function. However, I know the issue is down there and want to figure out what's wrong.
I'm essentially trying to take the number that is generated last and turn it back into letters representative of Napier arithmetic (ie a = 0, b = 1, c = 2...z = 25) and putting them together in a list that I can print in the main function. Everything else works except for this last part and I'm trying to figure out why.
def main():
again = "y"
while again == "y" or again == "Y":
var = checkalpha()
num = assign(var)
print("The first number is: {}".format(num))
var2 = checkalpha()
num2 = assign(var2)
print("The second number is: {}".format(num2))
arithmetic = getsign()
value = equation(num, num2, arithmetic)
newvar = assign2(value)
print("The result is {} or {}".format(value, newvar))
again = input("Would you like to repeat the program? Enter y for yes, n for no: ")
def checkalpha():
num = input("Enter Napier number: ")
while not num.isalpha():
print("Something is wrong. Try again.")
num = input("Enter Napier number: ")
return num
def assign(char):
value = 0
for ch in char:
value += 2 ** (ord(ch) - ord("a"))
return value
def getsign():
operand = input("Enter the desired arithmetic operation: ")
while operand not in "+-*/":
operand = input("Something is wrong. Try again. ")
return operand
def equation(num, num2, arithmetic):
if arithmetic == "+":
answer = num + num2
elif arithmetic == "-":
answer = num - num2
elif arithmetic == "*":
answer = num * num2
elif arithmetic == "/":
answer = num / num2
else:
input("Something is wrong. Try again. ")
return answer
def assign2(n):
new = []
while n != 0:
value = n%2
x = n//2
ch = chr(value + ord("a"))
new.append(ch)
n = x
return new
main()
Your function is fairly close. The problem is with ch = chr(value + ord("a"))
. We need to encode the bit position into the letter with that position in the alphabet. A letter gets added to the list if the bit in that position is not zero. And at the end of the function we can join the list of letters into a string.
Here's a repaired version of your function, with some test code that verifies that it works on the examples in the Wikipedia article on Location_arithmetic
def assign2(n):
new = []
position = 0
while n != 0:
value = n % 2
x = n // 2
if value:
ch = chr(position + ord("a"))
new.append(ch)
n = x
position += 1
return ''.join(new)
# test
data = [
(87, 'abceg'),
(3147, 'abdgkl'),
]
for n, napier_string in data:
s = assign2(n)
print(n, napier_string, s, napier_string == s)
output
87 abceg abceg True
3147 abdgkl abdgkl True
Here's a more Pythonic version of that function, with a more meaningful name.
def int_to_napier(n):
new = []
for position in range(26):
if n == 0:
break
value, n = n % 2, n // 2
if value:
new.append(chr(position + ord("a")))
return ''.join(new)
And here's another one that avoids the character calculation by looping over a string containing the lowercase letters.
from string import ascii_lowercase
def int_to_napier(n):
new = []
for ch in ascii_lowercase:
if n == 0:
break
value, n = n % 2, n // 2
if value:
new.append(ch)
return ''.join(new)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.