Προγραμματιστικά Εργαλεία και Τεχνολογίες για Επιστήμη Δεδομένων

Σχετικά έγγραφα
Προγραμματιστικά Εργαλεία και Τεχνολογίες για Επιστήμη Δεδομένων

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Φύλλο Εργασίας 3. Μια γρήγορη επανάληψη από τα προηγούμενα

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ (ΟΜΑΔΑ Α ) ΚΑΙ ΜΑΘΗΜΑΤΩΝ ΕΙΔΙΚΟΤΗΤΑΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ (ΟΜΑΔΑ Α ΚΑΙ Β ) ΤΕΤΑΡΤΗ 20 ΙΟΥΝΙΟΥ 2018

ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ: ΕΞΙ (6)

Εισαγωγή στον Προγραμματισμό Python Μάθημα 4: Συναρτήσεις (functions) και δομοστοιχεία (modules) στην Python

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

Τυπικός ορισμός και επίλυση προβλημάτων με την χρήση του search.py (Ιεραπόστολοι & Κανίβαλοι) Γαρμπής Γιώργος

Αλγόριθμοι Ταξινόμησης Μέρος 1

Προγραμματισμός Υπολογιστών Τάξη Γ Αθανασιάδης Χρήστος ΠΕ19 ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

ΘΕΜΑ Α. 1. Η δυαδική αναζήτηση χρησιμοποιείται μόνο σε ταξινομημένες συλλογές δεδομένων.

Σημειωματάριο Τετάρτης 18 Οκτ. 2017

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Γλώσσες Προγραμματισμού Ι

Διάλεξη 1. Πράξεις Τελεστές Έλεγχος Ροής

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ (ΟΜΑΔΑ Α ) ΚΑΙ ΜΑΘΗΜΑΤΩΝ ΕΙΔΙΚΟΤΗΤΑΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ (ΟΜΑΔΑ Α ΚΑΙ Β ) ΤΡΙΤΗ 13 ΙΟΥΝΙΟΥ 2017

ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ Γ ΤΑΞΗΣ ΗΜΕΡΗΣΙΩΝ & Δ ΤΑΞΗΣ ΕΣΠΕΡΙΝΩΝ

ΘΕΜΑΤΑ ΤΕΛΙΚΗΣ ΦΑΣΗΣ

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

Τυχαίοι αριθμοί ρίξε μια «ζαριά»


Θέματα Προγραμματισμού Η/Υ

Γραφικά υπολογιστών Εργαστήριο 9 Κλάσεις στην Python. Σκοπός της 9ης άσκησης είναι να μάθουμε αντικειμενοστρεφή προγραμματισμό στην Python.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

auth Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

Βασικές Ασκήσεις από τα Εργαστήρια της PYTHON (εβδομάδα 5)

Σχεδίαση Αλγορίθμων -Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ ΤΡΙΤΗ 11 ΙΟΥΝΙΟΥ 2019 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Κλάσεις στην Python. Δημιουργία κλάσεων

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό

Πληρουορική Γ Γσμμασίοσ

Λίστες. Lista=[ red, green, blue ] Το πλήθος των στοιχείων μια λίστας δίνεται από τη συνάρτηση len(): Len(Lista)

ΣΥΝΟΛΟ ΣΕΛΙ ΩΝ: ΕΠΤΑ (7)

Προγραμματισμός Υπολογιστών Τάξη Γ Αθανασιάδης Χρήστος ΠΕ19 ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ ΠΡΟΤΕΙΝΟΜΕΝΑ ΘΕΜΑΤΑ 2 ΛΥΣΕΙΣ

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

ΠΡΟΤΕΙΝΟΜΕΝΑ ΘΕΜΑΤΑ- Ακαδημαϊκό Φροντιστήριο ΕΠΑΛ-Κάνιγγος 13 Αθήνα 2017

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΟΜΟΣΠΟΝΔΙΑ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑΔΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2018 Β ΦΑΣΗ

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ: ΕΞΙ (6)

