Ik dacht, zou het geen goed idee zijn om eens een quizronde te maken waar elk antwoord een letter langer is dan het vorige antwoord? En ook, dat elk antwoord een isogram is, ’t is te zeggen, een woord waar geen enkele letter in herhaald wordt? En ook, dat de antwoorden alfabetisch op elkaar volgen? En om het mij gemakkelijk te maken, dat ik alle artikels van Wikipedia in het Nederlands en in het Engels als input zou nemen?
Welzeker, dacht ik. Python to the rescue!
import sys
import string
import gzip
import re
import unicodedata
from prettytable import PrettyTable
if len(sys.argv) != 4:
print("Please specify a starting letter, a lengte, and a taal as command lijn arguments.")
sys.exit()
begin = sys.argv[1].lower()
lengte = int(sys.argv[2])
taal = sys.argv[3].lower()
if taal == "nl":
text_file = "nlwiki-20221230-all-titles-in-ns-0.gz"
elif taal == "en":
text_file = "enwiki-20221230-all-titles-in-ns-0.gz"
else:
print("Invalid taal. Please specify 'nl' or 'en'.")
sys.exit()
with gzip.open(text_file, 'rt', encoding='utf-8', errors='ignore') as f:
isograms = set()
for lijn in f:
woorden = lijn.split()
for woord in woorden:
woord = re.sub(r'\(.+\)', '', woord)
woord_lengte = 0
for ch in woord:
ch = unicodedata.normalize("NFKD", ch)
if ch in string.ascii_letters:
woord_lengte += 1
if woord_lengte == lengte and woord[0].lower() == begin:
woord = woord.lower()
uniekeletters = set()
for letter in woord:
if letter not in string.ascii_lowercase:
continue
elif letter in uniekeletters:
break
else:
uniekeletters.add(letter)
else:
woord = woord.replace('_', ' ').title().rstrip()
isograms.add(woord)
table = PrettyTable()
table.field_names = ['1', '2', '3', '4', '5', '6']
isograms = list(isograms)
for i in range(0, len(isograms), 6):
row = isograms[i:i+6]
while len(row) < 6:
row.append('')
table.add_row(row)
print(table)
Dat krijgt een beginletter, een lengte en een taal mee, opent dan het archief met alle wikipedia-titels in de taal, haalt de tekst tussen haakjes uit de titels en zoekt dan naar unieke isogrammen waarbij alleen de letters tellen (om bijvoorbeeld “The Musical Box (band)” niet voor 22 maar voor 13 karakters te laten tellen). En dan print het dat allemaal in een tabelletje uit.
Voor python .\iso.py q 10 nl
krijg ik dan bijvoorbeeld:
+---------------+-------------+-------------+-------------+-------------+-------------+
| 1 | 2 | 3 | 4 | 5 | 6 |
+---------------+-------------+-------------+-------------+-------------+-------------+
| Quirks Mode | Quebrachos | Quaker City | Quiet Chaos | Qafzehgrot | Quasigroep |
| Quezon City | Quackplein | Quezon-Stad | Quaschwitz | Quadriceps | Quirksmode |
| Qumarlêb Xiàn | Qiongzhuea | Quakertown | Quasi Forte | Quinto Real | Qalb Tounes |
| Quizmaster | Qafzeh-Grot | Quadcopter | Qwertyuiop | | |
+---------------+-------------+-------------+-------------+-------------+-------------+
Ik heb het al meer dan eens gezegd, maar het is zo fantastisch om op eentweedrie te kunnen wat er in uw hoofd zit. Nu nog goede antwoorden vinden en daar dan goede vragen op maken.