2011-05-19 55 views
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 

這並不適用於直銷==「回」 這裏工作的是一些樣品的預期收益:

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, '前進',5) - > 4'? – 2011-05-19 20:28:37

+0

雅它是錯字,應該是'2',修正它 – MistahX 2011-05-19 20:29:08

回答

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

你有沒有想過這個功能呢?這num名單是毫無意義的bc num[x] === x。你不需要if'back'和'forward'語句,它們分別對應於-11

+0

我把它nums定義爲nums =範圍(10) – MistahX 2011-05-19 20:31:25

+0

沒有數字。我錯打過 – 2011-05-19 20:33:18

4

而不是'back''forward',它會更容易通過+1轉發和-1後面。然後你的函數簡化爲

def change_num(n, direc, num_move): 
    return (n + direc * num_move) % 10 
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