Simplificar Función Matematica

Iniciado por W0lFy, 5 Enero 2012, 09:59 AM

0 Miembros y 2 Visitantes están viendo este tema.

W0lFy

Hola muy buenas:

me gustaría simplificar estas dos funciones a una linea sola, he estado pensando y tiene que haber algun algoritmo que engoble a todas las condiciones.El ejercicio es sencillo de entender:

Tenemos numeros que estan coprendidos en el rango 31..254

aqui os dejo las funciones:

estan en VB
Código (vb) [Seleccionar]
Function sumaNumSucesion(num1 As Integer, num2 As Integer, min As Integer, max As Integer) As Integer
If num2 + num1 > max Then
   If (num1 + (num2 Mod (max - min))) Mod (max - min) < 31 Then
       sumaNumSucesion = num1 - ((max - min) - num2)
   Else
       sumaNumSucesion = (num1 + (num2 Mod (max - min))) Mod (max - min)
   End If
Else
   sumaNumSucesion = num1 + num2
End If
End Function

Function restaNumSucesion(num1 As Integer, num2 As Integer, min As Integer, max As Integer) As Integer
Dim numAux As Integer
If num1 - (num2 Mod (max - min)) < min Then
   restaNumSucesion = num1 - 31 + max - (num2 Mod (max - min))
   
Else
   restaNumSucesion = num1 - num2 Mod (max - min)
End If
End Function


me gustaria dejarlas asi:

Código (vb) [Seleccionar]
Function restaNumSucesion(num1 As Integer, num2 As Integer, min As Integer,max as integer)
restaNumSucesion=?????????
end function

Function sumaNumSucesion(num1 As Integer, num2 As Integer, min As Integer,max as integer)
sumaNumSucesion=?????????
end function


para mi es mas un reto Matemático, no consigo el algoritmo que engoble a todas las condiciones, he estado jugando con mod y div(entera) y an asi no logro encontrar el algoritmo. Un saludo Espero haberme explicado bien. Gracias!! ::)
K@NuT0

W0lFy

Bueno para los que os interese.... aunque solo es orgulllo propio aqui dejo la funcion Suma y mas tarde hare la de resta:

Código (vb) [Seleccionar]
Function SumaNumSucesion2(num1 As Integer, num2 As Integer, min As Integer, max As Integer) As Integer
    SumaNumSucesion2 = (num2 + num1) * (1 - Int((num1 + num2) / (max + 1))) + ((num1 - (224 - num2)) * (Int((num1 + (num2 Mod 224)) / (max + 1))) + ((num1 + (num2 Mod (max - min + 1))) Mod (max - min + 1)) * (1 - Int((num1 + (num2 Mod (max - min + 1))) / ((max - min + 1) + 1)))) * Int((num1 + num2) / (max + 1))
End Function
K@NuT0

[Case]

A mi me interesa este tipo de retos  ;D, pero no se nada de Visual Basc, puro Java.

La función sumaNumSucesion que es lo que hace en si?.
Supongo que con una pequeña explicación me bastaría.

BlackZeroX

Cita de: ¤¤¤K@NuTöM@N¤¤¤ en  5 Enero 2012, 09:59 AM
Hola muy buenas:

me gustaría simplificar estas dos funciones a una linea sola, he estado pensando y tiene que haber algun algoritmo que engoble a todas las condiciones.El ejercicio es sencillo de entender:

Tenemos numeros que estan coprendidos en el rango 31..254

aqui os dejo las funciones:

estan en VB
Código (vb) [Seleccionar]
Function sumaNumSucesion(num1 As Integer, num2 As Integer, min As Integer, max As Integer) As Integer
If num2 + num1 > max Then
    If (num1 + (num2 Mod (max - min))) Mod (max - min) < 31 Then
        sumaNumSucesion = num1 - ((max - min) - num2)
    Else
        sumaNumSucesion = (num1 + (num2 Mod (max - min))) Mod (max - min)
    End If
Else
    sumaNumSucesion = num1 + num2
End If
End Function

Function restaNumSucesion(num1 As Integer, num2 As Integer, min As Integer, max As Integer) As Integer
Dim numAux As Integer
If num1 - (num2 Mod (max - min)) < min Then
    restaNumSucesion = num1 - 31 + max - (num2 Mod (max - min))
   
Else
    restaNumSucesion = num1 - num2 Mod (max - min)
End If
End Function


me gustaria dejarlas asi:

Código (vb) [Seleccionar]
Function restaNumSucesion(num1 As Integer, num2 As Integer, min As Integer,max as integer)
restaNumSucesion=?????????
end function

Function sumaNumSucesion(num1 As Integer, num2 As Integer, min As Integer,max as integer)
sumaNumSucesion=?????????
end function


para mi es mas un reto Matemático, no consigo el algoritmo que engoble a todas las condiciones, he estado jugando con mod y div(entera) y an asi no logro encontrar el algoritmo. Un saludo Espero haberme explicado bien. Gracias!! ::)

Pero dinos que es lo que haces realmente...

Dulces Lunas!¡.
The Dark Shadow is my passion.

W0lFy

Perdon por retrasarme. Siento revivir temas antiguos no he tenido mucho tiempo de pasarme por el foro. Os pongo la función y os digo que hace:


Código (VB) [Seleccionar]

