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
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:
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!! ::)
Bueno para los que os interese.... aunque solo es orgulllo propio aqui dejo la funcion Suma y mas tarde hare la de resta:
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
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.
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
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:
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!¡.
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:
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...)
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
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