Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - pkj

#1
Programación Visual Basic / Pequeño reto
13 Junio 2015, 21:52 PM
Quiero proponeros una adivinanza y un reto:

Adivinanza: ¿Que hace esta función que he inventado?
Os dejo las variables con nombres descriptivos para que podais seguirla mejor.
Los mas iniciados seguro que lo adivinan en un vistazo y se ríen de mis métodos.
El caso es que a veces se me enciende la bombilla, pero parpadea mucho :P

Reto: Mejorar esta función. Fácil.

No es que tenga demasiado interés en que sea más rápida, aunque me gustaría ver el sistema que usaría alguien con conocimientos de matemáticas (o igual hay una API para esto :D). Yo en el colegio nunca presté atención :(

He pensado que son dos buenos retos.

Espero que os animéis muchos.
Si se me ocurre como, yo también la intentaré mejorar (bueno, mas rápido ya se me está ocurriendo: puedo quitar los xor si copio 2 veces el código... o quizás no).

Haced vuestras propias versiones una vez que sepais lo que hace.

Código (vb) [Seleccionar]

Function DimeQueHago(ByVal Valor1 As Long, ByVal Valor2 As Long, Trits As Integer) As Long
 Dim Acu As Integer
 Dim Bloque As Long
 Dim Bloque2 As Long
 Valor1 = Valor1 + 1 ' yo lo uso sin
 Valor2 = Valor2 + 1 ' estas 2 lineas
 If Valor2 > Valor1 Then
   Valor1 = Valor1 Xor Valor2
   Valor2 = Valor1 Xor Valor2
   Valor1 = Valor1 Xor Valor2
 End If
 Bloque = (3 ^ Trits) / 3
 Do Until Bloque = 1
   Bloque2 = Bloque * 2
   If Valor1 > Bloque2 Then
     Valor1 = Valor1 - Bloque2
     If Valor2 > Bloque2 Then
       Valor2 = Valor2 - Bloque2
     Else
       Acu = Acu + 1
       If Valor2 > Bloque Then Valor2 = Valor2 - Bloque
     End If
     GoTo Sort
   End If

   If Valor1 > Bloque Then
     Valor1 = Valor1 - Bloque
     If Valor2 > Bloque Then
       Valor2 = Valor2 - Bloque
     Else
       Acu = Acu + 1
     End If
   End If
Sort:
   If Valor2 > Valor1 Then
     Valor1 = Valor1 Xor Valor2
     Valor2 = Valor1 Xor Valor2
     Valor1 = Valor1 Xor Valor2
   End If
   Bloque = Bloque / 3
 Loop
 If Valor1 = Valor2 Then
 Else
   Acu = Acu + 1
 End If

 DimeQueHago = Acu


End Function


Lo dicho. Animaos y usad el coco un poco.

Saludos

EDIT:

¿que pasa?
¿no os interesa?
¿estáis deliberando?
¿me he pasado con el reto?
Igual no es tan fácil como pensé.
¿queréis que diga la solución?
¿queréis una pista?