Function SumaNumSucesion(num1 As Integer, num2 As Integer, min As Integer, max As Integer) As Integer
    Dim condicion As Integer
    Dim condicion2 As Integer
    Dim condicion3 As Integer
    Dim condicion4 As Integer
    Dim condicion5 As Integer
    Dim calculo As Integer
    Dim calculo2 As Integer
    Dim calculo3 As Integer
    Dim calculo4 As Integer
    condicion = Int(num1 / (max - min + 1)) ' 0 si num1 es mayor de 224
    condicion2 = Int(num2 / (max - min + 1)) ' 0 si num2 es mayor de 224
    condicion3 = Int((num1 + num2) / (max + 1)) '0 si num2+num1 es mayor de 255
    condicion4 = Int((num1 + (num2 Mod (max - min + 1))) / (max + 1)) '
    condicion5 = ((1 - Int(num1 / (max - min + 1))) * (Int(num2 / (max - min + 1))) + (Int(num1 / (max - min + 1))) * (1 - Int(num2 / (max - min + 1))))
    calculo = num1 + num2
    calculo2 = num1 - (max - min + 1 - num2)
    calculo3 = (num1 + (num2 Mod (max - min + 1))) Mod (max - min + 1)
    calculo4 = num1 + (num2 Mod (max - min + 1))
    SumaNumSucesion = (calculo) * (1 - condicion3) + ((calculo2) * (condicion5) + ((calculo3) * (condicion4) + (calculo4) * (1 - condicion4)) * (1 - condicion5)) * (condicion3)
End Function




Function restaNumSucesion(num1 As Integer, num2 As Integer, min As Integer, max As Integer) As Integer
    Dim condicion As Integer
    Dim condicion2 As Integer
    Dim condicion3 As Integer
    Dim condicion4 As Integer
    Dim calculo As Integer
    Dim calculo2 As Integer
    Dim calculo3 As Integer
    Dim calculo4 As Integer
    condicion = Int((num1 - num2 + (max - min + 1)) / (max + 1)) 'num 1 - num2 >31 = 1 si cierto
    condicion2 = Int(num2 / (max - min + 1)) ' 0 si es menor de 224
    condicion3 = Int(((num1 - (num2 Mod (max - min + 1)) + (max - min + 1))) / (max + 1))
    calculo = num1 - num2
    calculo2 = max + 1 - (num2 - (num1 - min))
    calculo3 = num1 - (num2 Mod (max - min + 1))
    calculo4 = max + 1 - (num2 Mod (max - min + 1) - (num1 - min))
    restaNumSucesion = (1 - condicion2) * ((calculo) * (condicion) + (calculo2) * (1 - condicion)) + (condicion2) * ((condicion3) * (calculo3) + (1 - condicion3) * (calculo4))
End Function



Bueno Decidí meterlo en variables para que el código fuera mas legible.
Estuve realizando un algoritmo de cifrado de cadenas de texto y se me ocurrio la idea de realizar los siguiente( no se si ya existirá en la actualidad, supongo que si...)


Código (vb) [Seleccionar]

Public Function jrgStringToString(cadena As String) As String
    Dim i As Integer
    cadenaAux = ""
    Dim num1 As Integer
    Dim num2 As Integer
    Dim min As Integer
    Dim max As Integer
    min = 31
    max = 254
    Dim caracter1, caracter2 As String
    Dim mitad As Long
    mitad = Len(cadena) / 2
    For i = 1 To mitad Step 1
        caracter1 = Mid(cadena, i, 1)
        caracter2 = Mid(cadena, i + Len(cadena) / 2, 1)
        num1 = Asc(caracter1)
        num2 = Asc(caracter2)
        cadenaAux = cadenaAux & Chr(restaNumSucesion(num1, num2, min, max))
    Next
    jrgStringToString = cadenaAux
End Function


Código (vb) [Seleccionar]


Public Function stringToJrgString(cadena As String) As String
Dim i As Long
Dim max As Integer
Dim min As Integer
Dim num1 As Integer
Dim num2 As Integer
Dim cadenaAux As String
Dim cadenaAux2 As String
Dim NumAleatorio As Integer
min = 31
max = 254
cadenaAux = ""
cadenaAux2 = ""
For i = 1 To Len(cadena)
     NumAleatorio = aleatorio(Mid(cadena, i, 1))
     num1 = Asc(Mid(cadena, i, 1))
     cadenaAux = cadenaAux & Chr(SumaNumSucesion(num1, NumAleatorio, min, max))
     cadenaAux2 = cadenaAux2 & Chr(NumAleatorio)
Next
stringToJrgString = cadenaAux & cadenaAux2
End Function




Public Function aleatorio(caracter As String) As Integer
    Call Randomize
    Dim NumAleatorio As Integer
    NumAleatorio = Int((254 - 31) * Rnd() + 31)
    aleatorio = NumAleatorio
End Function


El código es simple lo que hace es que una cadena ya sea "hola que tal".
Recorre la cadena por caracter y va haciendo lo siguiente:

stringtoJRGstring():
cadena1resultado=asc(h) & asc(o) & asc(l) &....asc(l)
cadena2resultado=chr(asc(h)+ numAleatorio)
stringtoJRGstring=cadena1resultado & cadena2resultado


jrgstringtoString():  divide la cadena en 2 cadenas ya que será par. la primera cadena son los caracteres y la segunda cadena  pasada a ascci son los numeros que le tenemos que restar a su caracter, para que nos devuelva su verdadero valor en caracter.

PD. No se si ya existiría por algún lado, se me ocurrio y lo programe. Si teneis alguna duda preguntarme no se si me habré explicado bien. Un saludo



K@NuT0