Στην άσκηση αυτή θα συμπληρώσετε τον κώδικα Python που βρίσκεται στο αρχείo hw3.py ακολουθώντας παρόμοιες οδηγίες (δείτε και εδώ) με τις προηγούμενες σειρές ασκήσεων. (Αυτόματοι έλεγχοι ορθότητας βρίσκονται στο hw3_tests.txt.)

 

Τρόπος παράδοσης:

Θα παραδώσετε το αρχείο hw3.py.

  1. Οι φοιτητές που έχουν εγγραφεί στο eclass θα παραδόσουν την εργασία από εκεί.
  2. Οι φοιτητές που δεν έχουν εγγραφεί στο 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):

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."""