regex-riddles/generate.py

174 lines
4.1 KiB
Python
Raw Normal View History

2024-05-17 19:42:50 +02:00
#!/usr/bin/python3
from random import randint, random, choice
from choice_network import Choice, FixedText, RandInt, Network
2024-06-03 13:35:05 +02:00
def get_names(filename, pad = " "):
2024-06-03 10:39:40 +02:00
lines = []
with open(filename) as file:
lines = file.read().split("\n")
names = [
2024-06-03 13:35:05 +02:00
name + pad
2024-06-03 10:39:40 +02:00
for name in lines
if len(name) > 1
]
return names
2024-05-17 19:42:50 +02:00
greeting = """
2024-06-03 10:39:53 +02:00
Re: AW: Exmatrikulationsgefährdete Studierende
---------
2024-05-17 19:42:50 +02:00
Englisch version below.
Hallo,
2024-06-03 12:45:40 +02:00
Zur angefragten Prüfung gibt es leider noch keine Datenbank,
daher hier unsere Notizen aus Prüfungsakten und Personendatenbank.
Vielleicht können Sie die ja mit regulären Ausdrücken filtern.
Das funktioniert wie normale Text-Suche, nur etwas flexibler:
(Erst|Zweit)versuch z.B. würde sowohl 'Erstversuch'
als auch 'Zweitversuch' markieren.
.+ akzeptiert alle Zeichen, das können Sie vorn anfügen,
2024-06-03 13:27:57 +02:00
um im Menü 'List' unten rechts den Anfang der Zeile zu sehen.
2024-05-17 19:42:50 +02:00
Viel Spaß
=== ENGLISCH VERSION ===
2024-06-03 12:45:40 +02:00
Hi,
there is no database for this exam, so we can only send our digitized notes.
Maybe you can filter it with regular expressions?
2024-06-03 13:02:12 +02:00
They are like normal text-search but more flexible:
2024-06-03 12:45:40 +02:00
E.g.: (Erst|Zweit)versuch would select both words:
'Erstversuch' (first attempt) and 'Zweitversuch' (second attempt).
2024-06-03 13:02:12 +02:00
.+ will accept any text, you can add it at the start to see the whole line
2024-06-03 13:27:57 +02:00
in the menu 'List' (bottom right).
2024-05-17 19:42:50 +02:00
"""
# fünf Tatverdächtige
# Uhrzeiten, siehe Infos von Verantwortlichen
# Groß-Klein-Schreibung
2024-06-03 11:41:53 +02:00
date = "05.06.2024"
2024-06-03 11:02:01 +02:00
hidden_data = [
2024-06-03 13:35:05 +02:00
"Anna Bartel: Zweitversuch nicht bestanden.",
"Boris Parsch: Zweitversuch nicht bestanden.",
"Carola Winter: 2. Versuch nicht bestanden.",
"Dennis Meier: 2. Versuch nicht bestanden.",
"Elisa Menniz: Zweitversuch nicht bestanden.",
f"Anna Bartel: Prüfung am {date} um 13:00.",
f"Boris Parsch: Prüfung am {date} um 14:00.",
f"Carola Winter: Prüfung am {date} um 13:30.",
f"Dennis Meier: Prüfung am {date} um 10:00.",
f"Elisa Menniz: Prüfung am {date} um 14:30.",
f"Anna Bartel: blaue Augen.",
f"Boris Parsch: blaue Augen.",
f"Carola Winter: blaue Augen.",
f"Dennis Meier: grüne Augen.",
f"Elisa Menniz: grüne Augen.",
2024-06-03 11:02:01 +02:00
]
2024-05-17 19:42:50 +02:00
network = Network(
start = Choice(
2024-06-03 12:10:45 +02:00
student = [""],
),
student = Choice(
2024-06-02 21:27:26 +02:00
last_name = get_names("vornamen.csv"),
),
last_name = Choice(
2024-06-03 13:35:05 +02:00
student_mit = get_names("nachnamen.csv", pad = ""),
),
student_mit = Choice(
2024-06-03 12:17:12 +02:00
hat_den = [""],
),
2024-06-03 11:12:40 +02:00
hat_den = Choice(
2024-06-03 13:35:05 +02:00
versuch = [": ",],
2024-06-03 13:42:37 +02:00
prüfungszeit = [(f": Prüfung am {date} um ", f": exam on {date}, ")],
2024-06-03 13:35:05 +02:00
augenfarbe = [": ",],
2024-06-03 12:00:14 +02:00
),
augenfarbe = Choice(
2024-06-03 13:42:37 +02:00
augen = [
("grüne ", "green "),
("braune ", "brown "),
("blaue ", "blue "),
],
2024-06-03 12:00:14 +02:00
),
augen = FixedText(
2024-06-03 13:42:37 +02:00
stop = ("Augen.", "eyes."),
2024-06-03 11:12:40 +02:00
),
prüfungszeit = Choice(
uhr = [
"09:00",
"09:30",
"10:00",
"10:30",
"11:00",
"11:30",
"12:00",
"12:30",
"13:00",
"13:30",
"14:00",
"14:30",
"15:00",
"15:30",
],
),
uhr = FixedText(
2024-06-03 13:42:37 +02:00
stop = (" Uhr.", "."),
),
versuch = Choice(
2024-06-03 13:42:37 +02:00
nicht = [
("Erstversuch ", "first attempt"),
("1. Versuch ", "1st attempt"),
],
bestanden = [
("Erstversuch ", "first attempt"),
("1. Versuch ", "1st attempt"),
("Zweitversuch ", "second attempt"),
("2. Versuch ", "2nd attempt"),
],
),
nicht = Choice(
2024-06-03 13:42:37 +02:00
bestanden = [
("nicht ", "not "),
""
],
),
bestanden = FixedText(
2024-06-03 13:42:37 +02:00
stop = ("bestanden.", "passed."),
),
)
2024-06-03 11:02:01 +02:00
def pop_hidden_data():
global hidden_data
index = randint(0, len(hidden_data) - 1)
return hidden_data.pop(index)
def generate_text(number_of_lines = 200):
result = ""
2024-06-03 11:02:01 +02:00
for i in range(number_of_lines):
emissions, _ = network.choose()
line = ''.join(emissions)
result += line + "\n"
2024-06-03 11:02:01 +02:00
if random() < len(hidden_data) / (number_of_lines - i):
result += pop_hidden_data() + "\n"
return result
def read_template(filename = "./template.html"):
with open(filename, "r") as file:
return file.read()
def write_index(text, filename = "./deploy/index.html"):
with open(filename, "w") as file:
file.write(text)
def main():
template = read_template()
generated = generate_text()
2024-06-03 10:39:53 +02:00
generated = greeting + "\n" + generated
text = template.replace("<replace with text>", generated)
write_index(text)
if __name__ == "__main__":
main()