Манипулировать числовым алгоритмом

1

Как я могу исправить этот алгоритм?

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

Вы понимаете, как работает алго? Я просто не применяю его правильно.

  • 0
    Почему change_num(7,'forward',5) -> 4 ?
  • 0
    да, это была опечатка, должно быть '2', исправил
Теги:

3 ответа

4

Вместо 'back' и 'forward' будет проще передать +1 для форварда и -1 для возврата. Тогда ваша функция упростится до

def change_num(n, direc, num_move):
    return (n + direc * num_move) % 10
2
def change_num(n, direc, numMove):
   d = {'back' : -1, 'forward' : 1}
   return (n + d[direc]*numMove) % 10

Вы подумали, что делает эта функция? этот список num бессмыслен bc num[x] === x. Вам не нужны инструкции для "назад" и "вперед", они действительно соответствуют -1 и 1 соответственно.

  • 0
    Я так понимаю, nums определяется как nums = range (10)
  • 0
    нет чисел я опечатал раньше
0

Ваша функция слишком сложна и не будет работать в 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню