Mostrando las entradas con la etiqueta Check iO. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Check iO. Mostrar todas las entradas

lunes, 21 de abril de 2014

Check iO: un juego para programar con Python

Check iO es una sitio creado por programadores ucranianos con ejercicios para practicar las habilidades adquiridas en Python. 


http://www.checkio.org/
Uno de los problemas planteados en el sitio es el siguiente:

"Se comienza a alimentar a las palomas. Un minuto más tarde aparecen dos más y luego de otro minuto aparecen tres, luego cuatro y así sucesivamente. Una porción de comida le dura un minuto a cada paloma y en caso de que no haya suficiente comida para todas, comen las que llegaron primero. Las palomas no dejan de comer. Si hay N porciones de comida, ¿Cuántas palomas se pueden alimentar con al menos una porción de comida?"




Para resolverlo creé una clase llamada Pigeon con las propiedades eat y fed:

  1. class Pigeon(object):
  2.     def __init__(self): 
  3.         self.yum = 0 #porciones consumidas
  4.     def eat(self, portions):
  5.         if portions > 0:
  6.             self.yum += 1
  7.             portions -= 1
  8.         return portions #porciones que quedan
  9.     def fed(self):
  10.         return self.yum > 0 #devuelve False o True


El procedimiento para hallar la solución es el siguiente:


  1. def alimentar_aves(porciones):
  2.         minuto = 0
  3.         aves = []
  4.         while porciones > 0:
  5.                 minuto += 1
  6.                 for i in range(minuto):
  7.                         aves.append(Pigeon())
  8.                 for ave in aves:
  9.                         porciones = ave.eat(porciones)
  10.                         if porciones == 0:
  11.                                 break
  12.         cont = 0
  13.         for paloma in aves:
  14.                 if paloma.fed():
  15.                         cont += 1
  16.         return cont

Y como el ejemplo de la figura de arriba, el resultado para cinco porciones es:


  1. alimentar_aves(5)
  2. >>> 3