2η Εργαστηριακή άσκηση. Λύσεις.

Πρόβλημα 1: Όλοι οι αριθμοί τηλεφώνου στην Ελλάδα έχουν δέκα ψηφία. Αντιστοιχούμe σε κάθε αριθμό την ακολουθία χαρακτήρων που προκύπτει αν αντικαταστήσουμε κάθε ψηφίο με το αντίστοιχο γράμμα του αλφάβητο, με το μηδέν να αντιστοιχεί στο γράμμα 'x'. Γράψτε τη συνάρτηση telephone η οποία επιστρέφει τον αριθμό τηλεφώνου, ως ακέραιο, δεδομένης της αναπαράστασής του ως ακολουθία χαρακτήρων.


def telephone(numstr):
    code = 'xabcdefghi'
    num = 0
    for c in numstr:
        j = 0
        while code[j] != c: j += 1
        num = 10*num + j
    return num

# Let's use this function

s = 'bcdabxiggh'
print('Encoded number:', s)
print('Decoded number:', telephone(s))

Εναλλακτικά, θα μπορούσε κανείς να υπολογίσει, ως χαρακτήρες τα ψηφία του αριθμού και να τον μετατρέψει σε ακέραιο χρησιμοποιώντας τη συνάρτηση int():


def telephone(numstr):
    code = 'xabcdefghi'
    num = ''
    for c in numstr:
        j = 0
        while code[j] != c: j += 1
        num += num + str(j)
    return int(num)

Πρόβλημα 2: Γράψτε μια συνάρτηση με το όνομα vowelCount και όρισμα την ακολουθία χαρακτήρων s η οποία να επιστρέφει τον αριθμό των φωνηέντων σε αυτή την ακολουθία χαρακτήρων.


def vowelCount(s):
    count = 0
    for c in s:
        if c in 'aeiou': count += 1
    return count

# Let's use this function

s = 'Easy problem, wasn\'t it?'
print('Number of vowels in \'', s + ':', vowelCount(s))

Πρόβλημα 3: Γράψτε μια συνάρτηση με το όνομα whatVowels και όρισμα την ακολουθία χαρακτήρων s η οποία να επιστρέφει, ως ακολουθία χαρακτήρων εκείνα τα φωνήεντα που περιέχονται στην s. Για παράδειγμα, αν το όρισμα είναι 'program' θα πρέπει να επιστρέψει 'oa' ενώ αν είναι 'try' να επιστρέχει '' και αν το όρισμα είναι 'potato' να επιστρέφει 'οαο'.


def whatVowels(s):
    v = ''
    for c in s:
        if c in 'aeiou': v += c
    return v

# Let's use this function

s = 'Here is a looong message'
print('Vowels in', s + ': ', whatVowels(s))

Πρόβλημα 4: Υποθέστε ότι η συνάρτηση f με όρισμα έναν πραγματικό αριθμό έχει οριστεί έτσι ώστε να επιστρέφει έναν πραγματικό αριθμό για οποιαδήποτε τιμή του ορίσματός της. Γράψτε τη συνάρτηση fsign η οποία να επιστρέφει μια ακολουθία χαρακτήρων αποτελούμενη από τους χαρακτήρες '+' και '-' ανάλογα αν η τιμή της συνάρτησης f είναι θετική ή όχι στα μέσα των διαστημάτων $[0,1], [1,2],\ldots,[99,100]$. Για παράδειγμα, αν η συνάρτηση είναι παντού θετική θα πρέπει να επιστρέψει μια ακολουθία χαρακτήρων αποτελούμενη από 100 χαρακτήρες, όλους ίσους με τον '+'.


import math

def f(x):
    return x*math.cos(x)

def fsign():
    s = ''
    for i in range(1,100,2):
        y = f(i/2)
        if x > 0:
            s += '+'
        else:
            s += '-'
    return s

# Let's try this function

print(fsign())

