Skip to content

Εργαστήριο 3 στην Python

Θέματα που εξετάζονται στο εργαστήριο: αρχεία κειμένου1, κανονικές εκφράσεις234 (regular expressions), αρχεία XML5, μορφοποίηση κώδικα (π.χ. με το black6), διάταξη imports με το isort, docstrings.

Εργαλεία πειραματισμού με κανονικές εκφράσεις

Εξάσκηση (εκφωνήσεις και λύσεις ασκήσεων)

Άσκηση E3A1 - Στο ακόλουθο tweet ο Lex Fridman αναφέρει ότι η αναμενόμενη τιμή του πλήθους τυχαίων επιλογών αριθμών στο διάστημα 0 έως 1 που απαιτούνται έτσι ώστε το άθροισμά τους να ξεπεράσει το 1 είναι ίση με e=2.718...

lex fridman tweet about e

Τροποποιήστε το ακόλουθο template κώδικα έτσι ώστε η λύση σας να επιτυγχάνει στο unit test (παρατηρήστε ότι ο κώδικας περιέχει 2 docstrings):

template3_1.py
import unittest


def e_approx(n):
    """
    Προσέγγιση της σταθεράς e=2.7182... προσομοιώνοντας τη διαδικασία υπολογισμού
    του αθροίσματος τυχαίων αριθμών στο διάστημα (0,1) μέχρι το άθροισμά τους
    να ξεπεράσει το 1.

    Ορίσματα:
        n (int): Το πλήθος των προσομοιώσεων που θα γίνουν.

    Επιτρέφει:
        float: Το μέσο πλήθος των επαναλήψεων που απαιτούνται για να γίνει το
        συσωρευτικό άθροισμα μεγαλύτερο από 1 σε όλες τις προσομοιώσεις.

    """
    pass


# Mην αλλάξετε κάτι από εδώ και κάτω
class Test(unittest.TestCase):
    """
    Περίπτωση ελέγχου επαλήθευσης της ακρίβειας υπολογισμού της συνάρτησης e_approx.

    Επαληθεύει ότι η επιστρεφόμενη τιμή από τη συνάρτηση e_approx function είναι
    κατά προσέγγιση ίση με τη σταθερά e με μια ανοχή delta.
    """
    def test_e_approximation(self):
        self.assertAlmostEqual(e_approx(1_000_000), 2.718, delta=0.001)


if __name__ == "__main__":
    unittest.main()
Λύση άσκησης 1

template3_1_sol.py
import unittest
import random


def e_approx(n):
    """
    Προσέγγιση της σταθεράς e=2.7182... προσομοιώνοντας τη διαδικασία υπολογισμού
    του αθροίσματος τυχαίων αριθμών στο διάστημα (0,1) μέχρι το άθροισμά τους
    να ξεπεράσει το 1.

    Ορίσματα:
        n (int): Το πλήθος των προσομοιώσεων που θα γίνουν.

    Επιτρέφει:
        float: Το μέσο πλήθος των επαναλήψεων που απαιτούνται για να γίνει το
        συσωρευτικό άθροισμα μεγαλύτερο από 1 σε όλες τις προσομοιώσεις.

    """
    total = 0
    for _ in range(n):
        s = 0
        c = 0
        while s < 1:
            s += random.random()
            c += 1
        total += c
    return total / n


# Mην αλλάξετε κάτι από εδώ και κάτω
class Test(unittest.TestCase):
    """
    Περίπτωση ελέγχου επαλήθευσης της ακρίβειας υπολογισμού της συνάρτησης e_approx.

    Επαληθεύει ότι η επιστρεφόμενη τιμή από τη συνάρτηση e_approx function είναι
    κατά προσέγγιση ίση με τη σταθερά e με μια ανοχή delta.
    """

    def test_e_approximation(self):
        self.assertAlmostEqual(e_approx(1_000_000), 2.718, delta=0.001)


if __name__ == "__main__":
    unittest.main()
Παράδειγμα εκτέλεσης:
$ python template3_1_sol.py
.
----------------------------------------------------------------------
Ran 1 test in 0.226s

OK

Άσκηση E3A2 - Κατεβάστε σε txt μορφή το βιβλίο “Μεταμόρφωση” του Φράνσις Κάφκα από το https://www.gutenberg.org/ebooks/5200 ή από το metamorphosis.txt. Γράψτε πρόγραμμα που να διαβάζει το κείμενο. Στη συνέχεια, απομονώστε το κείμενο της πρώτης παραγράφου (One morning έως looked), μετατρέψτε το κείμενο σε πεζά γράμματα, και συμπληρώστε τις συναρτήσεις που απαντούν στα ακόλουθα ερωτήματα:

  1. Ποιο είναι το πλήθος των λέξεων του κειμένου; Για το ερώτημα αυτό όπως και για τα επόμενα θεωρήστε ως λέξεις τις συμβολοσειρές που περιέχουν μόνο χαρακτήρες του αγγλικού αλφαβήτου. Επίσης, μας ενδιαφέρουν μόνο οι διαφορετικές μεταξύ τους λέξεις.
  2. Ποιο είναι το πλήθος των λέξεων του κειμένου που ξεκινούν με τον χαρακτήρα 'h' και τελειώνουν με τον χαρακτήρα 'e';
  3. Ποιο είναι το πλήθος των λέξεων του κειμένου με 5 χαρακτήρες;
  4. Ποιο είναι το πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες 'a', 's';
  5. Ποιο είναι το πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες 'a', 's' σε οποιαδήποτε σειρά;
  6. Ποιο είναι το πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τον ίδιο χαρακτήρα;
  7. Ποιο είναι το πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τους δύο ίδιους χαρακτήρες;

Τροποποιήστε το ακόλουθο template έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests:

template3_2.py
# Θεωρήστε ως λέξεις τις συμβολοσειρές που περιέχουν μόνο χαρακτήρες του αγγλικού αλφαβήτου.

import re
import unittest

text = ""  # να αλλαχθεί

# Πλήθος των λέξεων του κειμένου
def q1():
    ...


# Πλήθος των λέξεων που ξεκινούν με τον χαρακτήρα 'h' και τελειώνουν με τον χαρακτήρα 'e'
def q2():
    ...


# Πλήθος των λέξεων του κειμένου με 5 χαρακτήρες
def q3():
    ...


# Πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες 'a', 's'
def q4():
    ...


# πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες 'a', 's' σε οποιαδήποτε σειρά
def q5():
    ...


# πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τον ίδιο χαρακτήρα
def q6():
    ...


# πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τους 2 ίδιους χαρακτήρες
def q7():
    ...


# Mην αλλάξετε κάτι από εδώ και κάτω
class TestReExamples(unittest.TestCase):
    def test_q1(self):
        self.assertEqual(q1(), 70)

    def test_q2(self):
        self.assertEqual(q2(), 2)

    def test_q3(self):
        self.assertEqual(q3(), 12)

    def test_q4(self):
        self.assertEqual(q4(), 2)

    def test_q5(self):
        self.assertEqual(q5(), 3)

    def test_q6(self):
        self.assertEqual(q6(), 3)

    def test_q7(self):
        self.assertEqual(q7(), 1)


if __name__ == "__main__":
    unittest.main()
Λύση άσκησης 2

template3_2_sol.py
# Θεωρήστε ως λέξεις τις συμβολοσειρές που περιέχουν μόνο χαρακτήρες του αγγλικού αλφαβήτου.
import os
import re
import unittest