Ανακτήθηκε από την ΕΚΠΑΙΔΕΥΤΙΚΗ ΚΛΙΜΑΚΑ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Εργαστήριο 7: Ο αλγόριθμος ταξινόμησης Radix Sort

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Θέματα Προγραμματισμού Η/Υ

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

Mπαρμπούτι. Ενδεικτικές Απαντήσεις Φύλλου Εργασίας. Τυχαιότητα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Εισαγωγή στον Προγραμματισμό Python Μάθημα 3: πίνακες και βρόγχος επανάληψης for (για) Νοέμβριος 2014 Χ. Αλεξανδράκη, Γ.

Μάντεψε τον Αριθμό Φύλλο Εργασίας 2

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Γλώσσες Προγραμματισμού Ι

Αποτελέσματα προόδου

ΠΛΗΡΟΦΟΡΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ

Προγραμματισμός Υπολογιστών & Εφαρμογές Python. Κ.Π. Γιαλούρης

Πρόγραμμα όρασης. Στη συνέχεια θα περιγράψουμε πώς δουλεύει το ρομπότ.

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/10, 23:59

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

Εισαγωγή στους Υπολογιστές

turnin Lab2.hs

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΠΑΝΕΛΛΑΔΙΚΩΝ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Δομές Δεδομένων & Αλγόριθμοι

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Κλάσεις στην Python. Δημιουργία κλάσεων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Το Παιχνίδι της Αφαίρεσης

Αναδρομικοί Αλγόριθμοι

Εισαγωγή στα Αντικείμενα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΠΑΝΕΛΛΑΔΙΚΩΝ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Κατανεμημένα Συστήματα. Javascript LCR example

Η αφετηρία είναι η συσκευή στην οποία η μπάλα βρίσκεται αρχικά. Έχει μόνο μία έξοδο. Ο σειριακός αριθμός της είναι.

Αρχεία Ένα αρχείο αποτελείται από μία σειρά ομοειδών δεδομένων που ονομάζονται λογικές εγγραφές (logical record)

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΚΥΠΡΙΑΚΟΣ ΣΥΝΔΕΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY 21 ος ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Δεύτερος Γύρος - 30 Μαρτίου 2011

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ (ΟΜΑΔΑ ΘΕΜΑΤΩΝ A)

Αλγόριθμοι Ταξινόμησης Μέρος 2

Θέματα Προγραμματισμού Η/Υ

Γενικά. PDF created with pdffactory trial version

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

scanf() scanf() stdin scanf() printf() int float double %lf float

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Μάντεψε τον Αριθμό. Έχω Ένα Μυστικό. Το Βρήκα;

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 13/1/13, 22:00

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PYTHON (ΟΜΑΔΑ Α)

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Συναρτήσεις. Εισαγωγή

Transcript:

