Initial commit

This commit is contained in:
Tilman Kranz 2022-08-20 09:51:37 +02:00
commit 6099f6d242
2 changed files with 102 additions and 0 deletions

38
README.md Normal file
View File

@ -0,0 +1,38 @@
# Transform Set of Strings to Common Prefix Notation
## Description
Presented with a series of lines on standard input, the program will
print an expression on standard output that denotes the line strings
in a syntax described in <https://tk-sls.de/wp/6071>.
The expression is suitable for Bourne Again Shell brace expansion.
## Test
```
$ python3 trie.py << EOF
a
ab
abc
EOF
```
Expected output:
```
a{,b{,c}}
```
Test if the output is accurate:
```
$ bash -c 'echo a{,b{,c}}'
```
Expected output:
```
a ab abc
```

64
trie.py Normal file
View File

@ -0,0 +1,64 @@
#!/usr/bin/env python
# author: Tilman Kranz <t.kranz@tk-sls.de>
# license: MIT License <https://opensource.org/licenses/MIT>
# summary: Transform a series of lines into a common prefix notation.
import sys
# thanks: https://www.adamsmith.haus/python/answers/how-to-create-a-trie-in-python
def construct_trie(word_list):
root = dict()
for word in word_list:
level = root
l = len(word)
last = l - 1
for i in range(l):
letter = word[i]
if letter not in level:
level[letter] = dict()
if i == last:
level[letter][''] = dict()
level = level[letter]
return root
def print_trie(trie):
length = len(trie)
if length == 0:
return
if length > 1:
sys.stdout.write("{")
count = 1
for k in trie:
if k == '{' or k == ',' or k == '}':
sys.stdout.write('\\')
sys.stdout.write(k)
print_trie(trie[k])
if count < length:
sys.stdout.write(",")
count += 1
if length > 1:
sys.stdout.write("}")
lines = []
for line in sys.stdin:
stripped = line.strip()
if stripped != "":
lines.append(stripped)
trie = construct_trie(lines)
# -DEBUG- Dump trie datastructure to standard output.
# print(trie)
print_trie(trie)
sys.stdout.write("\n")