Σε προσέλαβαν για να αναπτύξεις το Noble Knots, τη νέα, πιο καυτή εφαρμογή γνωριμιών για ευγενείς! Έπειτα από αιώνες βασιλικών επιγαμιών, τα πράγματα έχουν γίνει… περίπλοκα. Για να αποφύγεις καταστάσεις του τύπου ωχ-είμαστε-δίδυμα, η δουλειά σου είναι να φτιάξεις ένα σύστημα που ελέγχει πόσο στενά συγγενεύουν δύο άτομα.
Το Noble Knots είναι εμπνευσμένο από το ισλανδικό "Islendinga-App", το οποίο στηρίζεται σε μια βάση δεδομένων που καταγράφει όλες τις γνωστές οικογενειακές σχέσεις μεταξύ Ισλανδών, από την εποχή του εποικισμού της Ισλανδίας. Ο αλγόριθμός σου θα προσδιορίζει τον βαθμό διαχωρισμού ανάμεσα σε δύο άτομα στο βασιλικό οικογενειακό δέντρο.
Θα βοηθήσει η εφαρμογή σου να στέψεις το ιδανικό ταίρι;
Η αποστολή σου είναι να προσδιορίσεις τον βαθμό διαχωρισμού ανάμεσα σε δύο άτομα σε ένα οικογενειακό δέντρο. Αυτό μοιάζει με τη δημοφιλή ιδέα ότι κάθε ηθοποιός του Χόλιγουντ βρίσκεται μέσα σε έξι βαθμούς από τον Kevin Bacon.
Δεδομένου του παρακάτω οικογενειακού δέντρου:
┌──────────┐ ┌──────────┐ ┌───────────┐
│ Helena │ │ Erdős ├─────┤ Shusaku │
└───┬───┬──┘ └─────┬────┘ └────┬──────┘
┌───┘ └───────┐ └───────┬───────┘
┌─────┴────┐ ┌────┴───┐ ┌─────┴────┐
│ Isla ├─────┤ Tariq │ │ Kevin │
└────┬─────┘ └────┬───┘ └──────────┘
│ │
┌────┴────┐ ┌────┴───┐
│ Uma │ │ Morphy │
└─────────┘ └────────┘
Ο βαθμός διαχωρισμού ανάμεσα στον Tariq και την Uma είναι 2 (Tariq → Isla → Uma). Δεν υπάρχει γνωστή σχέση ανάμεσα στην Isla και τον Kevin, καθώς δεν υπάρχει σύνδεση στα δεδομένα που δίνονται. Ο βαθμός διαχωρισμού ανάμεσα στην Uma και την Isla είναι 1.
Η Isla και ο Tariq είναι αδέρφια και έχουν βαθμό διαχωρισμού 1. Παρομοίως, αυτή η υλοποίηση θα ανέφερε βαθμό διαχωρισμού 2 από εσένα προς τον αδερφό του πατέρα σου.
Τα tests αυτής της άσκησης περιμένουν η λύση σου να υλοποιηθεί ως class με όνομα RelativeDistance στην Python.
Αν δεν είσαι εξοικειωμένος/-η με τη χρήση class στην Python, το classes και οι classes στην επίσημη τεκμηρίωση της Python είναι καλά σημεία για να ξεκινήσεις.
Το RelativeDistance θα πρέπει να αρχικοποιηθεί (δες το __init__() για περισσότερες πληροφορίες) χρησιμοποιώντας το family_tree, ένα λεξικό όπου τα keys είναι άτομα και τα values είναι list με τα παιδιά κάθε ατόμου.
Θα χρειαστεί επίσης να υλοποιήσεις μια μέθοδο degree_of_separation, η οποία θα επιστρέφει τον βαθμό διαχωρισμού μεταξύ των person_a και person_b που είναι άτομα στο οικογενειακό δέντρο που σου δίνεται.
Σου δίνεται μια υλοποίηση-σκελετός για την ειδική μέθοδο __init__ που χρησιμοποιείται για να δημιουργήσεις ένα στιγμιότυπο της κλάσης RelativeDistance, καθώς και ένας σκελετός της μεθόδου degree_of_separation.
Πρώτα, θα χρειαστεί να προσαρμόσεις την __init__ με ένα κατάλληλο χαρακτηριστικό στο self (το στιγμιότυπο) ώστε να αναπαριστά τα δεδομένα του family_tree.
Έπειτα μπορείς να προσθέσεις τη λογική σου στη μέθοδο degree_of_separation για να υπολογίσεις τον βαθμό διαχωρισμού μεταξύ των person_a και person_b.
Μερικές φορές είναι απαραίτητο να πετάξεις μια εξαίρεση. Όταν το κάνεις, θα πρέπει πάντα να συμπεριλαμβάνεις ένα ουσιαστικό μήνυμα σφάλματος που να δείχνει ποια είναι η πηγή του σφάλματος. Αυτό κάνει τον κώδικά σου πιο ευανάγνωστο και βοηθάει σημαντικά στο debugging. Σε περιπτώσεις όπου ξέρεις ότι η πηγή του σφάλματος θα είναι συγκεκριμένου τύπου, μπορείς να επιλέξεις να πετάξεις έναν από τους ενσωματωμένους τύπους σφαλμάτων, αλλά θα πρέπει και πάλι να συμπεριλάβεις ένα ουσιαστικό μήνυμα.
Αυτή η άσκηση απαιτεί να χρησιμοποιήσεις την εντολή raise για να "πετάξεις" πολλαπλά ValueError.
Στο πρώτο σενάριο, θα χρειαστεί να πετάξεις ένα ValueError όταν ένα ή και τα δύο άτομα που περνιούνται στη μέθοδο RelativeDistance.degree_of_separation δεν υπάρχουν στο οικογενειακό δέντρο.
# Example when Person A is not in the tree.
raise ValueError("Person A not in family tree.")
Αν και τα δύο άτομα υπάρχουν στο οικογενειακό δέντρο, θα χρειαστεί να πετάξεις ένα ValueError όταν δεν υπάρχει έγκυρη σύνδεση μεταξύ τους, όπως ορίζουν οι κανόνες.
# Example when there are no valid connections.
raise ValueError("No connection between person A and person B.")
Τα tests θα περάσουν μόνο αν και κάνεις raise τον αναμενόμενο τύπο exception και συμπεριλάβεις μαζί το αναμενόμενο μήνυμα.
Έλεγξε προσεκτικά τα tests και τα αναμενόμενα αποτελέσματά τους, καθώς αυτές οι οδηγίες δεν είναι εξαντλητικές.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.