The little things give you away... A collection of various small helper stuff
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

55 lignes
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)