fn = os.path.join(os.path.dirname(__file__), "metamorphosis.txt")
with open(fn, encoding="utf-8") as f:
    a_list = f.readlines()

text = "".join(a_list[45:52])
text = text.lower()
print(text)


# Πλήθος των λέξεων του κειμένου
def q1():
    results = re.findall(r"\b[a-z]+\b", text)
    results = set(results)
    # print(results)
    return len(results)


def q1_alt1():  # 1ος εναλλακτικός τρόπος επίλυσης του ερωτήματος 1
    pattern = re.compile(r"\b[a-z]+\b")
    results = pattern.findall(text)
    results = set(results)
    # print(results)
    return len(results)


def q1_alt2():  # 2ος εναλλακτικός τρόπος επίλυσης του ερωτήματος 1
    pattern = re.compile(r"\b[a-z]+\b")
    results = set()
    for x in pattern.finditer(text):
        results.add(x.group(0))
    # print(results)
    return len(results)


# Πλήθος των λέξεων που ξεκινούν με τον χαρακτήρα 'h' και τελειώνουν με τον χαρακτήρα 'e'
def q2():
    results = re.findall(r"\bh[a-z]*e\b", text)
    results = set(results)
    # print(results)
    return len(results)


# Πλήθος των λέξεων του κειμένου με 5 χαρακτήρες
def q3():
    results = re.findall(r"\b[a-z]{5}\b", text)
    results = set(results)
    # print(results)
    return len(results)


# Πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες 'a', 's'
def q4():
    results = re.findall(r"\b[a-z]*as[a-z]*\b", text)
    results = set(results)
    # print(results)
    return len(results)


# πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες 'a', 's' σε οποιαδήποτε σειρά
def q5():
    results = re.findall(r"\b[a-z]*as|sa[a-z]*\b", text)
    results = set(results)
    # print(results)
    return len(results)


# πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τον ίδιο χαρακτήρα
def q6():
    results = re.findall(r"\b([a-z])([a-z]*\1)\b", text)
    results = [x[0] + x[1] for x in results]
    results = set(results)
    # print(results)
    return len(results)


# πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τους 2 ίδιους χαρακτήρες
def q7():
    results = re.findall(r"\b([a-z]{2})([a-z]*\1)\b", text)
    results = [x[0] + x[1] for x in results]
    results = set(results)
    # print(results)
    return len(results)


# Mην αλλάξετε κάτι από εδώ και κάτω
class TestReExamples(unittest.TestCase):
    def test_q1(self):
        self.assertEqual(q1(), 70)
        self.assertEqual(q1_alt1(), 70)
        self.assertEqual(q1_alt2(), 70)

    def test_q2(self):
        self.assertEqual(q2(), 2)

    def test_q3(self):
        self.assertEqual(q3(), 12)

    def test_q4(self):
        self.assertEqual(q4(), 2)

    def test_q5(self):
        self.assertEqual(q5(), 3)

    def test_q6(self):
        self.assertEqual(q6(), 3)

    def test_q7(self):
        self.assertEqual(q7(), 1)


if __name__ == "__main__":
    unittest.main()
Παράδειγμα εκτέλεσης:
$ python template3_2_sol.py
one morning, when gregor samsa woke from troubled dreams, he found
himself transformed in his bed into a horrible vermin. he lay on his
armour-like back, and if he lifted his head a little he could see his
brown belly, slightly domed and divided by arches into stiff sections.
the bedding was hardly able to cover it and seemed ready to slide off
any moment. his many legs, pitifully thin compared with the size of the
rest of him, waved about helplessly as he looked.

.......
----------------------------------------------------------------------
Ran 7 tests in 0.001s

OK

Άσκηση E3A3 - Κατεβάστε το MovieLens 100K Dataset ml-100k.zip. Εντοπίστε το αρχείο u.data που περιέχει 100.000 αξιολογήσεις από 943 χρήστες για 1.682 ταινίες και το αρχείο u.item που περιέχει τα στοιχεία των ταινιών. Εντοπίστε τις 10 ταινίες με τις καλύτερες αξιολογήσεις κατά μέσο όρο λαμβάνοντας υπόψη μόνο ταινίες που έχουν λάβει τουλάχιστον 50 αξιολογήσεις η κάθε μια. Εμφανίστε τους τίτλους αυτών των ταινιών. Παρατήρηση: Δείτε το αρχείο README στο ml-100k.zip για περιγραφή των περιεχομένων των αρχείων.