Προγραμματιστικά Εργαλεία και Τεχνολογίες για Επιστήμη Δεδομένων Παράδοση 1/1/2019, Νίκος Παπασπύρου. Εργαστηριακή εξέταση, πρόβλημα bigpair Δίνονται δύο ακολουθίες a(1),..., a(n) και b(1),..., b(m), αποτελούμενες από φυσικούς αριθμούς. Κάθε μία από αυτές τις ακολουθίες είναι ταξινομημένη σε αύξουσα (όχι απαραίτητα γνησίως) σειρά. Ζητείται να υπολογισθεί το πλήθος των ζευγών (i, j), όπου 1 i N και 1 j M, τέτοιων ώστε a(i) > b(j). Δεδομένα εισόδου Η πρώτη γραμμή της εισόδου θα περιέχει δύο αριθμούς χωρισμένους μεταξύ τους με ένα κενό διάστημα: τις τιμές των N και M. Η δεύτερη γραμμή της εισόδου θα περιέχει N φυσικούς αριθμούς, που αντιστοιχούν στους όρους της πρώτης ακολουθίας, χωρισμένους ανά δύο με ένα κενό διάστημα. Ομοίως, η τρίτη γραμμή της εισόδου θα περιέχει τους M φυσικούς αριθμούς της δεύτερης ακολουθίας. Να θεωρήσετε ως δεδομένο ότι η είσοδος θα είναι έγκυρη και ότι οι αριθμοί δε θα υπερβαίνουν τα όρια που αναγράφονται παρακάτω. Δεδομένα εξόδου Η έξοδος πρέπει να αποτελείται από μία γραμμή που να περιέχει ακριβώς έναν μη-αρνητικό ακέραιο αριθμό: το πλήθος των ζευγών (i, j), όπου 1 i N και 1 j M, τέτοιων ώστε a(i) > b(j). Περιορισμοί 1 N, M 1.000.000 0 a(i), b(j) 1.000.000.000 Όριο χρόνου εκτέλεσης: 2 sec. Παράδειγμα εισόδου 1 5 5 1 4 5 9 4 5 6 9 10 Παράδειγμα εξόδου 1 Παράδειγμα εισόδου 2 10 1 3 3 4 9 9 9 1 42 5 6 6 8 9 13 1 Παράδειγμα εξόδου 2 1

Τι πρέπει να παραδώσετε: 1. (20%) Μία σωστή αλλά όχι απαραίτητα αποδοτική λύση του προβλήματος πολυπλοκότητα το πολύ O(NM). Ονομάστε το αντίστοιχο αρχείο slow.py. Φροντίστε να μπορεί να εκτελεστεί ως εξής: $./slow.py < input1 $./slow.py < input2 2. (50%) Μία σωστή και αποδοτική λύση του προβλήματος πολυπλοκότητα το πολύ O(N + M). Ονομάστε το αντίστοιχο αρχείο fast.py. Φροντίστε να μπορεί να εκτελεστεί ως εξής: $./fast.py < input1 $./fast.py < input2 3. (30%) Μία γεννήτρια τυχαίων εισόδων διαφορετικών μεγεθών για το πρόβλημα. Μπορείτε να τη δοκιμάσετε για να συγκρίνετε το αποτέλεσμα της πρώτης (μη αποδοτικής) λύσης σας με αυτό της δεύτερης (αποδοτικής), για αρκετές τυχαίες εισόδους, ούτως ώστε να βεβαιωθείτε ότι η αποδοτική σας λύση είναι σωστή. Ονομάστε το αντίστοιχο αρχείο gen.py. Φροντίστε να μπορεί να εκτελεστεί ως εξής: $./gen.py 100 > input100 $./slow.py < input100 421 $./fast.py < input100 421 Λύσεις του προβλήματος bigpair 1. Πρώτη λύση, μη αποδοτική: slow.py A = list(map(int, input().split())) B = list(map(int, input().split())) count = sum(1 for a in A for b in B if a > b) Η λύση αυτή είναι σωστή αλλά όχι ιδιαίτερα αποδοτική O(N 2 ) λόγω των δύο nested for μέσα στο sum. Σημειώστε ότι η χρήση του generator μέσα στη sum είναι αρκετά γρηγορότερη από το να είχαμε δύο for loops. Σημειώστε επίσης τη σειρά των for και του if μέσα στη sum. 2. Αποδοτική λύση: fast.py A = list(map(int, input().split())) B = list(map(int, input().split())) count = i = j = 0 while i < N and j < M: if A[i] <= B[j]: i += 1 else: j += 1 count += N-i 2

