Advertisement
Guest User

Untitled

a guest
Jan 31st, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. #
  4. # Converts any integer into a base [BASE] number. I have chosen 62
  5. # as it is meant to represent the integers using all the alphanumeric
  6. # characters, [no special characters] = {0..9}, {A..Z}, {a..z}
  7. #
  8. # I plan on using this to shorten the representation of possibly long ids,
  9. # a la url shortenters
  10. #
  11. # saturate() takes the base 62 key, as a string, and turns it back into an integer
  12. # dehydrate() takes an integer and turns it into the base 62 string
  13. #
  14. import math
  15. import sys
  16.  
  17. BASE = 62
  18.  
  19. UPPERCASE_OFFSET = 55
  20. LOWERCASE_OFFSET = 61
  21. DIGIT_OFFSET = 48
  22.  
  23. def true_ord(char):
  24. """
  25. Turns a digit [char] in character representation
  26. from the number system with base [BASE] into an integer.
  27. """
  28.  
  29. if char.isdigit():
  30. return ord(char) - DIGIT_OFFSET
  31. elif 'A' <= char <= 'Z':
  32. return ord(char) - UPPERCASE_OFFSET
  33. elif 'a' <= char <= 'z':
  34. return ord(char) - LOWERCASE_OFFSET
  35. else:
  36. raise ValueError("%s is not a valid character" % char)
  37.  
  38. def true_chr(integer):
  39. """
  40. Turns an integer [integer] into digit in base [BASE]
  41. as a character representation.
  42. """
  43. if integer < 10:
  44. return chr(integer + DIGIT_OFFSET)
  45. elif 10 <= integer <= 35:
  46. return chr(integer + UPPERCASE_OFFSET)
  47. elif 36 <= integer < 62:
  48. return chr(integer + LOWERCASE_OFFSET)
  49. else:
  50. raise ValueError("%d is not a valid integer in the range of base %d" % (integer, BASE))
  51.  
  52.  
  53. def saturate(key):
  54. """
  55. Turn the base [BASE] number [key] into an integer
  56. """
  57. int_sum = 0
  58. reversed_key = key[::-1]
  59. for idx, char in enumerate(reversed_key):
  60. int_sum += true_ord(char) * int(math.pow(BASE, idx))
  61. return int_sum
  62.  
  63.  
  64. def dehydrate(integer):
  65. """
  66. Turn an integer [integer] into a base [BASE] number
  67. in string representation
  68. """
  69.  
  70. # we won't step into the while if integer is 0
  71. # so we just solve for that case here
  72. if integer == 0:
  73. return '0'
  74.  
  75. string = ""
  76. while True:
  77. remainder = integer % BASE
  78. string = true_chr(remainder) + string
  79. # fix string startwith 0
  80. if integer == 0:
  81. break
  82. integer /= BASE
  83. return string
  84.  
  85. if __name__ == '__main__':
  86.  
  87. # not really unit tests just a rough check to see if anything is way off
  88. if sys.argv[1] == '-tests':
  89. passed_tests = True
  90. for i in xrange(0, 1000):
  91. passed_tests &= (i == saturate(dehydrate(i)))
  92. print passed_tests
  93. else:
  94. user_input = sys.argv[2]
  95. try:
  96. if sys.argv[1] == '-s':
  97. print saturate(user_input)
  98. elif sys.argv[1] == '-d':
  99. print dehydrate(int(user_input))
  100. else:
  101. print "I don't understand option %s" % sys.argv[1]
  102. except ValueError as e:
  103. print e
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement