Browse Source

Add alphabetseq

master
JustAnotherArchivist 2 years ago
parent
commit
eaf53e1a44
1 changed files with 54 additions and 0 deletions
  1. +54
    -0
      alphabetseq

+ 54
- 0
alphabetseq View File

@@ -0,0 +1,54 @@
#!/usr/bin/env python3
import itertools
import sys


def decimal_to_alphabet(n: int, alphabet: str) -> str:
if n == 0:
return alphabet[0]
base = len(alphabet)
digits = []
while n:
digits.append(alphabet[n % base])
n //= base
return ''.join(digits[::-1])


def alphabet_to_decimal(s: str, alphabet: str) -> int:
base = len(alphabet)
l = len(s)
return sum(alphabet.index(s[l - 1 - i]) * base ** i for i in range(l))


def test():
assert alphabet_to_decimal('ff', '0123456789abcdef') == 255
assert alphabet_to_decimal('100', '0123456789abcdef') == 256
assert decimal_to_alphabet(255, '0123456789abcdef') == 'ff'
assert decimal_to_alphabet(256, '0123456789abcdef') == '100'
assert decimal_to_alphabet(0, '0123456789') == '0'


if __name__ == '__main__':
if len(sys.argv) == 2 and sys.argv[1] == '--test':
test()
elif len(sys.argv) == 4 or (len(sys.argv) == 5 and sys.argv[2] == '--decimal'):
if len(sys.argv) == 4:
alphabet = sys.argv[1]
start, stop = map(lambda x: alphabet_to_decimal(x, alphabet), sys.argv[2:])
else:
alphabet = sys.argv[1]
start, stop = map(int, sys.argv[3:])
for i in range(start, stop + 1):
try:
sys.stdout.write(decimal_to_alphabet(i, alphabet) + '\n')
except (BrokenPipeError, IOError):
try:
sys.stdout.close()
except IOError:
pass
break
else:
print('Usage: alphabetseq ALPHABET [--decimal] START STOP', file = sys.stderr)
print('Generates the sequence from START to STOP (inclusive) using ALPHABET', file = sys.stderr)
print('By default, START and STOP are expressed in ALPHABET. With --decimal, they are treated as decimal values instead.', file = sys.stderr)
print('`alphabetseq 0123456789 $N $M` is equivalent to `seq $N $M`.', file = sys.stderr)

Loading…
Cancel
Save