kolokwium2 2013
Transkrypt
kolokwium2 2013
Kolokwium II z Wst¦pu do Informatyki, 2013/2014 1. Telemarketer dzwoni pod numery, które ma na li±cie. Do ka»dej osoby z listy dzwoni si¦ tylko raz (aby unikn¡¢ skarg), przy czym licz¡ si¦ tylko rzeczywi±cie odbyte rozmowy. Aby skoordynowa¢ dziaªania, rma zatrudniaj¡ca telemarketerów prowadzi rejestr odbytych rozmów. Plik z numerami zawiera w kolejnych linijkach numery telefonów, przykªadowo: numery.txt: 501123234 504142142 Pliki z danymi rozmów zawieraj¡: numer telemarketera, numer telefonu, dªugo±¢ rozmowy (0 w przypadku, gdy rozmowa si¦ nie odbyªa, tzn. telemarketerowi nie udaªo si¦ dodzwoni¢ do rozmówcy). Przyjmujemy, »e próby s¡ rejestrowane w kolejno±ci chronologicznej. Przykªadowy plik: rozmowy.txt: 14 501123234 0 14 501123234 0 12 501123234 3 14 601990880 2 15 601990880 1 8 504142142 0 11 501123234 2 (a) (2 pkt.) Napisz funkcj¦ zadzwonic(f_numery, f_rozmowy), dla podanych plików z numerami oraz z rozmowami zwróci list¦ wszystkich numerów, do których nale»y jeszcze w danym miesi¡cu zadzwoni¢, tzn. tych, pod które nie dodzwoniª si¦ skutecznie (tzn. nie porozmawiaª przynajmniej minuty) »aden telemarketer. Przykªadowo, wynikiem wykonania funkcji zadzwonic("numery.txt","rozmowy.txt") powinno by¢ ['504142142']. (b) (4 pkt.) Napisz funkcj¦ bledy(f_numery, f_rozmowy), która pozwoli wyªapa¢ tych telemarketerów, którzy popeªnili bª¦dy podczas pracy. Bª¦dem jest w szczególno±ci: próba dzwonienia do osoby, której nie ma na li±cie oraz próba dzwonienia do osoby, do której ju» udaªo si¦ dodzwoni¢ wcze±niej jakiemu± telemarketerowi. W przypadku rozpatrywania, czy kto± popeªniª bª¡d, to, czy telemarketerowi udaªo si¦ dodzwoni¢ do rozmówcy nie jest brane pod uwag¦. Funkcja powinna zwróci¢ list¦ numerów telemarketerów, którzy popeªnili bª¦dy. Przykªadowo, dla bledy("numery.txt","rozmowy.txt") wynikiem powinno by¢ [11, 14, 15]. Rozwi¡zanie: d e f baza_numerow ( f_numery ) : f = open ( f_numery ) baza = s e t ( [ ] ) for x in f : r = x . s p l i t () b a z a . add ( r [ 0 ] ) f . close () r e t u r n baza def z a d z w o n i c ( f_numery , f_rozmowy ) : baza_n = baza_numerow ( f_numery ) z = set ( [ ] ) f o r k i n baza_n z . add ( k ) f = open ( f_rozmowy ) for x in f : r = x . s p l i t () i f i n t ( r [ 2 ] ) > 0 and r [ 1 ] i n z: 1 z . remove ( r [ 1 ] ) f . close () return l i s t ( z ) def b l e d y ( f_numery , f_rozmowy ) : baza_n = baza_numerow ( f_numery ) juz_obsluzone = s e t ( [ ] ) bladzacy = set ( [ ] ) f = open ( f_rozmowy ) for x in f : r = x . s p l i t () marketer = i n t ( r [ 0 ] ) numer = r [ 1 ] minuty = i n t ( r [ 2 ] ) i f r [ 1 ] n o t i n baza_n o r numer i n b l a d z a c y . add ( m a r k e t e r ) e l i f minuty > 0 : j u z _ o b s l u z o n e . add ( numer ) return l i s t ( bladzacy ) juz_obsluzone : 2. Rozwa»my list¦ list zawieraj¡cych imiona uczestników kolejnych zebra« koªa naukowego (zakªadamy, »e ka»de imi¦ jednoznacznie wyznacza jedn¡ osob¦). Przykªadowa taka lista to np. [['Jan', 'Maria', 'Krzysztof'], ['Maria', 'Katarzyna'], ['Jan', 'Grzegorz', 'Maria']]). (a) (2 pkt.) Napisz funkcje kazde(l), która zwróci list¦ osób, które byªy na ka»dym z zebra«. Dla naszej przykªadowej listy powy»ej wynikiem funkcji kazde powinno by¢ ['Maria']. (b) (3 pkt.) Napisz funkcj¦ najczesciej(l, u), która dla listy l uczestników zebra« oraz dla listy u wybranych osób zwróci osob¦, która na zebraniach byªa najcz¦±ciej. W przypadku remisu zwracamy dowoln¡ z tych osób, przy czym remis jest tak»e wtedy, kiedy »adna z osób nie byªa na ani jednym zebraniu. Rozwi¡zanie: import collections def spotkania_uczestnik ( l ) : uczestnictwa = c o l l e c t i o n s . defaultdict ( int ) for spotkanie in l : for uczestnik in spotkanie : u c z e s t n i c t w a [ u c z e s t n i k ] += 1 return uczestnictwa def kazde ( l ) : ilosc_spotkan = len ( l ) byli = [ ] uczestnictwa = spotkania_uczestnik ( l ) for k , v in uczestnictwa . iteritems () : i f v == i l o s c _ s p o t k a n : b y l i . append ( k ) return byli def n a j c z e s c i e j ( l , u) : uczestnictwa = spotkania_uczestnik ( l ) przodownik = [ ] ile = 0 for k , v in uczestnictwa . iteritems () : i f k in u : if v > ile : przodownik = k ile = v r e t u r n przodownik 3. Co wypisz¡ nast¦puj¡ce programy? (a) (2 pkt.) def g(x , z ) : y = x + z [0] z [0] = y ∗ 2 2 if x > 3: return z else : return g(x + 1 , print g (1 , z) [1]) (b) (2 pkt.) v = 2 def h( l ) : global v i f len ( l ) > 3: return v else : l . append ( v + l [ 0 ] ) v += l [ 0 ] l [0] = v return l print h ( [ 2 ] ) 3