Η λύση αυτή κινεί δύο δείκτες, 0 i N και 0 j M, με τέτοιο τρόπο ώστε κάθε φορά που αυξάνεται το j να ισχύει a(i 1) b(j) < a(i) και επομένως όλα τα ζεύγη από το (a(i), b(j)) μέχρι και το (a(n 1), b(j))) να πρέπει να προσμετρηθούν. Αυτά τα ζεύγη είναι N i. Συμμετρική είναι η παρακάτω λύση: a = list(map(int, input().split())) b = list(map(int, input().split())) count = j = 0 for i in range(n): while j < M and a[i] > b[j]: j += 1 count += j η οποία κινεί τους ίδιους δύο δείκτες έτσι ώστε όταν αυξάνεται το i να ισχύει b(j 1) < a(i) b(j) και επομένως όλα τα ζεύγη από το (a(i), b(0)) μέχρι και το (a(i), b(j 1))) να πρέπει να προσμετρηθούν. Αυτά τα ζεύγη είναι j. 3. Γεννήτρια τυχαίων δεδομένων: gen.py import random import sys N = int(sys.argv[1]) M = int(sys.argv[2]) if len(sys.argv) > 2 else N V = int(sys.argv[3]) if len(sys.argv) > 3 else 1000000000 A = sorted(random.randrange(v+1) for i in range(n)) B = sorted(random.randrange(v+1) for i in range(m)) print(n, M) for a in A: print(a, end= " ") print() for b in B: print(b, end= " ") print() Η παραπάνω γεννήτρια μπορεί να κληθεί με μία, δύο ή τρεις παραμέτρους. Οι πρώτες δύο είναι οι τιμές των N και M. Αν η δεύτερη λείπει, τότε είναι M = N. Η τρίτη παράμετρος είναι η μέγιστη τιμή των στοιχείων των λιστών. Αν λείπει, τότε είναι V = 1.000.000.000. Προσέξτε επίσης τη χρήση της συνάρτησης sorted στη δημιουργία των λιστών A και Β, η οποία δέχεται ως παράμετρο ένα iterable και επιστρέφει μία ταξινομημένη λίστα με τα στοιχεία του iterable. Αντικείμενα 1. Απλές κλάσεις και αντικείμενα. class person: def init (self, name, phone): self.name = name self.phone = phone def call(self, message): print("calling", self.phone) print("driiiiinnnn") 3

print("hi", self.name) print(message) p = person("nikos", "123") p.call("it's already 6 o'clock, go home!") 2. Τα αντικείμενα περιέχουν πεδία και μεθόδους. Τα πεδία δε χρειάζεται να δηλώνονται, μπορούμε απλώς να αναθέτουμε τιμές σε αυτά. Όλες οι μέθοδοι, που ορίζονται με def μέσα στις κλάσεις, δέχονται ως πρώτη παράμετρο το αντικείμενο για το οποίο καλούνται. Κατά σύμβαση, την παράμετρο που αντιστοιχεί σε αυτό το αντικείμενο την ονομάζουμε self. 3. Η ειδική μέθοδος init είναι ο κατασκευαστής. Καλείται αυτόματα όταν κατασκευάζεται ένα νέο αντικείμενο, π.χ. στη γραμμή p = person("nikos", "123") παραπάνω. Ο εν λόγω κατασκευαστής αναθέτει τις δυο παραμέτρους του (πλην του self) στα αντίστοιχα πεδία του τρέχοντος αντικειμένου. Εξερεύνηση χώρου καταστάσεων Ο γρίφος του λύκου, της κατσίκας και του λάχανου (γνωστός επίσης και με διαφορετικούς συνδυασμούς ζώων και ζαρζαβατικών) διατυπώνεται ως εξής: A farmer wants to cross a river and take with him a wolf, a goat, and a cabbage. There is a boat that can fit himself plus either the wolf, the goat, or the cabbage. If the wolf and the goat are alone on one shore, the wolf will eat the goat. If the goat and the cabbage are alone on the shore, the goat will eat the cabbage. How can the farmer bring the wolf, the goat, and the cabbage across the river? 1. Θέλουμε να γράψουμε ένα πρόγραμμα που θα βρίσκει τη λύση του γρίφου, αντιμετωπίζοντας τον σαν ένα πρόβλημα εξερεύνησης ενός χώρου καταστάσεων. Οι καταστάσεις του προβλήματος περιγράφουν πού βρίσκονται οι τέσσερις πρωταγωνιστές του γρίφου. Στην αρχική κάτασταση, όλοι βρίσκονται στην αριστερή όχθη, και στην τελική (επιδιωκόμενη) κατάσταση, όλοι βρίσκονται στη δεξιά. 2. Θα ορίσουμε μία κλάση state για να υλοποιήσουμε τις καταστάσεις. class state: def init (self, left, right): self.left = frozenset(left) self.right = frozenset(right) init = state(['man', 'cabbage', 'goat', 'wolf'], []) Ο κατασκευαστής της δέχεται δύο παραμέτρους: αυτά που βρίσκονται στην αριστερή όχθη και αυτά που βρίσκονται στη δεξιά. Τα πεδία left και right των αντικειμένων της κλάσης state θα είναι immutable σύνολα (frozenset) στα οποία ο κατασκευαστής αναθέτει τις παραμέτρους του. 3. Στη συνέχεια θα ορίσουμε μία μέθοδο accessible. Αν s είναι μία δοθείσα κατάσταση, τότε s.accessible() θα είναι μία γεννήτρια που θα παράγει όλες τις καταστάσεις που είναι προσβάσιμες από την s. Η κατάσταση t είναι προσβάσιμη από την s αν η πρώτη μπορεί να προκύψει από τη δεύτερη με μία μόνο μετακίνηση του ανθρώπου (και πιθανώς ενός ακόμη ζώου ή αντικειμένου). def accessible(self): if 'man' in self.left: for x in self.left: moving = frozenset(['man', x]) yield state(self.left - moving, self.right moving) else: for x in self.right: moving = frozenset(['man', x]) yield state(self.left moving, self.right - moving) 4

Προσέξτε τις πράξεις συνόλων που αναλαμβάνουν τη μετακίνηση από τη μία όχθη στην άλλη των πρωταγωνιστών του γρίφου. 4. Προτού γράψουμε ένα απλό πρόγραμμα που θα επιδεικνύει τη λειτουργία της accessible, καλό είναι να υλοποιήσουμε μία μέθοδο που θα αναλάβει την εκτύπωση των καταστάσεων σε μια μορφή εύληπτη για τον άνθρωπο. Χωρίς αυτήν, αν π.χ. στο παραπάνω πρόγραμμα προσθέσουμε: print(init) θα δούμε κάτι σαν το παρακάτω: < main.state object at 0x11005be0> που μας δείχνει τον τύπο του αντικειμένου και τη διεύθυνσή του στη μνήμη. Προσθέτουμε λοιπόν την ειδική μέθοδο str, που αναλαμβάνει τη μετατροπή ενός αντικειμένου σε συμβολοσειρά. Η μέθοδος αυτή καλείται αυτόματα από την print. def str (self): return "left: {}, right: {}".format( " & ".join(self.left), " & ".join(self.right) ) Tώρα η εκτύπωση της αρχικής κατάστασης init θα έχει ως αποτέλεσμα: 5. Ας δούμε τώρα ποιες καταστάσεις s είναι προσβάσιμες από την αρχική και ποιες καταστάσεις t είναι προσβάσιμες από αυτές τις s, αντίστοιχα: for s in init.accessible(): print(s) for t in s.accessible(): print(" ", t) Το αποτέλεσμα του παραπάνω θα είναι το εξής: left: wolf & goat, right: cabbage & man left: wolf & man & goat, right: cabbage left: cabbage & goat, right: wolf & man left: cabbage & man & goat, right: wolf left: cabbage & goat & wolf, right: man left: cabbage & goat & man & wolf, right: left: cabbage & wolf, right: goat & man left: cabbage & goat & man & wolf, right: left: cabbage & man & wolf, right: goat 6. Η συνέχεια της λύσης του γρίφου θα γίνει στην επόμενη παράδοση. 5