Introducción a la Computación Examen de febrero de 2013 con solución Ejercicio 1: Para representar un tiempo de duración de cierto evento se utiliza un diccionario para indicar cantidad de dı́as, horas, minutos y segundos; de modo que, por ejemplo, un perı́odo de 2 dı́as, 6 horas, 4 minutos y 30 segundos se representa mediante {’dias’:2, ’horas’:6, ’minutos’:4, ’segundos’:30} a) Escribir una función en python que reciba un diccionario que representa un tiempo y retorne un entero indicando el tiempo en segundos. Ejemplo >>> a_segundos({’dias’:0, ’horas’:0, ’minutos’:2, ’segundos’:20} 140 b) Escribir una función en python que reciba un tiempo expresado en segundos y devuelva un diccionario que representa el tiempo en dı́as, horas, minutos y segundos. Ejemplo >>> de_segundos(140) {’dias’:0, ’horas’:0, ’minutos’:2, ’segundos’:20} Solución: a) def a_segundos(dic): horas = dic[’dias’]*24+dic[’horas’] minutos = horas*60 + dic[’minutos’] segundos = minutos*60 + dic[’segundos’] return segundos b) def de_segundos(segundos): dic={} dic[’segundos’]=segundos % 60 minutos = segundos/60 dic[’minutos’]=minutos % 60 horas = minutos/60 dic[’horas’]=horas % 24 dic[’dias’]=horas / 24 return dic Ejercicio 2: a) Implementar una función recursiva que dada una lista indique su cantidad de elementos (no se puede usar length). b) Resolver el problema de la parte anterior con un algoritmo iterativo. c) Definir una funcion separar, que dada una lista de enteros devuelva una tupla de listas con las ocurrencias negativas, nulas y positivas de de la misma con el mismo orden. Ej: > separar([0, -1, 2, 0, 0, -3]) ([-1, -3], [0, 0, 0], [2]) d) Hacer lo mismo que en la parte c), pero eliminando las ocurrencias repetidas. Ej: > separar2([0, -1, 2, 0, 0, -3]) ([-1, -3], [0], [2]) e) Hacer lo mismo que en la parte d), pero considerando que la lista termina si aparecen dos números iguales seguidos. Ej: > separar2([0, -1, 2, 0, 0, -3]) ([-1], [0], [2]) Solución: a) def elementos (lista): if lista==[]: return 0 else: return 1+ elementos(lista[1:]) b) def elementos (lista): res = 0 for i in lista: res = res+1 return res c) def separar (lista): neg = [] nul = [] pos = [] for i in lista: if i<0: neg.append(i) elif i == 0: nul.append(i) else: pos.append(i) return (neg, nul, pos) d) def separarSinRep (lista): neg = [] nul = [] pos = [] for i in lista: if i<0 and i not in neg: neg.append(i) elif i == 0 and i not in nul: nul.append(i) elif i>0 and i not in pos: pos.append(i) return (neg, nul, pos) e) def separarHastaRepetidos (lista): n= len(lista) neg = [] nul = [] pos = [] if n!=0: i = lista[0] if i<0: neg.append(i) elif i == 0: nul.append(i) else: pos.append(i) j=1 while j<n and lista[j] != i: i=lista[j] j=j+1 if i<0 and i not in neg: neg.append(i) elif i == 0 and i not in nul: nul.append(i) elif i>0 and i not in pos: pos.append(i) return (neg, nul, pos) Ejercicio 3: Una progresión aritmética de diferencia común d, empezando de a con n elementos es la sucesión finita de números: a, a + d, a + 2d, . . . , a + (n − 1)d a) Escribir una función python que reciba a, d y n y escriba en pantalla los elementos de la progresión aritmética correspondiente. b) Dada una lista de enteros, escribir una funcion prog_ar que imprima en pantalla si la lista corresponde a los primeros elementos de una progresión aritmética, y si es asi que imprima su comienzo, diferencia común, y cantidad de elementos. Ejemplos > prog_ar([1, 2, 3]) Es progresión aritmética a es 1 d es 1 n es 3 >prog_ar([9, 13, 17, 21]) Es progresión aritmética a es 9 d es 4 n es 4 >prog_ar([9, 17, 13, 21]) No es progresión aritmética >prog_ar([-1, 2, 8]) No es progresión aritmética c) Escribir un programa Python que solicite números al usuario hasta que la suma de los números ingresados supere 1000 y luego muestre en pantalla si es parte de una progresión aritmética o no, indicando a, d y n en caso de que sı́ lo sea. Solución: a) def prog(a,d,n): for i in range(n): print a+d*i b) def es_prog(lista): if lista==[]: print ’la lista es vacı́a’ else: a = lista[0] n = len(lista) if n==1: print ’lista de un elemento’ else: d=lista[1]-a prog = True anterior = lista[1] j = 2 while prog and j<n: actual = lista[j] if actual-anterior != d: prog = False anterior = actual j = j+1 if prog: print ’es prog de a=%d, d=%d y n=%d’ %(a,d,n) else: print ’no es prog’ c) num = input() lista=[num] suma = num while suma <= 1000: num = input() suma = suma + num lista.append(num) es_prog(lista)