Τετάρτη 22 Μαρτίου 2017

Αναπτύσσοντας αλγόριθμους

Αναπτύσσονται αλγόριθμοι για την επίλυση (όχι κατ' ανάγκη τη βέλτιστη), που προτείνονται στο σχολικό βιβλίο "Προγραμματισμός Υπολογιστών, καθώς και κάποιες παραλλαγές

Δ5. Να γράψετε μια συνάρτηση σε Python η οποία θα δέχεται μια λίστα με λογικές τιμέςTrue/False και θα διαχωρίζει τις τιμές αυτές, τοποθετώντας τα True πριν από τα False.

1η Επίλυση
def arrange_list1(alist)
    N=len(alist)
    for i in range (1,N):
for j in range (N-1,0,-1):
if alist[j] == True:
if alist[j-1] == False:
alist[j-1],alist[j]=alist[j],alist[j-1]
else:
j=j-1

2η Επίλυση
def arrange_list(alist):
    N=len(alist)
    breakpoint=N-1
    for i in range(0, breakpoint):
            if alist[i]==False:
                    j=breakpoint
                   swap=False
                   while  j > i and swap==False:
                           if alist[j]==True:
                                         alist[j],alist[i]=alist[i],alist[j]
                                         breakpoint=j-1
                                         swap=True
                           j=j-1

*Για την κλήση και εκτέλεση του αλγόριθμου:

#δημιουργία λίστας τυχαίων True και False τιμών
import random
N=int(input('Δώσε μήκος λίστας που θέλεις να δημιουργήσω')
start = 0
end = N
alist = []
for i in range(start, end):
    alist.append(random.choice([True, False]))
print ('Αρχική Λίστα =', alist)
print('')
#κλήση συνάρτησης
arrange_list(alist)
print ('Τακτοποιημένη λίστα=', alist)

Δ6. Να γράψετε ένα πρόγραμμα σε Python το οποίο θα δεχεται μια λίστα με λογικές τιμές True/False και στην συνέχεια θα καλεί την συνάρτηση του προηγούμενου ερωτήματος, ώστε να τοποθετηθούν τα True πριν τα False. Στη συνέχεια θα τοποθετεί τις τιμές αυτές εναλλάξ, δηλαδή True, False, True, False κλπ, εκτελώντας τις λιγότερες δυνατές συγκρίσεις.

def alternating(alist):
#συνάρτηση για εναλλαγή τιμών True - False
    N=len(alist)
    i=0
    while alist[i]==True:
        i=i+1
    breakpoint=i
    for i in range(1,breakpoint,2):
        j=breakpoint + i
        if j<=N-1:
            alist[i],alist[j]=alist[j],alist[i]
   
#Για δημιουργία λίστας True - False κάνε όπως παραπάνω.
#κλήση συνάρτησης για τακτοποίηση λίστας True - False
arrange_list(alist)
print ('Τακτοποιημένη λίστα=', alist)
print('')
#κλήση συνάρτησης για εναλλαγή τιμών True - False
alternating(alist)
print ('Λίστα εναλλασσόμενων τιμών=', alist)



Δ7. Ας υποθέσουμε ότι σας δίνεται μια λίστα στην Python η οποία περιέχει λογικές τιμές True/False εναλλάξ. Επίσης, το πλήθος των True είναι ίσο με το πλήθος των False. Να γράψετε αλγόριθμο σε Python, ο οποίος δεδομένης της παραπάνω δομής της λίστας, θα τοποθετεί τα True πριν τα False, εκτελώντας τις λιγότερες δυνατές μετακινήσεις. Δεν επιτρέπεται να κάνετε καμιά σύγκριση  ούτε να χρησιμοποιήσετε τη δομή if. Θεωρήστε ότι το πρώτο στοιχείο της λίστας έχει την τιμή True.

def arrangetrue_false(mylist):
    N=len(mylist)
    mid=int((N-1)/2)
    i=1
    while i<=mid:
        mylist[i],mylist[N-i-1]=mylist[N-i-1],mylist[i]
        i=i+2

*Για την κλήση και εκτέλεση του αλγόριθμου:
#δημιουργούμε λίστα τυχαίου άρτιου πλήθους στοιχείων ενναλλασσόμενων True/False
import random
N=int((random.randint(10,100))/2)
truefalselist=[]
for i in range (0,N):
    if i%2==0:
        truefalselist.insert(i,True)
    else:
        truefalselist.insert(i, False)
#κλήση συνάρτησης
print('Αρχική λίστα',truefalselist)
arrangetrue_false(truefalselist)
print('')
print('Τελική λίστα',truefalselist)

Δ8. To πρόβλημα της ολλανδικής σημαίας αναφέρεται στην αναδιάταξη μιας λίστας γραμμάτων, η οποία περιέχει μόνο τους χαρακτήρες R, W, B, έτσι ώστε όλα τα R να βρίσκονται πριν από τα W και όλα τα W να βρίσκονται πριν από τα B. Να τροποποιήσετε έναν από τους αλγόριθμους ταξινόμησης, ώστε να επιλύει αυτό το πρόβλημα.

#δημιουργούμε λίστα τυχαίων R,W,B
import random
lista=[]
for i in range(20):
   lista.append(random.choice(['R','W','B']))
N=len(lista)
#Προσαρμόζουμε τον αλγόριθμο BubbleSort ώστε η αντιμετάθεση κάθε στοιχείου με το ακριβώς από πάνω του, να εξυπηρετεί τη σειρά R,W,B
for i in range(N):
  for j in range(N-1,i-1,-1):
    if (lista[j]=='R' and lista[j-1]=='B') or (lista[j]=='R' and lista[j-1]=='W') or (lista[j]=='W' and lista[j-1]=='B'):
      lista[j],lista[j-1]=lista[j-1],lista[j]
print lista

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου