Στην άσκηση αυτή θα συμπληρώσετε τον κώδικα Python που βρίσκεται στο αρχείo hw3.py ακολουθώντας παρόμοιες οδηγίες (δείτε και εδώ) με τις προηγούμενες σειρές ασκήσεων. (Αυτόματοι έλεγχοι ορθότητας βρίσκονται στο hw3_tests.txt.)
Τρόπος παράδοσης:
Θα παραδώσετε το αρχείο hw3.py.
- Οι φοιτητές που έχουν εγγραφεί στο eclass θα παραδόσουν την εργασία από εκεί.
- Οι φοιτητές που δεν έχουν εγγραφεί στο eclass θα την παραδώσουν με email στο dimakis@aueb.gr με θέμα (subject): [2025 - ΑΣΚΗΣΗ 3] (με τις αγκύλες) που επίσης περιέχει το ονοματεπώνυμο τους στο σώμα του μηνύματος και σε σχόλιο μέσα στο hw3.py.
Άσκηση 1
Θα πρέπει να υλοποιήσετε ένα σύνθετο τύπο δεδομένου (όπως ο ritos στη Διάλεξη 6) που αναπαριστά μια "γεωγραφική τοποθεσία", συμπληρώνοντας τον κώδικα στα κενά _________ του κατασκευαστή (constructor) location και των συναρτήσεων επιλογής (selectors) name, longitude, lattitude, type.
Η κλήση στον κατασκευαστή location(name, lat, lon, type) πρέπει να επιστρέφει το σύνθετο δεδομένο τοποθεσίας με τοπωνύμιο name, το οποίο βρίσκεται στο γεωγραφικό πλάτος και μήκος lat και lon αντίστοιχα και το είδος της τοποθεσίας δίνεται στη συμβολοσειρά (str) type, πχ., 'monument' (μνημείο), 'park' (πάρκο).
Συμπληρώστε τα κενά των συναρτήσεων επιλογής του δεδομένου location, δηλαδή στις συναρτήσεις name, longitude, latitude και type, έτσι ώστε για μια τοποθεσία loc (δηλ., δεδομένο location):
- H κλήση name(loc) να επιστρέφει το όνομα της τοποθεσίας loc.
- Η longitude(loc) να επιστρέφει το γεωγραφικό μήκος που βρίσκεται η loc.
- Η lattitude(loc) να επιστρέφει το γεωγραφικό πλάτος που βρίσκεται η loc.
- Η type(loc) να επιστρέφει το είδος της τοποθεσίας, δηλ. την τιμή του ορίσματος type της συνάρτησης location που χρησιμοποιήθηκε κατά την κατασκευή του loc.
def location(name, lat, lon, type): """Kataskeuazei syn8eto dedomeno topo8esias (location).
name -- onoma (str) lat -- gewfrafiko platos (se moires) lon -- gewgrafiko mikos (se moires) type -- eidos topo8esias (str)
Epistrefei dedomeno pou anaparista tin topo8esia me onoma name h opoia brisketai sto gewgrafiko platos kai mikos lat kai lon antistoixa. To type einai string pou perigrafei to eidos tis topo8esias, p.x., 'monument', 'bus station'. """ return ______________________________
def name(loc): """Epistrefei to onoma mias topo8esias.
loc -- topo8esia (typou location)
Epistrefei to onoma (str) tis topo8esias loc.
>>> monast = location('Monastiraki', 37.976362, 23.725947, 'square') >>> name(monast) 'Monastiraki' """ return _________________
def longitude(loc): """Gewgrafiko mikos.
loc -- dedomeno location
Epistrefei gewgrafiko mikos tis topo8esias loc
>>> monast = location('Monastiraki', 37.976362, 23.725947, 'square') >>> longitude(monast) 23.725947 """ return _________________
def lattitude(loc): """Gewgrafiko platos.
loc -- dedomeno location
Epistrefei gewgrafiko mikos tis topo8esias loc
>>> monast = location('Monastiraki', 37.976362, 23.725947, 'square') >>> lattitude(monast) 37.976362 """ return _________________
def type(loc): """Eidos topo8esias.
loc -- dedomeno location
Epistrefei string pou perigrafei to eidos tis topo8esias loc, p.x., 'monument', 'bus station'.
>>> monast = location('Monastiraki', 37.976362, 23.725947, 'square') >>> type(monast) 'square' """ return _________________
|
Άσκηση 2
Συμπληρώστε τον κώδικα ή τα κενά _________ στις συναρτήσεις distance, print_location και nearest_location, έτσι ώστε να δίνουν τα επιθυμητά αποτελέσματα, χωρίς όμως να κάνετε χρήση της αναπαράστασης των δεδομένων location που βρίσκεται εσωτερικά στον κώδικα κατασκευαστή και συναρτήσεων επιλογής στην Άσκηση 1. Ο κώδικας των συναρτήσεων θα πρέπει να χρησιμοποιεί τα σύνθετα δεδομένα location μόνο μέσω κλήσεων στον κατασκευαστή και στις συναρτήσεις επιλογής της Άσκησης 1 . (Σημειώστε ότι οι συναρτήσεις αυτές θα πρέπει να εξακολουθούν να λειτουργούν σωστά -και χωρίς να χρειαστεί να αλλάξουν- ακόμη και αν οι συναρτήσεις location, name, longitude, lattitude στην Άσκηση 1 είχαν υλοποιηθεί με διαφορετικό τρόπο.)
Η κλήση distance(a, b) επιστρέφει την απόσταση (σε χιλιόμετρα) μεταξύ των τοποθεσιών που αναπαριστάνουν τα δεδομένα a, b τύπου location. Η print_location(loc) εμφανίζει στοιχεία για την τοποθεσία loc. Η nearest_location(loc, loc_list, loc_type) επιστρέφει το δεδομένο location που βρίσκεται στη λίστα με τοποθεσίες loc_list το οποίο απέχει τη μικρότερη απόσταση από την τοποθεσία loc και είναι τύπου loc_type. Εάν το είδος της τοποθεσίας παραληφθεί, πχ., καλώντας nearest_location(loc, loc_list), τότε επιστρέφεται η κοντινότερη τοποθεσία ανάμεσα σε αυτές στη loc_list ανεξάρτητα από το είδος της.
def distance(a, b): """Apostasi meta3y topo88esiwn.
a -- topo8esia A (afirimeno dedomeno typou location) b -- topo8esia B (afirimeno dedomeno typou location)
Epistrefei tin apostasi meta3y ths topo8esias A kai B se xiliometra.
>>> aueb = location('AUEB', 37.994097, 23.732253, 'university campus') >>> monast = location('Monastiraki', 37.976362, 23.725947, 'square') >>> distance(aueb, monast) 2.5224714882938657 >>> distance(aueb, aueb) 0.0 """ a_lat = _____________________ # gewgrafiko platos (lattitude) a a_lon = _____________________ # gewgrafiko mikos (longitude) a b_lat = _____________________ # gewgrafiko platos (lattitude) b b_lon = _____________________ # gewgrafiko mikos (longitude) b
from math import pi, cos phi_m = pi/180 * (a_lat + b_lat) / 2 k1 = 111.13209 - 0.56605 * cos(2*phi_m) + 0.00120 * cos(4*phi_m) k2 = 111.41513 * cos(phi_m) - 0.0945 * cos(3*phi_m) + 0.00012*cos(5*phi_m) lat_dist = (a_lat - b_lat) * k1 lon_dist = (a_lon - b_lon) * k2 return abs(lon_dist) + abs(lat_dist)
def print_location(loc): """Emfanizei stoixeia topo8esias.
loc -- dedomeno location
Emfanizei stoixeia gia tin topo8esia loc opws sta paradeigmata:
>>> monast = location('Monastiraki', 37.976362, 23.725947, 'square') >>> print_location(monast) Monastiraki (square) at coordinates 37.976362, 23.725947 >>> print_location(location('North Pole', 90.0, 135.0, 'pole')) North Pole (pole) at coordinates 90.0, 135.0 """ """GRAPSTE TON KWDIKA SAS APO KATW."""
def nearest_location(loc, loc_list, loc_type=None): """Epistrefei plisiesteri topo8esia.
loc -- topo8esia (dedomeno typoy location) loc_list -- lista pou periexei topo8esies (dedomena location) loc_type -- eidos topo8esias (str)
Epistrefei tin plisiesteri topo8esia stin loc apo autes pou briskonai sti lista loc_list tou eidous loc_type.
Paradeigmata: >>> llist = [location('AUEB', 37.994097, 23.732253, 'university campus'),\ location('Acropolis', 37.971584, 23.725912, 'monument'), \ location('Syntagma', 37.975560, 23.734691, 'square'), \ location('National Garden', 37.973116, 23.736483, 'park'), \ location('Monastiraki', 37.976362, 23.725947, 'square')] >>> name(nearest_location(llist[2], llist, 'monument')) 'Acropolis' >>> name(nearest_location(llist[1], llist, 'square')) 'Monastiraki' >>> name(nearest_location(llist[2], llist)) 'National Garden' >>> name(nearest_location(llist[2], llist, 'square')) 'Monastiraki' """ """GRAPSTE TON KWDIKA SAS APO KATW."""
|
Άσκηση 3
Συμπληρώστε τα κενά ώστε η κλήση pick_cherries(field) να εμφανίζει τις συμβολοσειρές (str) οι οποίες βρίσκονται στην πρώτη θέση των φωλιασμένων λιστών που δίνονται στο όρισμα field, όπως στα παραδείγματα των σχολίων.
Θεωρήστε ότι το όρισμα field είναι μια λίστα δύο στοιχείων: ο πρώτο στοιχείο είναι μια συμβολοσειρά (str) ενώ το δεύτερο μια λίστα της ίδιας μορφής είτε η τιμή None.
def pick_cherries(field): """Emfanizei string pou briskontai se fwliasmenes listes.
field -- lista me fwliasmena string. Ka8e lista exei dyo stoixeia: to prwto einai string kai to deutero einai eite lista ths idias morfhs 'h None.
Paradeigmata: >>> cherry_field = ['cherry1', ['cherry2', ['cherry3', ['cherry4', ['last cherry', None]]]]] >>> pick_cherries(cherry_field) cherry1 cherry2 cherry3 cherry4 last cherry >>> pick_cherries(['Hello', ['world', None]]) Hello world """ """ GRAPSTE TON KWDIKA SAS APO KATW."""
|
Άσκηση 4
Συμπληρώστε τον κώδικα στη συνάρτηση all_lc έτσι ώστε η κλήση all_lc(func, ls) να επιστρέφει True εάν και μόνο εάν η κλήση func(x) έχει τιμή True για όλα τα στοιχεία x της λίστας ls.
Η υλοποίησή σας θα πρέπει να χρησιμοποιεί επεξεργασία ακολουθιών με list comprehensions, χωρίς αναδρομικό ή επαναληπτικό υπολογισμό, (δηλ., την εντολή while ή for) . (Στις ασκήσεις 6 εως 9 θα υλοποιήσετε την ίδια συνάρτηση με τους άλλους τρόπους.)
def all_lc(func, ls):
"""True mono ean i klisi func(x) epistrefei True
gia ola ta stoixeia x tis ls.
func -- synartisi enos orismatos
ls -- lista
Paradeigmata:
>>> all_lc(lambda x: x >= 0, [1, 2, 3, 0, 4])
True
>>> all_lc(lambda x: x >= 0, [1, 2, -3, 0, 4])
False
>>> all_lc(lambda x: x % 2 == 0, [100, 10, 2022, 12])
True
"""
"""XRHSIMOPOIHSTE EPE3ERGASIA AKOLOU8IWN ME LIST COMPREHENSIONS.
MHN XRHSIMOPOIHSETE ANADROMH 'h EPANALHPTIKO YPOLOGISMO
(for 'h while)."""
"""GRAPSTE TON KWDIKA SAS APO KATW."""
Άσκηση 5
Κατασκευάστε τη συνάρτηση length_sort(ls) η οποία ταξινομεί σε αύξουσα σειρά τις συμβολοσειρές (string) που περιέχονται στη λίστα ls, σύμφωνα με το μέγεθος κάθε συμβολοσειράς. Συμβολοσειρές με το ίδιο μέγεθος εμφανίζονται σε αλφαβητική σειρά. Για παράδειγμα, ο ακόλουθος κώδικας Python,
ls = ['cat', 'z', 'bat', 'all', 'bin', 'fat', 'we'] length_sort(ls) print(ls)
|
θα πρέπει να εμφανίζει ['z', 'we', 'all', 'bat', 'bin', 'cat', 'fat']
def length_sort(ls): """Ta3inomhsh symfwna me to mikos kai alfavitiki seira. ls -- lista me symboloseires. Paradeigma: >>> ls = ['www', 'yy', 'ab', 'z'] >>> length_sort(ls) >>> print(ls) ['z', 'ab', 'yy', 'www'] """ """SYMPLHRWSTE TON KWDIKA SAS APO KATW."""
|
Άσκηση 6
Σε αυτή την άσκηση θα υλοποιήσετε τις κινήσεις στο παιχνίδι «φιδάκι». Το φιδάκι μπορεί να κινείται κατά μία θέση προς τα πάνω, κάτω, δεξιά και αριστερά καλώντας τις συναρτήσεις move_up, move_down, move_left και move_right. Το φιδάκι δεν επιτρέπεται να κινηθεί σε θέση που έχει ήδη επισκεφτεί, δηλαδή δεν επιτρέπεται να διασχίσει τη δική του διαδρομή.
Συγκεκριμένα, υλοποιήστε:
• τη συνάρτηση initialize_snake(x, y) που θα αρχικοποιεί το φιδάκι στη θέση με συντεταγμένες (x, y).
• τις συναρτήσεις move_up(snake), move_down(snake), move_left(snake), και move_right(snake), οι οποίες θα μετακινούν το φίδι snake προς την αντίστοιχη κατεύθυνση κατά μία θέση.
def initialize_snake(x, y): """Epistrefei fidaki. x -- akeraios y -- akeraios >>> snake = initialize_snake(5, 5) >>> move_right(snake) # Το φίδι μετακινείται στη θέση (6, 5) (6, 5) >>> move_down(snake) # Το φίδι μετακινείται στη θέση (6, 4) (6, 4) >>> move_left(snake) # Το φίδι μετακινείται στη θέση (5, 4) (5, 4) >>> move_up(snake) #Το φίδι διασχίζει τη δική του διαδρομή στη θέση (5, 5) 'GAME OVER' """ """SYMPLHRWSTE TON KWDIKA SAS APO KATW."""
def move_up(snake): """Kinhsh panw. >>> snake = initialize_snake(5, 5) >>> move_up(snake) (5, 6) >>> move_up(snake) == (5, 7) True """ """SYMPLHRWSTE TON KWDIKA SAS APO KATW."""
def move_down(snake): """Kinhsh katw. >>> snake = initialize_snake(5, 5) >>> move_down(snake) (5, 4) >>> move_down(snake) == (5, 3) True """ """SYMPLHRWSTE TON KWDIKA SAS APO KATW."""
def move_left(snake): """Kinhsh aristera. >>> snake = initialize_snake(5, 5) >>> move_left(snake) (4, 5) >>> move_left(snake) == (3, 5) True """ """SYMPLHRWSTE TON KWDIKA SAS APO KATW."""
def move_right(snake): """Kinhsh dexia. >>> snake = initialize_snake(5, 5) >>> move_dexia(snake) (6, 5) >>> move_dexia(snake) == (7, 5) True """ """SYMPLHRWSTE TON KWDIKA SAS APO KATW."""
|