Как я могу исправить этот алгоритм?
def change_num(n, direc, numMove):
if direc == 'back':
nums = range(10)
return nums[n-numMove]
elif direc == 'forward':
nums = range(10)
nums.reverse()
return nums[n-numMove]-1
Это не работает для directc == 'back' здесь приведены некоторые ожидаемые результаты:
0 1 2 3 4 5 6 7 8 9
change_num(1,'back', 5) -> 6
change_num(5,'back', 1) -> 4
change_num(7,'forward',5) -> 2
change_num(0,'forward',5) -> 5
Вы понимаете, как работает алго? Я просто не применяю его правильно.
Вместо 'back'
и 'forward'
будет проще передать +1
для форварда и -1
для возврата. Тогда ваша функция упростится до
def change_num(n, direc, num_move):
return (n + direc * num_move) % 10
def change_num(n, direc, numMove):
d = {'back' : -1, 'forward' : 1}
return (n + d[direc]*numMove) % 10
Вы подумали, что делает эта функция? этот список num
бессмыслен bc num[x]
=== x
. Вам не нужны инструкции для "назад" и "вперед", они действительно соответствуют -1
и 1
соответственно.
Ваша функция слишком сложна и не будет работать в Python 3.
% cat ./test.py
#!/usr/bin/env python
import unittest
def change_num(n, direc, numMove):
directions = {
'back': -1,
'forward': +1,
}
steps = n + directions[direc] * numMove
wrapped = steps % 10
return wrapped
class TestChangeNum(unittest.TestCase):
def test_back_no_wrap(self):
self.assertEquals(6, change_num(1, 'back', 5))
def test_back_with_wrap(self):
self.assertEquals(4, change_num(5, 'back', 1))
def test_forward_with_wrap(self):
self.assertEquals(2, change_num(7, 'forward', 5))
def test_forward_no_wrap(self):
self.assertEquals(5, change_num(0, 'forward', 5))
if __name__ == '__main__':
unittest.main()
% python test.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
change_num(7,'forward',5) -> 4
?