[hm] [org] Autobús ida y vuelta desde Barcelona

d1d4c d1d4c en aktivix.org
Lun Ago 23 15:38:05 CEST 2010


Hola :)

El 18/08/10 21:13, Blackhold escribió:
.../
> no es la primera vez que monto transportes colectivos y supongo que no
> será la última.

Pues si te sirve de algo, he escrito[0] en pyhton lo que comentaba en 
este hilo.

La salida que da, dada una lista (de hecho, un diccionario) de 
pasajeros[1] en un archivo de texto con el importe máximo que cada una 
estaría dispuesta a pagar, y dado el precio del hackbus (en el propio 
script), es esta:

Precio del HackBus: 485.0
Numero de pasajeros: 38
Precio inicial del billete: 12.7631578947
Precio final del billete: 15.6
Suma en euros de los billetes de la clase A: 78.0
suma en euros de lo que puede pagar la clase B: 407

Clase A (pagaran el billete integro):
['alba', 'jose', 'josep', 'montse', 'ramon']

Clase B (pagaran una parte del billete, el maximo que dijeron que 
estaban dispuestos a gastarse):
[('ana', 11), ('baltasar', 11), ('carme', 14), ('carmen', 12), ('chema', 
12), ('chus', 11), ('cristian', 12), ('cristina', 11), ('david', 11), 
('gonzalo', 11), ('hector', 11), ('joana', 14), ('jordi', 14), ('juan', 
14), ('julia', 15), ('leonor', 15), ('malen', 10), ('manolo', 10), 
('manuela', 9), ('maria', 13), ('martin', 13), ('monica', 12), ('nacho', 
11), ('nestor', 15), ('pep', 13), ('pepe', 12), ('raquel', 11), 
('regina', 14), ('rosa', 12), ('rosenda', 15), ('ruben', 13), ('sergio', 
12), ('xavier', 13)]

Como ves, la condición de 44 personas a 11€ o no hay hackbus, no es 
estrictamente necesaria, pues otras opciones son posibles, como en el 
ejemplo que doy, donde los pasajeros podrían pasar de tu condición, 
organizarse por sí mismos e ir al Hackmeeting en ese bus, aun no 
habiendo llegando a ser 44 e incluso pudiendo pagar una de ellas 9€ (en 
el ejemplo, manuela).

Es prácticamente mi primer script en python (y en cualquier lenguaje), 
así que disculpad si tiene fallos de estilo o lo que sea. Y seguro que 
se podría haber hecho mejor, con funciones, o de una manera más 
limpia... Cualquier comentario al respecto será bien recibido :)


Saludos :)

[0] cat calcula_precio_billete_HackBus.py
#! /usr/bin/env python

## Calcula el precio del billete cuando no
## todas pueden pagarlo, viajando todas :)
## (suponiendo que el numero de plazas es igual
## o mayor que el de pasajeras)

## Nombres
hackbus = 485.0
total_a = 0
total_b = 0
n = 1
repetir = True

a = {}  ## Los que pagarian el billete integro
b = {}  ## Los que solo una parte
d = {}


## Lee el archivo y lo copia al diccionario 'a'
for i in file('pasajeros.txt'):
     c = i.split()
     a[c[0]] = int(c[1])

## Calcula el precio inicial del billete
billete = hackbus / len(a)
precio_hackbus = hackbus
billete_inicial= billete

## Si a alguien no le llega para el billete, lo copia
## al diccionario 'b', recalcula el nuevo billete
## y repite la operacion si hace falta
while repetir:
     for i in a:
         if a[i] < billete:
             d[i] = a[i]
             hackbus -= a[i]
             billete = hackbus / (len(a) - n)
             n += 1
     if d:
         claves = d.keys()
         for i in claves:
             del a[i]
             b[i] = d[i]
             del d[i]
         n = 1
     else: repetir = False

## Suma el total de los valores del diccionario 'b',
valores = b.values()
for suma in valores: total_b += suma
suma = 0
total_a = 0
valores = a.values()
for suma in valores: total_a +=suma

## Ordena 'a' y 'b'
claseA = a.keys()
claseA.sort()
claseB = b.items()
claseB.sort()

## Imprime en la salida estantar
print
print "Precio del HackBus: " + str(precio_hackbus)
print "Numero de pasajeros: " + str(len(a) + len(b))
print "Precio inicial del billete: " + str(billete_inicial)
print "Precio final del billete: " + str(billete)
print "Suma en euros de los billetes de la clase A: " + str(billete * 
len(a))
print "suma en euros de lo que puede pagar la clase B: " + str(total_b)
print
print "Clase A (pagaran el billete integro):"
print claseA
print
print "Clase B (pagaran una parte del billete, el maximo que dijeron que 
estaban dispuestos a gastarse): "
print claseB
print



[1] cat pasajeros.txt
alba 50
ana 11
baltasar 11
carme 14
carmen 12
chema 12
chus 11
cristian 12
cristina 11
david 11
gonzalo 11
hector 11
joana 14
jordi 14
jose 20
josep 16
juan 14
julia 15
leonor 15
malen 10
manolo 10
maria 13
martin 13
monica 12
montse 20
nacho 11
nestor 15
pep 13
pepe 12
ramon 16
raquel 11
regina 14
rosa 12
rosenda 15
ruben 13
sergio 12
xavier 13
manuela 9


Más información sobre la lista de distribución HackMeeting