Created
September 3, 2014 00:53
-
-
Save alej0varas/db91bf565a2b7f46cf07 to your computer and use it in GitHub Desktop.
My Solution to Trello challenge
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" Trello job challeng """ | |
from itertools import product | |
import sys | |
import unittest | |
letters = "acdegilmnoprstuw" | |
def pyhash(s): | |
""" | |
Int64 hash (String s) { | |
Int64 h = 7 | |
String letters = "acdegilmnoprstuw" | |
for(Int32 i = 0; i < s.length; i++) { | |
h = (h * 37 + letters.indexOf(s[i])) | |
} | |
return h | |
} | |
""" | |
h = 7 | |
for i in range(len(s)): | |
h = (h * 37 + letters.index(s[i])) | |
return h | |
def bruteforce_pyhash_inverse(expected_result, length): | |
for s in product(letters, repeat=length): | |
s = ''.join(s) | |
result = pyhash(s) | |
if expected_result == result: | |
return result | |
def pyhash_inverse(expected_result): | |
""" | |
h = 7 | |
for i in range(len(s)): | |
h = (h * 37) + letters.index(s[i]) | |
""" | |
s = [] | |
value = expected_result | |
c = 0 | |
while value > 7: | |
if value % 37 == 0: | |
value = value // 37 | |
s.append(letters[c]) | |
c = 0 | |
else: | |
c += 1 | |
value = value - 1 | |
s = ''.join(s[::-1]) | |
return s | |
class pyhashTestCase(unittest.TestCase): | |
expected_result_7 = 680131659347 | |
test_s_7 = 'leepadg' | |
test_l_7 = len(test_s_7) | |
expected_result_3 = 354610 | |
test_s_3 = 'acd' | |
test_l_3 = len(test_s_3) | |
def test_pyhash(self): | |
result = pyhash(self.test_s_7) | |
self.assertEqual(result, self.expected_result_7) | |
def test_bruteforce_pyhash_inverse(self): | |
result = bruteforce_pyhash_inverse(self.expected_result_3, | |
self.test_l_3) | |
self.assertEqual(result, self.expected_result_3) | |
def test_pyhash_inverse(self): | |
result = pyhash_inverse(self.expected_result_7) | |
self.assertEqual(len(result), self.test_l_7) | |
self.assertEqual(result, self.test_s_7) | |
if __name__ == "__main__": | |
if len(sys.argv) < 2: | |
print("Usage: python trello_job.py <hash>") | |
exit() | |
value = int(sys.argv[1]) | |
result = pyhash_inverse(value) | |
print(result) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment