]> git.scottworley.com Git - rfc1751/commitdiff
decode support
authorScott Worley <scottworley@scottworley.com>
Thu, 15 Feb 2024 06:59:23 +0000 (22:59 -0800)
committerScott Worley <scottworley@scottworley.com>
Thu, 15 Feb 2024 07:02:44 +0000 (23:02 -0800)
rfc1751.py
rfc1751_test.py
tests/decode.sh [new file with mode: 0755]
tests/encode.sh

index 70bae6e5c91a7a95469d5e348886f608d322a7cb..70f5b3a64e469c0faed2ad37509474989f991368 100644 (file)
@@ -18,7 +18,8 @@ import sys
 from rfc1751wordlist import WORD_LIST, WORD_LIST_SIZE
 
 
-# TODO: Decode
+WORD_LIST_INVERTED = {word: i for (i, word) in enumerate(WORD_LIST)}
+assert len(WORD_LIST_INVERTED) == WORD_LIST_SIZE
 
 
 def encode_actual(x: int) -> list[str]:
@@ -30,8 +31,18 @@ def encode(x: int) -> list[str]:
     return [WORD_LIST[x]] if x == 0 else encode_actual(x)
 
 
+def decode(x: list[str]) -> int:
+    return WORD_LIST_SIZE * decode(x[:-1]) + \
+        WORD_LIST_INVERTED[x[-1]] if x else 0
+
+
 def main() -> None:
-    print(' '.join(encode(int(sys.argv[1]))))
+    if sys.argv[1].isnumeric():
+        print(' '.join(encode(int(sys.argv[1]))))
+    elif len(sys.argv) == 2:
+        print(decode(sys.argv[1].split(' ')))
+    else:
+        print(decode(sys.argv[1:]))
 
 
 if __name__ == '__main__':
index 9999dacf55edf11268a5148367b1ae895a9fcc72..a272e89489830118d8fe774c44a8537fbcac5321 100644 (file)
 
 import unittest
 
-from rfc1751 import encode
+from rfc1751 import encode, decode
 
 
 class TestRFC1751(unittest.TestCase):
+    def check(self, num: int, words: list[str]) -> None:
+        self.assertEqual(encode(num), words)
+        self.assertEqual(decode(words), num)
+
     def testRFC1751(self) -> None:
-        self.assertEqual(encode(0), ['A'])
-        self.assertEqual(encode(1), ['ABE'])
-        self.assertEqual(encode(2), ['ACE'])
-        self.assertEqual(encode(2047), ['YOKE'])
-        self.assertEqual(encode(2048), ['ABE', 'A'])
-        self.assertEqual(encode(2049), ['ABE', 'ABE'])
-        self.assertEqual(encode(2050), ['ABE', 'ACE'])
+        self.check(0, ['A'])
+        self.check(1, ['ABE'])
+        self.check(2, ['ACE'])
+        self.check(2047, ['YOKE'])
+        self.check(2048, ['ABE', 'A'])
+        self.check(2049, ['ABE', 'ABE'])
+        self.check(2050, ['ABE', 'ACE'])
 
         # Note: These can get NSFW
-        self.assertEqual(encode(2112325), ['FIRM', 'COCK'])
+        self.check(2112325, ['FIRM', 'COCK'])
 
 
 if __name__ == '__main__':
diff --git a/tests/decode.sh b/tests/decode.sh
new file mode 100755 (executable)
index 0000000..f90fecd
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+set -e
+
+[ "$(python3 rfc1751.py MANY WORD WORK)" = 6148810734 ]
+[ "$(python3 rfc1751.py 'ONE WORD WORK')" = 1597990894 ]
+[ "$(python3 rfc1751.py BIG BIG ONE SO BIG SO SO BIG ONE WORK GOOD WORK REAL GOOD)" = 669350037874937989068749321016845031137563765 ]
index 03e5e2c63af19af3afacbc44513bd18de0be5979..3b146c2339cd93f5f743105bf87f178c962c16da 100755 (executable)
@@ -3,3 +3,4 @@
 set -e
 
 [ "$(python3 rfc1751.py 2937402)" = 'LOVE YOU' ]
+[ "$(python3 rfc1751.py 669350037874937989068749321016845031137563765)" = 'BIG BIG ONE SO BIG SO SO BIG ONE WORK GOOD WORK REAL GOOD' ]