每天开心一点

Python: 每日一题 38

2017-11-27 13:23:00    六月    568    来源: http://bbs.fishc.com/thread-86747-1-1.html

有一个车的里程表是以整数方式显示的,但是有个毛病,每到4时会直接跳至5,例如3后面本应该显示4,但是直接显示为5。
那么当显示为13公里的时候,实际上是12公里。(因为4被跳了。)
而当显示为15公里的时候,实际上是13公里。(因为4和14被跳了。)

现在请给出一个函数,当输入显示公里数时,返回实际公里数。

有人表示有答案会影响自己的思路,所以答案将延迟放出(我会告诉你,其实是我没做出来吗?)。

给出测试代码,test.py请在每日一题33,34中查看。
  1. test.assert_equals(faulty_odometer(13), 12)
  2. test.assert_equals(faulty_odometer(15), 13)
  3. test.assert_equals(faulty_odometer(55), 40)
  4. test.assert_equals(faulty_odometer(2005), 1462)
  5. test.assert_equals(faulty_odometer(1500), 1053)
  6. test.assert_equals(faulty_odometer(999999), 531440)
  7. test.assert_equals(faulty_odometer(165826622), 69517865)


更新答案。

def faulty_odometer(n):

  1.     result = 0
  2.     digits = len(str(n))
  3.     nonaryTranslation = "".join([str(int(x)-1) if int(x) >= 5 else x for x in list(str(n))])
  4.     for i in nonaryTranslation:
  5.         digits -= 1
  6.         result += int(i) * (9**digits)
  7.     return result
 
下面这个更溜!
  1. tr = str.maketrans('56789', '45678')
  2. def faulty_odometer(n):
  3.     return int(str(n).translate(tr), 9)