Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Algoritmo Matematico, ¿Es Posible? (https://www.clubdelphi.com/foros/showthread.php?t=49754)

ZayDun 29-10-2007 18:15:51

Algoritmo Matematico, ¿Es Posible?
 
Hola Amigos, tengo una duda y es que me gustaria hacer un programa que indicandole un numero como resultado e indicandole varios numeros como valores realize las operaciones necesarias para dar con el numero del resultado. por ejemplo...

Tenemos = 20 - 51 - 25 - 10
Resultado = 530

La solucion seria: 51 * 10 + 20

y me pregunto si seria posible hacer esto con delphi? Muchas gracias por molestaros en leer mi duda. saludos!

Delphius 29-10-2007 18:35:28

Hola ZayDun,
¿Qué operaciones son las que estás considerando? ¿Las elementales unicamente?

Ha decir verdad el mayor problema de tu planteo es el alto número de combinaciones que se pueden conseguir. Por darte un ejemplo: si se ingresan 4 valores pueden existir, si no me fallan los cálculos, entre 12 y 24 maneras de permutar los números. Eso es por cada operación permisible.

mmm... puede que sea complicado pero no imposible de hacer...

Por ahora no se me ocurre de que manera encararlo.

Si nos explicas mejor... puede que logremos darte alternativas.
Saludos,

egostar 29-10-2007 18:39:29

Esto me suena a No perderselo :rolleyes:

Salud OS

ZayDun 29-10-2007 18:46:57

Hola de nuevo y gracias por responder, lo que quiero realizar es algo similar al video que indica egostar :P pero con operacion basicas, "sumar,restar multiplicar y dividir". gracias de nuevo y perdonar por no haberme explicado en un principio.

Delphius 29-10-2007 19:02:39

ZayDun y Egostrar, la verdad es que tengo una conexión DialUp y ver ese video me demoraría muchísimo.
Si me pueden explicar o resumir el video sería fabuloso.

Bueno... yo me estaba imaginando un algoritmo que trate de usar la menor cantidad de valores y operaciones.

Por ejemplo:
1.Tomar los 2 numeros mayores.
2. Si la multiplicación entre ellos es mayor, descartar al segundo mayor.
2.1. Repetir paso 2 con el tercer numero mayor
2.2. Si no es mayor y la diferencia entre el resultado y dicha multiplicación es menor o igual a algún valor, añadir estos tres números a la lista de los numeros validos

Etc...

Es decir ir descartando números lo más rápido posible probando primero la multiplicación ya que se trata de la manera más rápida de obtener una cifra más elevada. Y a medida que la cifra se va acercando al valor, ir optando por otras operaciones como la suma y la resta.
Obviamente que se considería la división en casos de que haya numeros superiores al resultado...

Creo, y tengo entendido, que existe un algoritmo que implementa algo así. Pero desconozco su nombre.

No se si sirve lo que digo y será de ayuda.:(:confused:
Saludos,

marcoszorrilla 29-10-2007 19:12:50

Creo que lo que trata de implementar según ya se ha apuntado es algo para resolver los problemas del tipo "cifras y letras", por supuesto en lo tocante a cifras.

El problema es que conocemos todo, menos las operaciones a realizar, incluso en algunos caso el problema no tiene solución y se trata de acercarse lo más posible al número pedido.

1.- Sumar todos los números.
2.- Sumar los pares, (me refiero de la lista dada) y restarle los impares.
3.- Sumar todos menos uno, dividir por este último.
4.- Multiplicar y dividir.....

Contra más combinaciones de operaciones más nos acercaremos.

Al final de cualquiera de estas elucubraciones, comparamos con el número pedido, si lo encontramos, bien, sino guardamos los resultados obtenidos y las operaciones correspondientes y los ordenamos.

Es una idea.

Un Saludo.

ixMike 29-10-2007 21:30:33

¿Y qué tal probando con todas las combinaciones posibles?

Primero, con un método que te las genere todas, y después otro que las compruebe (realice las operaciones). En fin, esto ya parece más sencillo. Para generar las combinaciones, bucles for dentro de bucles for dentro de bucles for..... ¡que me buclo!. Y después, guardadas todas las posibilidades en un TStringList o similar, pues un método que recorra todos los items, y que realice las operaciones.

Saludos

P.D.: Si eso, intento hacerlo, y si lo logro, pues cuelgo el código.

P.P.D.: ¿y si lo hacemos más interesante?.... ¡El último que lo logre es un programador en.... (¿es aquí donde hay que decir VB?)!

ixMike 29-10-2007 22:01:34

Bueno, ya tengo la primera parte, que es generar todas las combinaciones. En total salen 40.000, claro que, como contaba con la posibilidad de no necesitar todos los números, añado a la lista de números el cero, por lo que sale alguna que otra posibilidad absurda, como dividir entre cero (más de una vez). El hecho de que salga el cero una suma o una resta indica que (si al final el resultado de la operación es el buscado) no se ha utilizado todos los números para hacer el cálculo.

Colocad 4 edits (donde se pondrán los números), un botón, un memo llamado combinaciones (donde aparecen las combinaciones) y un label (que indicará cuántas combinaciones salen),y colorcar este código en el evento onClick del botón.

Código Delphi [-]

procedure TForm1.Button1Click(Sender: TObject);
const
  opera = '+-*/';
var
  o1,o2,o3,  //distintos operadores
  n1,n2,n3,n4: integer;    //distintos números
  num: array[1..5]of integer;
  comb: string;
begin
combinaciones.clear;
combinaciones.Lines.BeginUpdate;
num[1]:=StrToInt(Edit1.text);
num[2]:=StrToInt(Edit2.text);
num[3]:=StrToInt(Edit3.text);
num[4]:=StrToInt(Edit4.text);
num[5]:=0; //Por si nos sobran números para obtener el resultado
for o1:=1 to 4 do
 for o2:=1 to 4 do
  for o3:=1 to 4 do
   for n1:=1 to 5 do
    for n2:=1 to 5 do
     for n3:=1 to 5 do
      for n4:=1 to 5 do
      begin
       comb:=IntToStr(num[n1])+opera[o1]+
             IntToStr(num[n2])+opera[o2]+
             IntToStr(num[n3])+opera[o3]+IntToStr(num[n4]);
    combinaciones.Lines.Add(comb);
    end;
   combinaciones.Lines.EndUpdate;
   label1.caption:='Combinaciones: '+IntToStr(combinaciones.lines.count);
end;


Ahora ya sólo falta el método que haga esas 40.000 operaciones y que compare el resultado....

ixMike 29-10-2007 22:10:02

Bueno, mejor visto, creo que se lo voy a dejar a marcoszorrilla, que yo me tengo que hacer la cena y llevo 33 horas sin dormir.

Saludos (a ver si cuando mañana venga a ver el hilo está ya resulto ;)).

marcoszorrilla 29-10-2007 22:20:02

Pues yo acabo de cenar y tanta operación me puede ir mal para el estómago, mejor lo dejamos así, a ver si viene un valiente y lo resuelve y mañana por la mañana todo se verá más claro....


Un Saludo.

ixMike 29-10-2007 22:49:48

Sí, será lo mejor, porque mientras saboreaba unas deliciosas hamburguesas (de las buenas, no de un fast food) me he dado cuenta de un fallo de mis generador de posibilidades, y es que al mecer ese cero por ahí, puede convertir el producto de tres números en cero. Lo que tenía que haber hecho es colocar el elemento neutro de la operación a realizar (cero para la suma y la resta, uno para el producto y la división).

En fin, pues eso, a ver si algún valiente, de otra franja horaria, se anima y tal... (que yo mañana tengo clases a las ocho).


Hasta mañana (y que mola eso de meter tanto bucle for).

Delphius 30-10-2007 06:26:11

Cita:

Empezado por marcoszorrilla (Mensaje 242111)
Pues yo acabo de cenar y tanta operación me puede ir mal para el estómago, mejor lo dejamos así, a ver si viene un valiente y lo resuelve y mañana por la mañana todo se verá más claro....


Un Saludo.

Pues a mi ya me hizo daño:( Me provocó dolores intestinales...
¿Valiente? La verdad es que hay que tener ganas de hacer algo como eso.
Estuve pensando un poco... puede que sea posible... si puedo y me sale el algoritmo lo posteo.

Cita:

Empezado por ixMike (Mensaje 242107)
Bueno, mejor visto, creo que se lo voy a dejar a marcoszorrilla, que yo me tengo que hacer la cena y llevo 33 horas sin dormir.

Saludos (a ver si cuando mañana venga a ver el hilo está ya resulto ;)).

Vale... a ver... quien lo resuelva se gana una cita con una de las damas invitadas a la despedida de soltero de Eduarcol;):p (si con eso no aumentan la productividad no sabría que cosa lo puede hacer:D)

Saludos,

ZayDun 30-10-2007 10:19:21

Una vez mas gracias por molestaros en averiguar la forma de hacerlo y pedir perdon por ocasionar problemas de dolor intestinal a usuarios del foro...supongo que Clubdelphi tendra seguro medico no? xD. Suerte a los valientes que decidan continuar ;)

egostar 30-10-2007 20:00:31

Hey, creo que aquí hay un bug........

En el post inicial se dijo esto:

Cita:

Empezado por ZayDun
Tenemos = 20 - 51 - 25 - 10
Resultado = 530

La solucion seria: 51 * 10 + 20

Pero......:rolleyes: no señor, nos está faltando el número 25.

La operación correcta sería:

Cita:

( (51 - 25) * 20 ) + 10 = 530
Salud OS :cool:

PD. Ahora solo hay que generar el algoritmo :D:D:D

Campilongo 30-10-2007 21:55:07

Respuesta a algoritmo
 
Esto solo es una idea, funciona si la cantidad de numeros es menor que 255.
Si tienes los números en el arreglo A, la Respuesta en la variable R, primero formas el conjunto S:

S:=[];
for i:=1 to N do
S:=S+[A[i]];

Después haces el ciclo:

for i:=1 to N do
if (A[i]<>0) and ((R div A[i]) in S) and ((R mod A[i]) in S) then
begin
M1:=A[i];
M2:=R div A[i];
M3:=R mod A[i];
break;
end;

La respuesta seria: M1 * M2 + M3 = R

Campilongo 30-10-2007 23:22:51

Respuesta a algoritmo
 
Se me olvido decir que no necesariamente tienes que tener menos de 255 numeros, porque puedes implementar tu propia funcion de pertenecia. Por ejemplo si tu funcion es

function Pertenece(X:integer;var A:ArrInt):boolean;


las preguntas ((R div A[i]) in S) and ((R mod A[i]) in S) pudieran ser reemplazadas por

Pertenece(R div A[i],A) and Pertence(R mod A[i],A)

y si tienes ordenado el arreglo A puedes hacer una funcion prentece eficiente.

Saludos,

ixMike 31-10-2007 18:25:04

Cita:

Empezado por egostar (Mensaje 242368)
Pero......:rolleyes: no señor, nos está faltando el número 25.

Bueno, en el programa "cifras y letras" (un concurso que echaban antes en la tele en España, en donde precisamente aparecía esta prueba) las reglas eran conseguir el número indicado (o el que más se acercase) utilizando los números que te daban a placer. No era necesario utilizarlos todos, aunque, claro, no te daban cuatro, sino seís...

estoy de vacaciones en mi pueblo, y a la semana siguiente tengo varios exámenes... pero pronto tendré un resultado... (espero que nadie se me adelante, parece que no se animan mucho, a mí me parece un ejercicio interesante).


Saludos.

ZayDun 31-10-2007 19:46:31

ixMike
Gracias por el interes que tienes para lograr conseguir ese algoritmo, yo seguire pendiente de los resultados y comentarte que aun esta el programa "Cifras y Letras"
pero es en una cadena comunitaria "Canal 2 Andalucia".


P.D Tu interes por ser el primero no tendra nada que ver con la dama invitada a la despedida no?... xD Saludos!

Delphius 01-11-2007 03:39:43

Hola ZayDun,
Yo todavía no logro darme un tiempo sorbe como pensarlo. Pero por otro lado... sería bueno podes escuchar tus ideas de como te imaginas resolver el problema.

Se que haz venido por una orientación, pero me estoy preguntando si lograste avanzar algo. Puede que podamos ayudarte a continuar desde donde te quedaste trabado. ¿Tienes algo de código con el que te podamos ayudar?

Saludos,

Ñuño Martínez 06-11-2007 13:58:03

Vale, llego tarde pero es que he estado de boda (mi hermanita la pequeña, que se ha hecho mayor ya... :D ).

Creo que nadie ha mencionado que pueden utilizarse matrices para la resolución de ecuaciones. De hecho es el método utilizado por Matlab y programas similares. A partir de estas matrices y mediante el calculo de determinantes y trasponiendo términos se puede ir reduciendo hasta obtener la solución o las soluciones. Por otro lado tenemos el "método de Karnaud" (ahora mismo estoy dudando de si se escribía así, porque no lo encuentro por ninguna parte) para la simplificación de expresiones lógicas, la cual es utilizada por los compiladores para optimizar el código en algunos casos y que puede utilizarse para simplificar muchas operaciones y algoritmos. Creo que tengo los apuntes de la universidad aquí mismo, pero transcribirlo sería un pelín largo y hoy estoy vago. :p;):D


La franja horaria es GMT +2. Ahora son las 09:02:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi