The little things give you away... A collection of various small helper stuff
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

55 satır
1.7 KiB

  1. #!/usr/bin/env python3
  2. import itertools
  3. import sys
  4. def decimal_to_alphabet(n: int, alphabet: str) -> str:
  5. if n == 0:
  6. return alphabet[0]
  7. base = len(alphabet)
  8. digits = []
  9. while n:
  10. digits.append(alphabet[n % base])
  11. n //= base
  12. return ''.join(digits[::-1])
  13. def alphabet_to_decimal(s: str, alphabet: str) -> int:
  14. base = len(alphabet)
  15. l = len(s)
  16. return sum(alphabet.index(s[l - 1 - i]) * base ** i for i in range(l))
  17. def test():
  18. assert alphabet_to_decimal('ff', '0123456789abcdef') == 255
  19. assert alphabet_to_decimal('100', '0123456789abcdef') == 256
  20. assert decimal_to_alphabet(255, '0123456789abcdef') == 'ff'
  21. assert decimal_to_alphabet(256, '0123456789abcdef') == '100'
  22. assert decimal_to_alphabet(0, '0123456789') == '0'
  23. if __name__ == '__main__':
  24. if len(sys.argv) == 2 and sys.argv[1] == '--test':
  25. test()
  26. elif len(sys.argv) == 4 or (len(sys.argv) == 5 and sys.argv[2] == '--decimal'):
  27. if len(sys.argv) == 4:
  28. alphabet = sys.argv[1]
  29. start, stop = map(lambda x: alphabet_to_decimal(x, alphabet), sys.argv[2:])
  30. else:
  31. alphabet = sys.argv[1]
  32. start, stop = map(int, sys.argv[3:])
  33. for i in range(start, stop + 1):
  34. try:
  35. sys.stdout.write(decimal_to_alphabet(i, alphabet) + '\n')
  36. except (BrokenPipeError, IOError):
  37. try:
  38. sys.stdout.close()
  39. except IOError:
  40. pass
  41. break
  42. else:
  43. print('Usage: alphabetseq ALPHABET [--decimal] START STOP', file = sys.stderr)
  44. print('Generates the sequence from START to STOP (inclusive) using ALPHABET', file = sys.stderr)
  45. print('By default, START and STOP are expressed in ALPHABET. With --decimal, they are treated as decimal values instead.', file = sys.stderr)
  46. print('`alphabetseq 0123456789 $N $M` is equivalent to `seq $N $M`.', file = sys.stderr)