| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import unittest
- def isIncreasing(n):
- """
- Returns boolean whether number is increasing
- Decreasing defined as whether next digit is larger or equal
- """
- s = str(n)
- b = True
- for i in range(len(s) - 1):
- if int(s[i]) > int(s[i + 1]):
- b = False
- return b
- def isDecreasing(n):
- """
- Returns boolean whether number is decreasing
- Decreasing defined as whether next digit is smaller or equal
- """
- s = str(n)
- b = True
- for i in range(len(s) - 1):
- if int(s[i]) < int(s[i + 1]):
- b = False
- return b
- def isBouncy(n):
- """
- Returns boolean whether number is bouncy
- Bouncy defined as not increasing or decreasing
- """
- return not (isIncreasing(n) or isDecreasing(n))
- def main(n):
- bouncy = 0.0 # Number of bouncy numbers so far
- total = 0 # Also functions as a counter
- prop = 0.0 # Proportion of bouncy numbers
- while prop < n:
- total += 1
- if isBouncy(total):
- bouncy += 1
- prop = bouncy / total
- return total
- # Testing suite
- # Based on Project Euler description
- class Bouncy(unittest.TestCase):
- def test_increasing(self):
- self.assertTrue(isIncreasing(134468))
- self.assertFalse(isIncreasing(66420))
- self.assertFalse(isIncreasing(155349))
- def test_decreasing(self):
- self.assertFalse(isDecreasing(134468))
- self.assertTrue(isDecreasing(66420))
- self.assertFalse(isDecreasing(155349))
- def test_bouncy(self):
- self.assertFalse(isBouncy(134468))
- self.assertFalse(isBouncy(66420))
- self.assertTrue(isBouncy(155349))
- def test_50bouncy(self):
- self.assertEqual(538, main(0.5))
- def test_90bouncy(self):
- self.assertEqual(21780, main(0.9))
- if __name__ == "__main__":
- print main(0.99)
- unittest.main()
|