Πρόβλημα 5: Υποθέστε ότι η συνάρτηση $f$ με όρισμα έναν πραγματικό αριθμό έχει οριστεί έτσι ώστε να επιστρέφει έναν πραγματικό αριθμό για οποιαδήποτε τιμή του ορίσματός της. Γράψτε τη συνάρτηση fmax με όρισμα δύο πραγματικούς αριθμούς $a < b$ και ένα φυσικό αριθμό $n > 1$ η οποία να επιστρέφει το μέγιστο της συνάρτησης $f$ σε $n$ σημεία οποιόμορφα κατανεμημένα στο διάστημα $[a, b]$. Για παράδειγμα, αν $a = 1$, $b = 3 και $n = 5$ η συνάρτηση πρέπει να επιστρέφει τη μέγιστη από τις τιμές της $f$ στα σημεία $1, 1.5, 2, 2.5, 3$.


import math

def f(x):
    return x*math.sin(x)


def fmax(a, b):
    maxx = f(a)
    dx = (b - a) / (n - 1)
    for i in range(1,n):
        y = f(a + i*dx)
        if y > maxx: maxx = y
    return maxx

Πρόβλημα 6: Γράψτε μια συνάρτηση με το όνομα wordScore και όρισμα την ακολουθία χαρακτήρων s η οποία να επιστρέφει έναν ακέραιο αριθμό ως εξής: κάθε φωνήεν βαθμολογείται με 2 βαθμούς, κάθε ένα από τα γράμματα, m, r, y με 3 βαθμούς, ενώ όλοι οι υπόλοιποι χαρακτήρες συνεισφέρουν 1 βαθμό.


def wordScore(s):
    score = 0
    for c in s:
        if c in 'aeiou':
            score += 2
        elif c in 'mry':
            score += 3
        else:
	    score += 1
    return score

# Let's use this function

s = 'mississippi'
print('The score of the word', s, 'is:', wordScore(s))

Πρόβλημα 7: Γράψτε μια συνάρτηση με το όνομα numWars και όρισμα δύο φυσικούς αριθμούς n1 και n2. Η συνάρτηση θα πρέπει να επιστρέφει την ακολουθία χαρακτήρων 'Friends' αν οι δύο αριθμοί έχουν τουλάχιστον δύο κοινούς διαιρέτες διαφορετικούς από τη μονάδα, αλλιώς την ακολουθία χαρακτήρων 'Enemies'.


def numWars(n1, n2):
    numd = 0
    for i in range(2, min(n1,n2)+1):
        if n1%1 == 0 and n2%i == 0: numd += 1
    if numd >=2:
        return 'Friends'
    else:
	return 'Enemies'

# Let's try this function

n1 = 132
n2 = 548

print('The numbers', n1, n2, 'are', numWars(n1, n2))

Πρόβλημα 8: Γράψτε μια συνάρτηση με το όνομα circles και ορίσματα τέσσερις πραγματικούς αριθμούς $a, b, c, d$. Υποθέτουμε ότι στα σημεία $(a, b)$ και $(c, d)$ βρίσκονται δύο κύκλοι ακτίνας 1. Η συνάρτηση circles θα πρέπει να επιστρέφει 'YES' αν οι δύο κύκλοι τέμνονται ή εφάπτονται, 'NO' διαφορετικά.


def circles(a, b, c, d):
    dist = (a - c)**2 + (b - d)**2
    if dist < 4:
        return 'NO'
    else:
        return 'YES'

Πρόβλημα 9: Γράψτε μια συνάρτηση με το όνομα squares και ορίσματα δύο πραγματικούς αριθμούς $0 < a < b$. Οι αριθμοί αυτοί είναι τα μήκη των πλευρών δύο τετραγώνων με την πάνω αριστερή κορυφή τους στα σημεία $(a, a)$ και $(b, b)$, και πλευρές παράλληλες προς τους άξονες. Η συνάρτηση θα πρέπει να επιστρέφει 'YES' αν τα δύο τετράγωνα τέμνονται, 'NO' διαφορετικά.


def squares(a, b):
    if 2*a < b:
        return 'NO'
    else:
        return 'YES'

# Let's test the function

a = 3
b = 4

print('Do the squares intersect?', squares(a,b))