-
Notifications
You must be signed in to change notification settings - Fork 62
/
trocar.py
executable file
·104 lines (86 loc) · 3.25 KB
/
trocar.py
1
2
3
4
5
6
7
8
9
10
11
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env python3
"""
Tira uma palavra de dadoware.txt, adicionando outra no lugar.
Se a palavra a ser adicionada não é especificada, coloca uma sorteada
do arquivo fontes/excluidas_por_sorteio.txt.
"""
import unicodedata
import sys
import random
import itertools
PATH_PALAVRAS = '7776palavras.txt'
QT_PALAVRAS = 6 ** 5
PATH_DADOWARE = 'dadoware.txt'
PATH_CANDIDATAS = 'fontes/candidatas.txt'
def shave_marks(txt):
"""Remove all diacritic marks"""
norm_txt = unicodedata.normalize('NFD', txt)
shaved = ''.join(c for c in norm_txt if not unicodedata.combining(c))
return unicodedata.normalize('NFC', shaved)
def normalizar(txt):
return shave_marks(txt).lower()
def duplicatas():
with open(PATH_PALAVRAS, encoding='utf8') as fp:
palavras = [p.strip() for p in fp]
assert len(palavras) == QT_PALAVRAS
normals = [normalizar(p) for p in sorted(palavras)]
for p in palavras:
if normals.count(normalizar(p)) > 1:
print(p)
def trocar(retirar, adicionar=None):
with open(PATH_PALAVRAS, encoding='utf8') as fp:
palavras = [p.strip() for p in fp]
palavras_set = {normalizar(p) for p in palavras}
try:
with open(PATH_CANDIDATAS, encoding='utf8') as fp:
candidatas = [p.strip() for p in fp]
except FileNotFoundError:
candidatas = []
try:
palavras.remove(retirar)
except ValueError:
print('*** Erro: palavra {!r} não encontrada.'.format(retirar))
sys.exit(-1)
if adicionar is None:
if len(candidatas) == 0:
print('*** Erro: não há mais palavras para adicionar.'.format(retirar))
sys.exit(-2)
adicionar = random.choice(candidatas)
ex_candidata = adicionar
else:
if adicionar in candidatas:
ex_candidata = adicionar
else:
ex_candidata = None
if normalizar(adicionar) in palavras_set:
ad_norm = normalizar(adicionar)
print('*** Erro: palavra {!r} já existe.'.format(ad_norm))
sys.exit(-3)
palavras.append(adicionar)
assert len(palavras) == QT_PALAVRAS
palavras.sort(key=normalizar)
print('- {} | + {}'.format(retirar, adicionar))
with open(PATH_PALAVRAS, 'wt', encoding='utf8') as fp:
fp.write('\n'.join(palavras) + '\n')
dados5 = list(''.join(dados) for dados in itertools.product('123456', repeat=5))
with open(PATH_DADOWARE, 'wt', encoding='utf8') as fp:
for indice, palavra in zip(dados5, palavras):
linha = '{} {}\n'.format(indice, palavra)
fp.write(linha)
if ex_candidata is not None:
candidatas.remove(ex_candidata)
candidatas.sort(key=normalizar)
with open(PATH_CANDIDATAS, 'wt', encoding='utf8') as fp:
fp.write('\n'.join(candidatas) + '\n')
if __name__ == '__main__':
#duplicatas()
#raise SystemExit
import argparse
parser = argparse.ArgumentParser(description=__doc__.split('\n')[0])
parser.add_argument('retirar', metavar='palavra-sai',
help='a palavra a ser retirada')
parser.add_argument('-a', dest='adicionar', metavar='palavra-entra',
help='a palavra a ser adicionada')
args = parser.parse_args()
#print(args._get_kwargs())
trocar(**dict(args._get_kwargs()))