Asado Entre Amigos


Te parece un reto interesante.
La encuesta terminó el Miercoles, 22 Abril 2015, 04:44

Si
No

Ver resultados
Objetivo: Asado Entre Amigos
Hola. Tengo un rompedero de cabeza... para proponer...

Este problema no solo incluye un desafío de programación si no que se debe hacer un análisis del problema digamos un poco mas exhaustivo, para dar con las formulas necesarias antes de entrar a la programación. Ustedes dirán si es útil o no y si desean buscar una solución.

Lo explicare con un ejemplo, luego daré los requisitos que debe cumplir la solución.

Amigos se juntan a comer. Pedro trae el pan valuado en $20, Carlos trae la carne por un valor de $130, Alfredo trae las bebidas por $120 Roberto la ensalada con un valor de $50 y yo caigo de prepo y no puse ni un peso.... Pero eso no esta permitido...

Entonces.

DETALLE
Cantidad de personas 5
Total gastado 320
Ponen cada uno 64

y...

PAGOS
pedro a alfredo $:44
roberto a alfredo $:12
roberto a carlos $:2
yo a carlos $:64

Y asi todos contentos...

El software debe aceptar una cantidad n (mínimo 2 sin limite máximo) participantes.

Estos amigos no se perdonan ni los centavos... así que nada de redondeos.

Debe presentar en pantalla un detalle y las formas de pagos distributivas.


Espero que les resulte interesante y lo suficientemente desafiante como para emprender una solución...

Si desean aceptar la misión, muy bien...

Este mensaje no se autodestruira, ha menos que el administrador lo borre.


P/D: Alguien dirá que no tiene nada que ver con la programación, pero yo creo que si pues es un problema de la vida real que se le puede aplicar poder computacional para que los amigos no se peleen en las reuniones.

Perfil MP  
Objetivo: Re: Asado Entre Amigos
OsunaOsuna:

Citar:
para dar con las formulas necesarias antes de entrar a la programación

Creo que no se puede resolver con formulas, sino usando un algoritmo....

Citar:
no tiene nada que ver con la programación, pero yo creo que si pues es un problema de la vida real

