Compare commits

...

2 Commits

Author SHA1 Message Date
Remi Rampin 9aa42e5ffb Point out which codes are too close 2022-05-10 23:34:24 -04:00
Remi Rampin e2b711c3a6 Correct codes that are off by one 2022-05-10 23:25:13 -04:00
1 changed files with 48 additions and 25 deletions

View File

@ -11,6 +11,50 @@ assert len(ALPHABET) == 32
LENGTH = 4
def list_errors(code):
for place in range(LENGTH):
for replacement in ALPHABET:
if replacement == code[place]:
continue
new_code = code[:place] + replacement + code[place + 1:]
yield new_code
correct_codes = set()
errored_codes = {}
def _load_codes():
global correct_codes
global errored_codes
# Get the current codes
with get_db() as db:
correct_codes = set(row[0] for row in db.execute(
'''\
SELECT code FROM families;
''',
))
# Augment them with possible errored codes
errored_codes = {}
for code in correct_codes:
for error in list_errors(code):
if error in errored_codes:
raise ValueError("%s too close to %s" % (
code,
errored_codes[error],
))
errored_codes[error] = code
assert (
len(errored_codes)
== LENGTH * (len(ALPHABET) - 1) * len(correct_codes)
)
_load_codes()
CORRECT = {
'i': '1',
'l': '1',
@ -21,16 +65,8 @@ CORRECT = {
def correct_code(code):
code = code.lower()
fixed_code = ''.join(CORRECT.get(c, c) for c in code)
return fixed_code
def list_errors(code):
for place in range(LENGTH):
for replacement in ALPHABET:
if replacement == code[place]:
continue
new_code = code[:place] + replacement + code[place + 1:]
yield new_code
fixed_code = errored_codes.get(fixed_code, None)
return fixed_code or code
def main():
@ -43,20 +79,6 @@ def main():
else:
raise ValueError
# Get the current codes
with get_db() as db:
correct_codes = set(row[0] for row in db.execute(
'''\
SELECT code FROM families;
''',
))
# Augment them with possible errored codes
errored_codes = set()
for code in correct_codes:
errored_codes.update(list_errors(code))
assert len(errored_codes) == LENGTH * (len(ALPHABET) - 1) * len(correct_codes)
# Generate new codes
generated = 0
while generated < number:
@ -64,6 +86,7 @@ def main():
if code in correct_codes or code in errored_codes:
continue
correct_codes.add(code)
errored_codes.update(list_errors(code))
for error in list_errors(code):
errored_codes[error] = code
print(code)
generated += 1