Λύση άσκησης 3 (α' τρόπος)

3_3_sol.py
import csv
import os

# Φόρτωση του αρχείου με τις αξιολογήσεις
movies = {}
fn = os.path.join(os.path.dirname(__file__), "ml-100k", "u.data")
with open(fn, encoding="latin-1") as f:
    csv_reader = csv.reader(f, delimiter="\t")
    for row in csv_reader:
        user, movie_id, rating, timestamp = row
        rating = int(rating)
        if movie_id not in movies:
            movies[movie_id] = [rating]
        else:
            movies[movie_id].append(rating)
print(f"Πλήθος ταινιών = {len(movies)}")


# Διαγραφή ταινιών με λιγότερες από 50 αξιολογήσεις
movies_to_be_deleted = []
for movie in movies:
    if len(movies[movie]) < 50:
        movies_to_be_deleted.append(movie)

for movie in movies_to_be_deleted:
    del movies[movie]
print(f"Πλήθος ταινιών με τουλάχιστον 50 αξιολογήσεις = {len(movies)}")

# Μέση βαθμολογία ταινιών, ταξινόμηση, εμφάνιση 10 πρώτων
movie_avg_rating = []
for movie in movies:
    movie_avg_rating.append((movie, sum(movies[movie]) / len(movies[movie])))

movie_avg_rating.sort(key=lambda x: x[1], reverse=True)

# Φόρτωση του αρχείου με τους τίτλους ταινιών
titles = {}
fn = os.path.join(os.path.dirname(__file__), "ml-100k", "u.item")
with open(fn, encoding="latin-1") as f:
    csv_reader = csv.reader(f, delimiter="|")
    for row in csv_reader:
        movie_id, title = row[0], row[1]
        titles[movie_id] = title

for i in range(10):
    movie_id = movie_avg_rating[i][0]
    print(f"{titles[movie_id]:60} {movie_avg_rating[i][1]:.4f}")
Παράδειγμα εκτέλεσης:
$ python 3_3_sol.py
Πλήθος ταινιών = 1682
Πλήθος ταινιών με τουλάχιστον 50 αξιολογήσεις = 603
Close Shave, A (1995)                                        4.4911
Schindler's List (1993)                                      4.4664
Wrong Trousers, The (1993)                                   4.4661
Casablanca (1942)                                            4.4568
Wallace & Gromit: The Best of Aardman Animation (1996)       4.4478
Shawshank Redemption, The (1994)                             4.4452
Rear Window (1954)                                           4.3876
Usual Suspects, The (1995)                                   4.3858
Star Wars (1977)                                             4.3585
12 Angry Men (1957)                                          4.3440

Λύση άσκησης 3 (β' τρόπος με χρήση της βιβλιοθήκης pandas)

Πρώτα θα πρέπει να εγκατασταθούν οι βιβλιοθήκες pandas και tabulate.

(myenv) > pip install pandas tabulate

3_3_sol_pandas.py
import os

import pandas as pd
from tabulate import tabulate

file_to_movies_len_ratings = os.path.join(
    os.path.dirname(__file__), "ml-100k", "u.data"
)
file_to_movies_len_names = os.path.join(os.path.dirname(__file__), "ml-100k", "u.item")

if __name__ == "__main__":
    # read data
    ratings = pd.read_csv(
        file_to_movies_len_ratings,
        sep="\t",
        names=["user id", "movie id", "rating", "timestamp"],
    ).drop(["timestamp"], axis=1)
    desc_movie_info = pd.read_csv(
        file_to_movies_len_names,
        sep="|",
        encoding="ISO-8859-1",
        usecols=[0, 1],
        names=["movie id", "movie name"],
    )

    # ομαδοποίηση ταινιών ανά movie_id
    ratings = ratings.groupby(["movie id"], sort=False).agg(
        {"user id": "count", "rating": "mean"}
    )

    # λήψη των 10 καλύτερων ταινιών με βάση τον μέσο όρο αξιολογήσεων για ταινίες που έχουν πάνω από 50 αξιολογήσεις
    top_10 = (
        ratings[ratings["user id"] > 50]
        .sort_values(["rating"], ascending=False)
        .head(10)
    )

    # εύρεση top_10 ταινιών
    n = desc_movie_info[desc_movie_info["movie id"].isin(top_10.index)]
    top_10["movie name"] = [
        n.iloc[i]["movie name"]
        for j in top_10.index
        for i in range(n.shape[0])
        if n.iloc[i]["movie id"] == j
    ]

    print(
        tabulate(
            top_10,
            headers=["#USERS", "RATING", "MOVIE NAME"],
            showindex=False,
            tablefmt="fancy_grid",
        )
    )
Παράδειγμα εκτέλεσης:
$ python 3_3_sol_pandas.py
╒══════════╤══════════╤════════════════════════════════════════════════════════╕
│   #USERS │   RATING │ MOVIE NAME                                             │
╞══════════╪══════════╪════════════════════════════════════════════════════════╡
│      112 │  4.49107 │ Close Shave, A (1995)                                  │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│      298 │  4.46644 │ Schindler's List (1993)                                │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│      118 │  4.4661  │ Wrong Trousers, The (1993)                             │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│      243 │  4.45679 │ Casablanca (1942)                                      │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│       67 │  4.44776 │ Wallace & Gromit: The Best of Aardman Animation (1996) │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│      283 │  4.44523 │ Shawshank Redemption, The (1994)                       │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│      209 │  4.38756 │ Rear Window (1954)                                     │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│      267 │  4.38577 │ Usual Suspects, The (1995)                             │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│      583 │  4.35849 │ Star Wars (1977)                                       │
├──────────┼──────────┼────────────────────────────────────────────────────────┤
│      125 │  4.344   │ 12 Angry Men (1957)                                    │
╘══════════╧══════════╧════════════════════════════════════════════════════════╛    

Άσκηση E3A4 - Κατεβάστε το ακόλουθο XML αρχείο που περιέχει το πρόγραμμα αγώνων ενός πρωταθλήματος.

ITC2021_Test8_SolGenMethodA.xml

Για κάθε αγώνα εμφανίστε την απόσταση περιόδων ανάμεσα στον αγώνα και στον επαναληπτικό του. Για παράδειγμα, για τις ομάδες 0 και 1 ο αγώνας 0-1 γίνεται στην περίοδο 33 και ο επαναληπτικός αγώνας 1-0 γίνεται στην περίοδο 14, άρα η απόσταση των δύο αγώνων είναι 33-14=19 αγωνιστικές.

Λύση άσκησης 4 (α' τρόπος)

Το αρχείο ITC2021_Test8_SolGenMethodA.xml θα πρέπει να βρίσκεται στον ίδιο κατάλογο με το 3_4_sol.py.

3_4_sol.py
import os
import xml.etree.ElementTree as ET

fn = os.path.join(os.path.dirname(__file__), "ITC2021_Test8_SolGenMethodA.xml")
xml_f = open(fn, "r", encoding="utf-8")
tree = ET.ElementTree(file=xml_f)
elem = tree.getroot()
teams = set()
matches = {}
if elem.tag == "Solution":
    for elem2 in elem:
        if elem2.tag == "Games":
            for elem3 in elem2:
                if elem3.tag == "ScheduledMatch":
                    home = int(elem3.attrib["home"])
                    away = int(elem3.attrib["away"])
                    slot = int(elem3.attrib["slot"])
                    matches[(home, away)] = slot  # matches[(0,1)] -> 33
                    teams.add(home)
xml_f.close()

# Υπολογισμός διαφοράς αγωνιστικών ανάμεσα σε κάθε αγώνα και στον επαναληπτικό του
nr_of_teams = len(teams)

for team1 in range(nr_of_teams):
    for team2 in range(team1 + 1, nr_of_teams):
        slot1 = matches[(team1, team2)]
        slot2 = matches[(team2, team1)]
        print(
            f"Η ομάδα {team1} παίζει εναντίον της ομάδας {team2} στις αγωνιστικές {slot1} & {slot2}, διαφορά {abs(slot1-slot2)}"
        )
Παράδειγμα εκτέλεσης:
$ python 3_4_sol.py
Η ομάδα 0 παίζει εναντίον της ομάδας 1 στις αγωνιστικές 33 & 14, διαφορά 19
Η ομάδα 0 παίζει εναντίον της ομάδας 2 στις αγωνιστικές 13 & 29, διαφορά 16
Η ομάδα 0 παίζει εναντίον της ομάδας 3 στις αγωνιστικές 10 & 35, διαφορά 25
Η ομάδα 0 παίζει εναντίον της ομάδας 4 στις αγωνιστικές 6 & 25, διαφορά 19
Η ομάδα 0 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 15 & 37, διαφορά 22
Η ομάδα 0 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 36 & 18, διαφορά 18
Η ομάδα 0 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 30 & 4, διαφορά 26
Η ομάδα 0 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 21 & 11, διαφορά 10
Η ομάδα 0 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 17 & 31, διαφορά 14
Η ομάδα 0 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 1 & 20, διαφορά 19
Η ομάδα 0 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 3 & 32, διαφορά 29
Η ομάδα 0 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 26 & 16, διαφορά 10
Η ομάδα 0 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 12 & 24, διαφορά 12
Η ομάδα 0 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 19 & 0, διαφορά 19
Η ομάδα 0 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 27 & 9, διαφορά 18
Η ομάδα 0 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 5 & 22, διαφορά 17
Η ομάδα 0 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 23 & 7, διαφορά 16
Η ομάδα 0 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 34 & 2, διαφορά 32
Η ομάδα 0 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 8 & 28, διαφορά 20
Η ομάδα 1 παίζει εναντίον της ομάδας 2 στις αγωνιστικές 30 & 15, διαφορά 15
Η ομάδα 1 παίζει εναντίον της ομάδας 3 στις αγωνιστικές 7 & 24, διαφορά 17
Η ομάδα 1 παίζει εναντίον της ομάδας 4 στις αγωνιστικές 5 & 37, διαφορά 32
Η ομάδα 1 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 18 & 31, διαφορά 13
Η ομάδα 1 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 19 & 4, διαφορά 15
Η ομάδα 1 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 32 & 6, διαφορά 26
Η ομάδα 1 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 25 & 13, διαφορά 12
Η ομάδα 1 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 3 & 20, διαφορά 17
Η ομάδα 1 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 9 & 22, διαφορά 13
Η ομάδα 1 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 12 & 35, διαφορά 23
Η ομάδα 1 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 23 & 2, διαφορά 21
Η ομάδα 1 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 27 & 11, διαφορά 16
Η ομάδα 1 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 28 & 17, διαφορά 11
Η ομάδα 1 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 1 & 29, διαφορά 28
Η ομάδα 1 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 34 & 10, διαφορά 24
Η ομάδα 1 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 21 & 8, διαφορά 13
Η ομάδα 1 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 36 & 0, διαφορά 36
Η ομάδα 1 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 16 & 26, διαφορά 10
Η ομάδα 2 παίζει εναντίον της ομάδας 3 στις αγωνιστικές 3 & 26, διαφορά 23
Η ομάδα 2 παίζει εναντίον της ομάδας 4 στις αγωνιστικές 31 & 0, διαφορά 31
Η ομάδα 2 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 27 & 16, διαφορά 11
Η ομάδα 2 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 37 & 7, διαφορά 30
Η ομάδα 2 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 35 & 18, διαφορά 17
Η ομάδα 2 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 9 & 20, διαφορά 11
Η ομάδα 2 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 8 & 22, διαφορά 14
Η ομάδα 2 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 14 & 32, διαφορά 18
Η ομάδα 2 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 1 & 23, διαφορά 22
Η ομάδα 2 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 19 & 5, διαφορά 14
Η ομάδα 2 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 17 & 36, διαφορά 19
Η ομάδα 2 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 21 & 11, διαφορά 10
Η ομάδα 2 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 25 & 10, διαφορά 15
Η ομάδα 2 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 24 & 4, διαφορά 20
Η ομάδα 2 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 34 & 2, διαφορά 32
Η ομάδα 2 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 6 & 28, διαφορά 22
Η ομάδα 2 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 12 & 33, διαφορά 21
Η ομάδα 3 παίζει εναντίον της ομάδας 4 στις αγωνιστικές 28 & 13, διαφορά 15
Η ομάδα 3 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 11 & 25, διαφορά 14
Η ομάδα 3 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 14 & 32, διαφορά 18
Η ομάδα 3 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 33 & 17, διαφορά 16
Η ομάδα 3 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 15 & 27, διαφορά 12
Η ομάδα 3 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 2 & 36, διαφορά 34
Η ομάδα 3 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 19 & 0, διαφορά 19
Η ομάδα 3 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 31 & 16, διαφορά 15
Η ομάδα 3 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 8 & 29, διαφορά 21
Η ομάδα 3 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 4 & 23, διαφορά 19
Η ομάδα 3 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 1 & 20, διαφορά 19
Η ομάδα 3 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 18 & 34, διαφορά 16
Η ομάδα 3 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 21 & 12, διαφορά 9
Η ομάδα 3 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 6 & 22, διαφορά 16
Η ομάδα 3 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 37 & 5, διαφορά 32
Η ομάδα 3 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 30 & 9, διαφορά 21
Η ομάδα 4 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 4 & 34, διαφορά 30
Η ομάδα 4 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 22 & 1, διαφορά 21
Η ομάδα 4 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 19 & 9, διαφορά 10
Η ομάδα 4 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 7 & 24, διαφορά 17
Η ομάδα 4 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 29 & 15, διαφορά 14
Η ομάδα 4 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 35 & 18, διαφορά 17
Η ομάδα 4 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 30 & 11, διαφορά 19
Η ομάδα 4 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 33 & 3, διαφορά 30
Η ομάδα 4 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 2 & 21, διαφορά 19
Η ομάδα 4 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 14 & 27, διαφορά 13
Η ομάδα 4 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 23 & 12, διαφορά 11
Η ομάδα 4 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 8 & 36, διαφορά 28
Η ομάδα 4 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 16 & 20, διαφορά 4
Η ομάδα 4 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 10 & 26, διαφορά 16
Η ομάδα 4 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 32 & 17, διαφορά 15
Η ομάδα 5 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 26 & 13, διαφορά 13
Η ομάδα 5 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 21 & 7, διαφορά 14
Η ομάδα 5 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 5 & 22, διαφορά 17
Η ομάδα 5 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 32 & 9, διαφορά 23
Η ομάδα 5 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 2 & 24, διαφορά 22
Η ομάδα 5 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 8 & 33, διαφορά 25
Η ομάδα 5 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 6 & 35, διαφορά 29
Η ομάδα 5 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 14 & 28, διαφορά 14
Η ομάδα 5 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 10 & 29, διαφορά 19
Η ομάδα 5 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 3 & 19, διαφορά 16
Η ομάδα 5 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 20 & 1, διαφορά 19
Η ομάδα 5 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 36 & 17, διαφορά 19
Η ομάδα 5 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 12 & 30, διαφορά 18
Η ομάδα 5 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 23 & 0, διαφορά 23
Η ομάδα 6 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 29 & 12, διαφορά 17
Η ομάδα 6 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 23 & 6, διαφορά 17
Η ομάδα 6 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 21 & 10, διαφορά 11
Η ομάδα 6 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 25 & 8, διαφορά 17
Η ομάδα 6 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 20 & 2, διαφορά 18
Η ομάδα 6 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 15 & 31, διαφορά 16
Η ομάδα 6 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 30 & 0, διαφορά 30
Η ομάδα 6 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 3 & 33, διαφορά 30
Η ομάδα 6 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 11 & 24, διαφορά 13
Η ομάδα 6 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 16 & 35, διαφορά 19
Η ομάδα 6 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 9 & 28, διαφορά 19
Η ομάδα 6 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 27 & 17, διαφορά 10
Η ομάδα 6 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 34 & 5, διαφορά 29
Η ομάδα 7 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 3 & 36, διαφορά 33
Η ομάδα 7 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 26 & 16, διαφορά 10
Η ομάδα 7 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 23 & 5, διαφορά 18
Η ομάδα 7 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 34 & 0, διαφορά 34
Η ομάδα 7 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 37 & 11, διαφορά 26
Η ομάδα 7 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 25 & 10, διαφορά 15
Η ομάδα 7 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 22 & 15, διαφορά 7
Η ομάδα 7 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 20 & 2, διαφορά 18
Η ομάδα 7 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 28 & 13, διαφορά 15
Η ομάδα 7 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 1 & 27, διαφορά 26
Η ομάδα 7 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 31 & 8, διαφορά 23
Η ομάδα 7 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 14 & 24, διαφορά 10
Η ομάδα 8 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 34 & 12, διαφορά 22
Η ομάδα 8 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 4 & 28, διαφορά 24
Η ομάδα 8 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 10 & 19, διαφορά 9
Η ομάδα 8 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 18 & 32, διαφορά 14
Η ομάδα 8 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 1 & 26, διαφορά 25
Η ομάδα 8 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 16 & 30, διαφορά 14
Η ομάδα 8 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 8 & 37, διαφορά 29
Η ομάδα 8 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 29 & 17, διαφορά 12
Η ομάδα 8 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 31 & 0, διαφορά 31
Η ομάδα 8 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 14 & 33, διαφορά 19
Η ομάδα 8 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 2 & 35, διαφορά 33
Η ομάδα 9 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 13 & 30, διαφορά 17
Η ομάδα 9 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 25 & 5, διαφορά 20
Η ομάδα 9 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 24 & 0, διαφορά 24
Η ομάδα 9 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 37 & 18, διαφορά 19
Η ομάδα 9 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 7 & 35, διαφορά 28
Η ομάδα 9 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 4 & 28, διαφορά 24
Η ομάδα 9 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 33 & 6, διαφορά 27
Η ομάδα 9 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 19 & 14, διαφορά 5
Η ομάδα 9 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 1 & 23, διαφορά 22
Η ομάδα 9 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 27 & 11, διαφορά 16
Η ομάδα 10 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 17 & 29, διαφορά 12
Η ομάδα 10 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 10 & 27, διαφορά 17
Η ομάδα 10 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 34 & 16, διαφορά 18
Η ομάδα 10 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 36 & 12, διαφορά 24
Η ομάδα 10 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 15 & 31, διαφορά 16
Η ομάδα 10 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 26 & 7, διαφορά 19
Η ομάδα 10 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 11 & 33, διαφορά 22
Η ομάδα 10 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 3 & 21, διαφορά 18
Η ομάδα 10 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 6 & 37, διαφορά 31
Η ομάδα 11 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 28 & 13, διαφορά 15
Η ομάδα 11 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 22 & 6, διαφορά 16
Η ομάδα 11 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 9 & 37, διαφορά 28
Η ομάδα 11 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 14 & 21, διαφορά 7
Η ομάδα 11 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 18 & 27, διαφορά 9
Η ομάδα 11 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 26 & 4, διαφορά 22
Η ομάδα 11 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 7 & 24, διαφορά 17
Η ομάδα 11 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 36 & 15, διαφορά 21
Η ομάδα 12 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 7 & 20, διαφορά 13
Η ομάδα 12 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 34 & 4, διαφορά 30
Η ομάδα 12 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 17 & 36, διαφορά 19
Η ομάδα 12 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 14 & 30, διαφορά 16
Η ομάδα 12 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 25 & 12, διαφορά 13
Η ομάδα 12 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 22 & 9, διαφορά 13
Η ομάδα 12 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 21 & 1, διαφορά 20
Η ομάδα 13 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 8 & 32, διαφορά 24
Η ομάδα 13 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 33 & 5, διαφορά 28
Η ομάδα 13 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 31 & 9, διαφορά 22
Η ομάδα 13 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 3 & 35, διαφορά 32
Η ομάδα 13 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 29 & 15, διαφορά 14
Η ομάδα 13 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 13 & 19, διαφορά 6
Η ομάδα 14 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 6 & 26, διαφορά 20
Η ομάδα 14 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 2 & 23, διαφορά 21
Η ομάδα 14 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 24 & 5, διαφορά 19
Η ομάδα 14 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 25 & 13, διαφορά 12
Η ομάδα 14 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 18 & 31, διαφορά 13
Η ομάδα 15 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 0 & 32, διαφορά 32
Η ομάδα 15 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 13 & 30, διαφορά 17
Η ομάδα 15 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 16 & 35, διαφορά 19
Η ομάδα 15 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 7 & 22, διαφορά 15
Η ομάδα 16 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 15 & 37, διαφορά 22
Η ομάδα 16 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 19 & 11, διαφορά 8
Η ομάδα 16 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 25 & 3, διαφορά 22
Η ομάδα 17 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 32 & 18, διαφορά 14
Η ομάδα 17 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 10 & 29, διαφορά 19
Η ομάδα 18 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 4 & 20, διαφορά 16

Λύση άσκησης 4 (β' τρόπος)

Το αρχείο ITC2021_Test8_SolGenMethodA.xml θα πρέπει να βρίσκεται στον ίδιο κατάλογο με το 3_4_sol_alt.py.

3_4_sol_alt.py
# Εναλλακτική, συντομότερη λύση για την άσκηση Ε3Α4
import os
import xml.etree.ElementTree as ET

fn = os.path.join(os.path.dirname(__file__), "ITC2021_Test8_SolGenMethodA.xml")
with open(fn) as xml_f:
    tree = ET.ElementTree(file=xml_f)

matches = {}
for elem in tree.getroot()[1]:
    matches[(int(elem.attrib["home"]), int(elem.attrib["away"]))] = int(
        elem.attrib["slot"]
    )

nr_of_teams = max([t[0] for t in matches.keys()]) + 1
for team1 in range(nr_of_teams):
    for team2 in range(team1 + 1, nr_of_teams):
        slot1 = matches[(team1, team2)]
        slot2 = matches[(team2, team1)]
        print(
            f"Η ομάδα {team1} παίζει εναντίον της ομάδας {team2} στις αγωνιστικές {slot1} & {slot2}, διαφορά {abs(slot1-slot2)}"
        )
Παράδειγμα εκτέλεσης:
$ python 3_4_sol_alt.py
Η ομάδα 0 παίζει εναντίον της ομάδας 1 στις αγωνιστικές 33 & 14, διαφορά 19
Η ομάδα 0 παίζει εναντίον της ομάδας 2 στις αγωνιστικές 13 & 29, διαφορά 16
Η ομάδα 0 παίζει εναντίον της ομάδας 3 στις αγωνιστικές 10 & 35, διαφορά 25
Η ομάδα 0 παίζει εναντίον της ομάδας 4 στις αγωνιστικές 6 & 25, διαφορά 19
Η ομάδα 0 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 15 & 37, διαφορά 22
Η ομάδα 0 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 36 & 18, διαφορά 18
Η ομάδα 0 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 30 & 4, διαφορά 26
Η ομάδα 0 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 21 & 11, διαφορά 10
Η ομάδα 0 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 17 & 31, διαφορά 14
Η ομάδα 0 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 1 & 20, διαφορά 19
Η ομάδα 0 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 3 & 32, διαφορά 29
Η ομάδα 0 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 26 & 16, διαφορά 10
Η ομάδα 0 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 12 & 24, διαφορά 12
Η ομάδα 0 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 19 & 0, διαφορά 19
Η ομάδα 0 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 27 & 9, διαφορά 18
Η ομάδα 0 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 5 & 22, διαφορά 17
Η ομάδα 0 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 23 & 7, διαφορά 16
Η ομάδα 0 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 34 & 2, διαφορά 32
Η ομάδα 0 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 8 & 28, διαφορά 20
Η ομάδα 1 παίζει εναντίον της ομάδας 2 στις αγωνιστικές 30 & 15, διαφορά 15
Η ομάδα 1 παίζει εναντίον της ομάδας 3 στις αγωνιστικές 7 & 24, διαφορά 17
Η ομάδα 1 παίζει εναντίον της ομάδας 4 στις αγωνιστικές 5 & 37, διαφορά 32
Η ομάδα 1 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 18 & 31, διαφορά 13
Η ομάδα 1 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 19 & 4, διαφορά 15
Η ομάδα 1 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 32 & 6, διαφορά 26
Η ομάδα 1 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 25 & 13, διαφορά 12
Η ομάδα 1 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 3 & 20, διαφορά 17
Η ομάδα 1 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 9 & 22, διαφορά 13
Η ομάδα 1 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 12 & 35, διαφορά 23
Η ομάδα 1 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 23 & 2, διαφορά 21
Η ομάδα 1 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 27 & 11, διαφορά 16
Η ομάδα 1 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 28 & 17, διαφορά 11
Η ομάδα 1 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 1 & 29, διαφορά 28
Η ομάδα 1 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 34 & 10, διαφορά 24
Η ομάδα 1 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 21 & 8, διαφορά 13
Η ομάδα 1 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 36 & 0, διαφορά 36
Η ομάδα 1 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 16 & 26, διαφορά 10
Η ομάδα 2 παίζει εναντίον της ομάδας 3 στις αγωνιστικές 3 & 26, διαφορά 23
Η ομάδα 2 παίζει εναντίον της ομάδας 4 στις αγωνιστικές 31 & 0, διαφορά 31
Η ομάδα 2 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 27 & 16, διαφορά 11
Η ομάδα 2 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 37 & 7, διαφορά 30
Η ομάδα 2 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 35 & 18, διαφορά 17
Η ομάδα 2 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 9 & 20, διαφορά 11
Η ομάδα 2 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 8 & 22, διαφορά 14
Η ομάδα 2 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 14 & 32, διαφορά 18
Η ομάδα 2 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 1 & 23, διαφορά 22
Η ομάδα 2 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 19 & 5, διαφορά 14
Η ομάδα 2 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 17 & 36, διαφορά 19
Η ομάδα 2 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 21 & 11, διαφορά 10
Η ομάδα 2 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 25 & 10, διαφορά 15
Η ομάδα 2 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 24 & 4, διαφορά 20
Η ομάδα 2 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 34 & 2, διαφορά 32
Η ομάδα 2 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 6 & 28, διαφορά 22
Η ομάδα 2 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 12 & 33, διαφορά 21
Η ομάδα 3 παίζει εναντίον της ομάδας 4 στις αγωνιστικές 28 & 13, διαφορά 15
Η ομάδα 3 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 11 & 25, διαφορά 14
Η ομάδα 3 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 14 & 32, διαφορά 18
Η ομάδα 3 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 33 & 17, διαφορά 16
Η ομάδα 3 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 15 & 27, διαφορά 12
Η ομάδα 3 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 2 & 36, διαφορά 34
Η ομάδα 3 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 19 & 0, διαφορά 19
Η ομάδα 3 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 31 & 16, διαφορά 15
Η ομάδα 3 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 8 & 29, διαφορά 21
Η ομάδα 3 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 4 & 23, διαφορά 19
Η ομάδα 3 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 1 & 20, διαφορά 19
Η ομάδα 3 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 18 & 34, διαφορά 16
Η ομάδα 3 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 21 & 12, διαφορά 9
Η ομάδα 3 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 6 & 22, διαφορά 16
Η ομάδα 3 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 37 & 5, διαφορά 32
Η ομάδα 3 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 30 & 9, διαφορά 21
Η ομάδα 4 παίζει εναντίον της ομάδας 5 στις αγωνιστικές 4 & 34, διαφορά 30
Η ομάδα 4 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 22 & 1, διαφορά 21
Η ομάδα 4 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 19 & 9, διαφορά 10
Η ομάδα 4 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 7 & 24, διαφορά 17
Η ομάδα 4 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 29 & 15, διαφορά 14
Η ομάδα 4 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 35 & 18, διαφορά 17
Η ομάδα 4 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 30 & 11, διαφορά 19
Η ομάδα 4 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 33 & 3, διαφορά 30
Η ομάδα 4 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 2 & 21, διαφορά 19
Η ομάδα 4 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 14 & 27, διαφορά 13
Η ομάδα 4 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 23 & 12, διαφορά 11
Η ομάδα 4 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 8 & 36, διαφορά 28
Η ομάδα 4 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 16 & 20, διαφορά 4
Η ομάδα 4 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 10 & 26, διαφορά 16
Η ομάδα 4 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 32 & 17, διαφορά 15
Η ομάδα 5 παίζει εναντίον της ομάδας 6 στις αγωνιστικές 26 & 13, διαφορά 13
Η ομάδα 5 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 21 & 7, διαφορά 14
Η ομάδα 5 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 5 & 22, διαφορά 17
Η ομάδα 5 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 32 & 9, διαφορά 23
Η ομάδα 5 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 2 & 24, διαφορά 22
Η ομάδα 5 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 8 & 33, διαφορά 25
Η ομάδα 5 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 6 & 35, διαφορά 29
Η ομάδα 5 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 14 & 28, διαφορά 14
Η ομάδα 5 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 10 & 29, διαφορά 19
Η ομάδα 5 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 3 & 19, διαφορά 16
Η ομάδα 5 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 20 & 1, διαφορά 19
Η ομάδα 5 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 36 & 17, διαφορά 19
Η ομάδα 5 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 12 & 30, διαφορά 18
Η ομάδα 5 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 23 & 0, διαφορά 23
Η ομάδα 6 παίζει εναντίον της ομάδας 7 στις αγωνιστικές 29 & 12, διαφορά 17
Η ομάδα 6 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 23 & 6, διαφορά 17
Η ομάδα 6 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 21 & 10, διαφορά 11
Η ομάδα 6 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 25 & 8, διαφορά 17
Η ομάδα 6 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 20 & 2, διαφορά 18
Η ομάδα 6 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 15 & 31, διαφορά 16
Η ομάδα 6 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 30 & 0, διαφορά 30
Η ομάδα 6 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 3 & 33, διαφορά 30
Η ομάδα 6 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 11 & 24, διαφορά 13
Η ομάδα 6 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 16 & 35, διαφορά 19
Η ομάδα 6 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 9 & 28, διαφορά 19
Η ομάδα 6 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 27 & 17, διαφορά 10
Η ομάδα 6 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 34 & 5, διαφορά 29
Η ομάδα 7 παίζει εναντίον της ομάδας 8 στις αγωνιστικές 3 & 36, διαφορά 33
Η ομάδα 7 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 26 & 16, διαφορά 10
Η ομάδα 7 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 23 & 5, διαφορά 18
Η ομάδα 7 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 34 & 0, διαφορά 34
Η ομάδα 7 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 37 & 11, διαφορά 26
Η ομάδα 7 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 25 & 10, διαφορά 15
Η ομάδα 7 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 22 & 15, διαφορά 7
Η ομάδα 7 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 20 & 2, διαφορά 18
Η ομάδα 7 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 28 & 13, διαφορά 15
Η ομάδα 7 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 1 & 27, διαφορά 26
Η ομάδα 7 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 31 & 8, διαφορά 23
Η ομάδα 7 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 14 & 24, διαφορά 10
Η ομάδα 8 παίζει εναντίον της ομάδας 9 στις αγωνιστικές 34 & 12, διαφορά 22
Η ομάδα 8 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 4 & 28, διαφορά 24
Η ομάδα 8 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 10 & 19, διαφορά 9
Η ομάδα 8 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 18 & 32, διαφορά 14
Η ομάδα 8 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 1 & 26, διαφορά 25
Η ομάδα 8 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 16 & 30, διαφορά 14
Η ομάδα 8 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 8 & 37, διαφορά 29
Η ομάδα 8 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 29 & 17, διαφορά 12
Η ομάδα 8 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 31 & 0, διαφορά 31
Η ομάδα 8 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 14 & 33, διαφορά 19
Η ομάδα 8 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 2 & 35, διαφορά 33
Η ομάδα 9 παίζει εναντίον της ομάδας 10 στις αγωνιστικές 13 & 30, διαφορά 17
Η ομάδα 9 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 25 & 5, διαφορά 20
Η ομάδα 9 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 24 & 0, διαφορά 24
Η ομάδα 9 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 37 & 18, διαφορά 19
Η ομάδα 9 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 7 & 35, διαφορά 28
Η ομάδα 9 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 4 & 28, διαφορά 24
Η ομάδα 9 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 33 & 6, διαφορά 27
Η ομάδα 9 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 19 & 14, διαφορά 5
Η ομάδα 9 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 1 & 23, διαφορά 22
Η ομάδα 9 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 27 & 11, διαφορά 16
Η ομάδα 10 παίζει εναντίον της ομάδας 11 στις αγωνιστικές 17 & 29, διαφορά 12
Η ομάδα 10 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 10 & 27, διαφορά 17
Η ομάδα 10 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 34 & 16, διαφορά 18
Η ομάδα 10 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 36 & 12, διαφορά 24
Η ομάδα 10 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 15 & 31, διαφορά 16
Η ομάδα 10 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 26 & 7, διαφορά 19
Η ομάδα 10 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 11 & 33, διαφορά 22
Η ομάδα 10 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 3 & 21, διαφορά 18
Η ομάδα 10 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 6 & 37, διαφορά 31
Η ομάδα 11 παίζει εναντίον της ομάδας 12 στις αγωνιστικές 28 & 13, διαφορά 15
Η ομάδα 11 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 22 & 6, διαφορά 16
Η ομάδα 11 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 9 & 37, διαφορά 28
Η ομάδα 11 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 14 & 21, διαφορά 7
Η ομάδα 11 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 18 & 27, διαφορά 9
Η ομάδα 11 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 26 & 4, διαφορά 22
Η ομάδα 11 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 7 & 24, διαφορά 17
Η ομάδα 11 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 36 & 15, διαφορά 21
Η ομάδα 12 παίζει εναντίον της ομάδας 13 στις αγωνιστικές 7 & 20, διαφορά 13
Η ομάδα 12 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 34 & 4, διαφορά 30
Η ομάδα 12 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 17 & 36, διαφορά 19
Η ομάδα 12 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 14 & 30, διαφορά 16
Η ομάδα 12 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 25 & 12, διαφορά 13
Η ομάδα 12 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 22 & 9, διαφορά 13
Η ομάδα 12 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 21 & 1, διαφορά 20
Η ομάδα 13 παίζει εναντίον της ομάδας 14 στις αγωνιστικές 8 & 32, διαφορά 24
Η ομάδα 13 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 33 & 5, διαφορά 28
Η ομάδα 13 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 31 & 9, διαφορά 22
Η ομάδα 13 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 3 & 35, διαφορά 32
Η ομάδα 13 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 29 & 15, διαφορά 14
Η ομάδα 13 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 13 & 19, διαφορά 6
Η ομάδα 14 παίζει εναντίον της ομάδας 15 στις αγωνιστικές 6 & 26, διαφορά 20
Η ομάδα 14 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 2 & 23, διαφορά 21
Η ομάδα 14 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 24 & 5, διαφορά 19
Η ομάδα 14 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 25 & 13, διαφορά 12
Η ομάδα 14 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 18 & 31, διαφορά 13
Η ομάδα 15 παίζει εναντίον της ομάδας 16 στις αγωνιστικές 0 & 32, διαφορά 32
Η ομάδα 15 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 13 & 30, διαφορά 17
Η ομάδα 15 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 16 & 35, διαφορά 19
Η ομάδα 15 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 7 & 22, διαφορά 15
Η ομάδα 16 παίζει εναντίον της ομάδας 17 στις αγωνιστικές 15 & 37, διαφορά 22
Η ομάδα 16 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 19 & 11, διαφορά 8
Η ομάδα 16 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 25 & 3, διαφορά 22
Η ομάδα 17 παίζει εναντίον της ομάδας 18 στις αγωνιστικές 32 & 18, διαφορά 14
Η ομάδα 17 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 10 & 29, διαφορά 19
Η ομάδα 18 παίζει εναντίον της ομάδας 19 στις αγωνιστικές 4 & 20, διαφορά 16

Επιπλέον εξάσκηση

Άσκηση E3A57 - Δίνεται ένα αρχείο με συνθηματικά (passwords) και κωδικοποιημένους κανόνες που πρέπει να ισχύουν για καθένα από αυτά. Το αρχείο περιέχει δεδομένα της ακόλουθης μορφής:

1-3 a: abcde
1-3 b: cdefg
2-9 c: ccccccccc

Α) Κάθε γραμμή περιέχει 2 αριθμούς (x και y), έναν χαρακτήρα c και το ίδιο το συνθηματικό. Ο κανόνας για το συνθηματικό είναι ότι θα πρέπει να υπάρχει τουλάχιστον x και το πολύ y φορές ο χαρακτήρας c στο συνθηματικό. Έτσι για τα παραπάνω ισχύει ότι:

1-3 a: abcde είναι έγκυρο: το συνθηματικό περιέχει τον χαρακτήρα a 1 φορά.
1-3 b: cdefg είναι μη έγκυρο: το συνθηματικό δεν περιέχει τον χαρακτήρα b.
2-9 c: ccccccccc είναι έγκυρο: το συνθηματικό περιέχει τον χαρακτήρα c 9 φορές.

Γράψτε ένα πρόγραμμα που να χρησιμοποιεί κανονικές εκφράσεις και με unit test να ελέγχει ότι το πλήθος των έγκυρων συνθηματικών στο αρχείο aoc2020_d2_input.txt είναι 660.

Β) Έστω ότι ο κανόνας που είναι κωδικοποιημένος σε κάθε γραμμή σημαίνει ότι θα πρέπει ο χαρακτήρας c να βρίσκεται είτε στη θέση x είτε στη θέση y του συνθηματικού (θεωρείστε ότι ο πρώτος χαρακτήρας του συνθηματικού βρίσκεται στη θέση 1)

Για τα παραπάνω συνθηματικά τώρα θα ισχύει:

1-3 a: abcde είναι έγκυρο: το συνθηματικό περιέχει τον χαρακτήρα a στη θέση 1 και όχι στη θέση 3.
1-3 b: cdefg είναι μη έγκυρο: το συνθηματικό δεν περιέχει τον χαρακτήρα b ούτε στη θέση 1 ούτε στη θέση 3.
2-9 c: ccccccccc είναι μη έγκυρο: το συνθηματικό περιέχει τον χαρακτήρα c και στη θέση 2 και στη θέση 9.

Συμπληρώστε το πρόγραμμα έτσι ώστε πάλι με χρήση κανονικών εκφράσεων και με unit test να ελέγχει ότι το πλήθος των έγκυρων συνθηματικών στο αρχείο aoc2020_d2_input.txt τώρα είναι 530.

Λύση άσκησης 5

3_5_sol.py
import os
import re
import unittest


def part1():
    with open(
        os.path.join(os.path.dirname(__file__), "aoc2020_d2_input.txt"), "r"
    ) as f:
        regex = re.compile(
            "(?P<low>\d+)-(?P<hi>\d+)(\s)(?P<key_char>\w)(:\s)(?P<pwd>\w+)"
        )
        c = 0
        for line in f.readlines():
            match = regex.match(line)
            pwd = match.group("pwd")
            x = pwd.count(match.group("key_char"))
            if int(match.group("low")) <= x <= int(match.group("hi")):
                c += 1
        return c


def part2():
    with open(
        os.path.join(os.path.dirname(__file__), "aoc2020_d2_input.txt"), "r"
    ) as f:
        regex = re.compile(
            "(?P<pos1>\d+)-(?P<pos2>\d+)(\s)(?P<key_char>\w)(:\s)(?P<pwd>\w+)"
        )
        c = 0
        for line in f.readlines():
            match = regex.match(line)
            pwd = match.group("pwd")
            key_char = match.group("key_char")
            pos1 = int(match.group("pos1")) - 1
            pos2 = int(match.group("pos2")) - 1
            if pwd[pos1] == pwd[pos2]:
                continue
            if pwd[pos1] == key_char or pwd[pos2] == key_char:
                c += 1
        return c


class TestAOC2020Day2(unittest.TestCase):
    def test_part1(self):
        self.assertEqual(part1(), 660)

    def test_part2(self):
        self.assertEqual(part2(), 530)


unittest.main()
Παράδειγμα εκτέλεσης:
$ python 3_5_sol.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.003s

OK

Άσκηση E3A6 - Για τα περιεχόμενα του αρχείου simpsons_phone_book.txt, χρησιμοποιώντας κανονικές εκφράσεις:

  1. Εντοπίστε όλους τους αριθμούς τηλεφώνου για καταχωρήσεις που περιέχουν τουλάχιστον μια λέξη που ξεκινά με J.
  2. Εντοπίστε όλους τους αριθμούς τηλεφώνου για καταχωρήσεις που περιέχουν τουλάχιστον μια λέξη που τελειώνει σε eu.
  3. Εντοπίστε όλους τους αριθμούς τηλεφώνων που περιέχουν γράμματα.
  4. Εντοπίστε όλους τους αριθμούς τηλεφώνου χωρίς τον κωδικό της περιοχής (π.χ. 555) και εμφανίστε τους ταξινομημένους.

Λύση άσκησης 6

3_6_sol.py
import re

phones = """
Allison Neu 555-8396
Bob Newhall 555-4344
C. Montgomery Burns 555-0001
C. Montgomery Burns 555-0113
Canine College 555-7201
Canine Therapy Institute 555-2849
Cathy Neu 555-2362
City of New York Parking Violation Bureau 555-BOOT
Dr. Julius Hibbert 555-3642
Dr. Nick Riviera 555-NICK
Earn Cash For Your Teeth 555-6312
Family Therapy Center 555-HUGS
Homer Jay Simpson (Plow King episode) 555-3223
Homer Jay Simpson (work) 555-7334
Jack Neu 555-7666
Jeb Neu 555-5543
Jennifer Neu 555-3652
Ken Neu 555-8752
Lionel Putz 555-5299
MAD Magazine 555-8628
Marital Street Hotline 555-1680
Marvin Monroe 555-3700
Marvin Monroe's radio therapy show 555-PAIN
Moe Szyslak (phone number spells SMITHERS) 7648-4377
Moe Szyslak 555-0000
Moe's Tavern 555-1239
Mr. Plow 555-3226
NY Metro 555-5680
Ned Flanders 555-8904
New York Parking Violation Bureau 555-2668
ORB     Dr Nick's "B"argain Medical Services 1-800-DOCT
Original Famous Ray's Pizza 555-PIZA
Otto's "How's my Driving" 555-8821
Plow King 555-4796
Pretzel Wagon 555-3226
Prof John Frink's Lab 555-5782
Radio Psychaiatrist 555-7246
Reverend Timothy Lovejoy 555-6542
Richard Nash 555-9996
Richard Newhall 555-9973
Ruff-form Dog School 555-0078
Santitarium for Dogs 555-9716
Sleep-Eazy Motel 555-1000
Sugar Truck 555-3872
Susan Newhall 555-2362
The Nuclear Powerplant 555-5246
The Simpsons' residence 555-8707
The Simpsons, 742 Evergreen Terrace 555-0113
Toby Muntz 555-9972
"""

print("Ερώτημα 1")
results = re.findall(
    r"(\bJ.*)(\d{3}-\d{4}|[a-z]{4})", phones, flags=re.IGNORECASE | re.MULTILINE
)
for result in results:
    print(f"{result[0]} -> {result[1]}")

print("Ερώτημα 2")
results = re.findall(
    r"(\b.*eu).*(\d{3}-\d{4}|[a-z]{4})", phones, flags=re.IGNORECASE | re.MULTILINE
)
for result in results:
    print(f"{result[0]} -> {result[1]}")

print("Ερώτημα 3")
results = re.findall(
    r"(.*)(\d{3}-[a-z]{4})", phones, flags=re.IGNORECASE | re.MULTILINE
)
for result in results:
    print(f"{result[0]} -> {result[1]}")

print("Ερώτημα 4")
results = re.findall(
    r"(.*)(\d{3}-(\d{4}|[a-z]{4}))$", phones, flags=re.IGNORECASE | re.MULTILINE
)

for result in sorted(results, key=lambda row: row[2]):
    print(f"{result[1]} -> {result[0]}")
Παράδειγμα εκτέλεσης:
$ python 3_6_sol.py
Ερώτημα 1
Julius Hibbert  -> 555-3642
Jay Simpson (Plow King episode)  -> 555-3223
Jay Simpson (work)  -> 555-7334
Jack Neu  -> 555-7666
Jeb Neu  -> 555-5543
Jennifer Neu  -> 555-3652
John Frink's Lab  -> 555-5782
Ερώτημα 2
Allison Neu -> 555-8396
Cathy Neu -> 555-2362
Jack Neu -> 555-7666
Jeb Neu -> 555-5543
Jennifer Neu -> 555-3652
Ken Neu -> 555-8752
Ερώτημα 3
City of New York Parking Violation Bureau  -> 555-BOOT
Dr. Nick Riviera  -> 555-NICK
Family Therapy Center  -> 555-HUGS
Marvin Monroe's radio therapy show  -> 555-PAIN
ORB     Dr Nick's "B"argain Medical Services 1- -> 800-DOCT
Original Famous Ray's Pizza  -> 555-PIZA
Ερώτημα 4
555-0000 -> Moe Szyslak 
555-0001 -> C. Montgomery Burns 
555-0078 -> Ruff-form Dog School 
555-0113 -> C. Montgomery Burns 
555-0113 -> The Simpsons, 742 Evergreen Terrace 
555-1000 -> Sleep-Eazy Motel 
555-1239 -> Moe's Tavern 
555-1680 -> Marital Street Hotline 
555-2362 -> Cathy Neu 
555-2362 -> Susan Newhall 
555-2668 -> New York Parking Violation Bureau 
555-2849 -> Canine Therapy Institute 
555-3223 -> Homer Jay Simpson (Plow King episode) 
555-3226 -> Mr. Plow 
555-3226 -> Pretzel Wagon 
555-3642 -> Dr. Julius Hibbert 
555-3652 -> Jennifer Neu 
555-3700 -> Marvin Monroe 
555-3872 -> Sugar Truck 
555-4344 -> Bob Newhall 
648-4377 -> Moe Szyslak (phone number spells SMITHERS) 7
555-4796 -> Plow King 
555-5246 -> The Nuclear Powerplant 
555-5299 -> Lionel Putz 
555-5543 -> Jeb Neu 
555-5680 -> NY Metro 
555-5782 -> Prof John Frink's Lab 
555-6312 -> Earn Cash For Your Teeth 
555-6542 -> Reverend Timothy Lovejoy 
555-7201 -> Canine College 
555-7246 -> Radio Psychaiatrist 
555-7334 -> Homer Jay Simpson (work) 
555-7666 -> Jack Neu 
555-8396 -> Allison Neu 
555-8628 -> MAD Magazine 
555-8707 -> The Simpsons' residence 
555-8752 -> Ken Neu 
555-8821 -> Otto's "How's my Driving" 
555-8904 -> Ned Flanders 
555-9716 -> Santitarium for Dogs 
555-9972 -> Toby Muntz 
555-9973 -> Richard Newhall 
555-9996 -> Richard Nash 
555-BOOT -> City of New York Parking Violation Bureau 
800-DOCT -> ORB         Dr Nick's "B"argain Medical Services 1-
555-HUGS -> Family Therapy Center 
555-NICK -> Dr. Nick Riviera 
555-PAIN -> Marvin Monroe's radio therapy show 
555-PIZA -> Original Famous Ray's Pizza