Se podría usar algoritmos voraces ( http://jsbsan.blogspot.com.es/2014/...la-mochila.html ) o incluso algoritmos genéticos (de esto no tengo hecho ningun ejemplo...pero si se que se han publicado en la revista de gambas en ingles...)


Para "comprender" el problema me he hecho este esquema, seguro que tambien os sirve para dar una pista de lo que hay que hacer:

esquema_de_reparto

Objetivo: Re: Asado Entre Amigos
Hola jsbsan....

Citar:
Creo que no se puede resolver con formulas, sino usando un algoritmo....


Pues estas en lo correcto y lo reconozco, pero no creí que la "pragmática" fuese tan importante, el cual fue otro error mio, en adelante tratare de mantener una retorica profesional.

La verdad que el gráfico ayuda en la comprensión, la cual es evidente que la parte final es la mas compleja, pero no tanto; creo.

Empero al parecer mi reto no tuvo buena aceptación, quizás muy fácil... en el futuro creare uno mas complejo y emocionante si me dan los tiempos.

Perfil MP  
Objetivo: Re: Asado Entre Amigos
OsunaOsuna:

Citar:
quizás muy fácil...

No, todo lo contrario, es dificil. El hacer un programa que sea capaz de resolver cualquier tipo de situación similar a la que expones (con variantes como número de personas, importes de gastos y la cantidad que ponen cada uno),y averiguar cual es el reparto "óptimo", es complicado. Porque puede que no hay una solución única, sino varias, o en el peor de los casos, que hay un conjunto de soluciones mas o menos "optimas"

Este tipo de algoritmo se usan mucho para la optimización de cortes de materiales http://users.dsic.upv.es/grupos/gps/papers/TTIA%2797.pdf


Citar:
Formulas y Algoritmos: tratare de mantener una retorica profesional.

Es que no es lo mismo una fórmula, que un algóritmo.

Saludos

Objetivo: Re: Asado Entre Amigos
jsbsan

hola, definitivamente tienes razón sobre las diferencias abismales entre formula y algoritmo, es por eso que dije que debería fijarme mas en el sentido pragmático de lo escrito tambien, no volverá a suceder. cambiando de tema, salvo tu, otro no ha comentado nada, lo tomate como un acto de discriminación y me pondré a solucionarlo solo y publicare acá mi solución.

Acto seguido, no publicare mas retos de programacion.

Cambio y fuera, hasta que encuentre la solución.

Perfil MP  
Objetivo: Re: Asado Entre Amigos
OsunaOsuna:

Citar:
...lo tomate como un acto de discriminación y me pondré a solucionarlo solo y publicare acá mi solución. Acto seguido, no publicare mas retos de programacion.


Hombre, no te tienes que molestar porque no hay haya muchos comentarios. Es un tema complicado.
Intentaré también el reto, y asi por lo menos, podemos comparar soluciones.

Objetivo: Re: Asado Entre Amigos
En los retos que pongo yo, nadie -casi-, se suma. Ahí tienes el reto del calendario, el reto de la encriptación, etc. etc.
No es una discriminación, es que no a todo el mundo le interesa todo y no todo el mundo tiene tiempo de dedicarle a todo.

Perfil MP  
Objetivo: Re: Asado Entre Amigos
Osunaosuna:

Te adjunto mi solución. Lo que he hecho es "modelizar" la situación como si fuera real, y he pensado como se resolvería entre un grupo de amigos.

Osea:
La persona que no ha comprado nada de comida o bebida, tiene un saldo "positivo", que sabe que tiene que repartir entres las que tenga un saldo negativo.
Las personas que han comprado algo, pero tiene un valor de menos de 64 euros, tiene un saldo positivo (pero menor) y sabe que lo tiene que dar a las personas con saldo negativo.

Las personas que han comprado algo, pero su valor es mayor que 64 euros, tienen un saldo negativo, y solo pueden recibir dinero.

El objetivo es que el saldo de todas las personas quede a 0.


Para programar esto lo que uso es una clase persona, que incluye su nombre, dinero inicialmente gastado, comida que aporta y varias propiedades, entre ella el saldo.


Es saldo para cada persona se calcula asi:
personaTemporal.saldo = cantidadRepartir - personaTemporal.PagadoInicialmente

Y el algoritmo que he hecho, se encarga de si la persona tiene saldo, lo reparte al que tenga un saldo negativo. (osea le debemos entre todos).
y va informando de como se va haciendo el reparto en un textarea.


reparto_del_asado

Como ves mi solución difere en la tuya, porque el sistema tiene varias soluciones de reparto.

He hecho que recorra dos veces el bucle, pero pienso que para optimizarlo, se debieran ordenar las personas, en orden decreciente de saldo, osea los que tengan dinero "a repartir" primero y los últimos los que tengan saldo negativo (dinero a recibir), así solo se recorrería el bucle una vez.


Public Sub repiteReparto()

Dim b As Integer
Dim a As Integer
Dim cantidad As Float
Dim personaTemporal As Persona
Dim personaTemporalArepartir As Persona

For b = 0 To (ArrayPersonas.count - 1)

personaTemporal = ArrayPersonas[b]

For a = 0 To ArrayPersonas.count - 1
personaTemporalArepartir = ArrayPersonas[a]

'es distinta persona?
If personaTemporal = personaTemporalArepartir Then
Continue
Else
'si tiene saldo negativo, y tengo dinero en mi saldo
If personaTemporalArepartir.saldo <0> 0 Then
'le doy dinero
'cuanto le doy?
'lo que le puedo dar es la cantidad de mi saldo: personaTemporal.saldo
If (personaTemporalArepartir.saldo + personaTemporal.saldo) < 0 Then
cantidad = personaTemporalArepartir.saldo + personaTemporal.saldo
personaTemporalArepartir.saldo = cantidad
TextAreaInforme.Text &= personaTemporal.nombre & " le da a " & personaTemporalArepartir.nombre & " la cantidad de: $" & Str$(personaTemporal.saldo) & "\n"
personaTemporal.saldo = 0 'lo doy todo
Else
If (personaTemporalArepartir.saldo + personaTemporal.saldo) > 0 Then
cantidad = personaTemporalArepartir.saldo + personaTemporal.saldo

TextAreaInforme.Text &= personaTemporal.nombre & " le da a " & personaTemporalArepartir.nombre & " la cantidad de: $" & Str$(- personaTemporalArepartir.saldo) & "\n"
personaTemporalArepartir.saldo = 0
personaTemporal.saldo = cantidad
Else
If personaTemporalArepartir.saldo + personaTemporal.saldo = 0 Then

TextAreaInforme.Text &= personaTemporal.nombre & " le da a " & personaTemporalArepartir.nombre & " la cantidad de: $" & Str$(personaTemporal.saldo) & "\n"
personaTemporalArepartir.saldo = 0
personaTemporal.saldo = 0
Endif

Endif

Endif
Endif

Endif
Next

Next

End


RepartoAsado-0.0.1.tar.gz
Descripción: Algoritmo de reparto... sabiendo el dinero que has dado... 
Descargar
Nombre del archivo: RepartoAsado-0.0.1.tar.gz
Tamaño: 6.13 KB
Descargado: 91 veces
RepartoAsado-0.0.1.tar.gz
Descripción: Algoritmo de reparto... sabiendo el dinero que has dado... 
Descargar
Nombre del archivo: RepartoAsado-0.0.1.tar.gz
Tamaño: 6.13 KB
Descargado: 91 veces
RepartoAsado-0.0.1.tar.gz
Descripción: Algoritmo de reparto... sabiendo el dinero que has dado... 
Descargar
Nombre del archivo: RepartoAsado-0.0.1.tar.gz
Tamaño: 6.13 KB
Descargado: 91 veces

Objetivo: Re: Asado Entre Amigos
Hola jsbsan....

Yo estoy haciendo la mía, pero aun no la termino por falta de tiempo, pero lo he encarado de otra forma. Descargue tu código pero decidí no verlo aun, hasta que termine el mio, paro verme influenciado.

tambien he creado una clase que almacena los datos del participante y se almacena en un array de esta clase, en la misma clase se almacenan los datos incluyendo el valor a reparttir.


Property Nombre As String
Private sNombre As String

Property Aporte As Long
Private lAporte As Long

Property Reparto As Long
Private lReparto As Long

Property tag As Long
Private lTag As Long


luego los separo por los valores de reparto los negativos que son los que pusieron de mas y deben recibir, y los positivos que son los que tienen que aportar...

luego realizo los calculosos buscando los mayores valores negativos y positivos, luego lo subo, cuando loo termine así nos comentamos mas...

Perfil MP  
Objetivo: Re: Asado Entre Amigos
shordi... jajaja no lo había visto a tu comentario... pero yo no estoy chillando solo estoy agitando un poco el caldero, pero sin malas intenciones, el reto de la encriptación, yo resolví uno de esos pero creo que era de otro wey... si definitivamente era de otro, v3ctor el que había que descubrir la contraseña nada que ver con la criptografia... lo buscare y pondré manos a la obra pues. El de las fechas lo dejo pasar pues no me gustan.

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.3662s (PHP: -72% SQL: 172%)
Consultas SQL: 48 - Debug off - GZIP Activado