Guest User

Untitled

a guest
Dec 22nd, 2021
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.44 KB | None | 0 0
  1. import argparse
  2. import regex as re
  3.  
  4. from math import log2
  5.  
  6. from bitstring import BitArray
  7.  
  8.  
  9. pad_str = 'ВАЩЕ'
  10.  
  11. syms = (
  12.     'ПУК',
  13.     'СРЕНЬК',
  14.     'ХРЮК',
  15.     'УИИИ',
  16.     'ЛАХТА',
  17.     'ЛИБЕРАХА',
  18.     'ХОХЛЫ',
  19.     'СВИНОСОБАКА',
  20.     'ШВАЙНОКАРАСЬ',
  21.     'ЛОЛ',
  22.     'КЕК',
  23.     'АБУ',
  24.     'ДВАЧ',
  25.     'ПАРАША',
  26.     'ПОРИДЖ',
  27.     'ХРЮЧЕВО',
  28.     'СВИН',
  29.     'ПЕРДИКС',
  30.     'ПЫНЯ',
  31.     'ЧАЮ',
  32.     'ШУЕ',
  33.     'ЛЕВАК',
  34.     'ПРАВАК',
  35.     'КОМИГЛИСТ',
  36.     'ШВЯТЫЕ',
  37.     'ВАТА',
  38.     'ВОЛОДИН',
  39.     'ДОЛБИЛЬНЯ',
  40.     'ПЕРЕФОРС',
  41.     'КУНЧИК',
  42.     'АВАТАРКА',
  43.     'АНАЛЬЧИК'
  44. )
  45.  
  46. keys_len = int(log2(len(syms)))
  47.  
  48. syms_encode = {format(i, f'0{keys_len}b'): syms[i] for i in range(0, len(syms))}
  49.  
  50. syms_decode = {v: k for k, v in syms_encode.items()} | {pad_str: ''}
  51.  
  52.  
  53. def decode(string):
  54.     ba = ''.join([syms_decode[s] * int(c and c or 1) for (c, s) in re.findall(r'(\d*)(\w+)-?', string)])
  55.     pad_len = (len(ba) % 8)
  56.     ba = ba[:-pad_len]
  57.  
  58.     return BitArray(f'0b{ba}').bytes.decode()
  59.  
  60.  
  61. def encode(string):
  62.     def join(l):
  63.         result = [l[0]]
  64.         last = None
  65.  
  66.         for e in l[1:]:
  67.             if last == e:
  68.                 result[-1] += e
  69.             else:
  70.                 result.append(e)
  71.  
  72.             last = e
  73.  
  74.         return result
  75.  
  76.     ba = BitArray(string.encode()).bin
  77.     pad_len = keys_len - (len(ba) % keys_len)
  78.     ba = ba + ('0' * pad_len)
  79.  
  80.     return '-'.join([f'{len(g) // keys_len > 1 and len(g) // keys_len or ""}{syms_encode[g[:keys_len]]}' for g in join(re.findall(f'([01]{{{keys_len}}})', ba))] + [pad_len and pad_str or ''])
  81.  
  82.  
  83. if __name__ == '__main__':
  84.     parser = argparse.ArgumentParser(description='Encode and decode 2ch.hk fart code.')
  85.  
  86.     parser.add_argument('string', metavar='string', type=str,
  87.                         help='string for process')
  88.  
  89.     function = parser.add_mutually_exclusive_group(required=True)
  90.  
  91.     function.add_argument('-d', '--decode', dest='function', action='store_const',
  92.                           const=decode, help='decode string')
  93.  
  94.     function.add_argument('-e', '--encode', dest='function', action='store_const',
  95.                           const=encode, help='encode string')
  96.  
  97.     args = parser.parse_args()
  98.  
  99.     print(args.function(args.string))
  100.  
Add Comment
Please, Sign In to add comment