elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Pequeño reto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pequeño reto  (Leído 4,563 veces)
pkj

Desconectado Desconectado

Mensajes: 59



Ver Perfil
Pequeño reto
« en: 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
  1. Function DimeQueHago(ByVal Valor1 As Long, ByVal Valor2 As Long, Trits As Integer) As Long
  2.  Dim Acu As Integer
  3.  Dim Bloque As Long
  4.  Dim Bloque2 As Long
  5.  Valor1 = Valor1 + 1 ' yo lo uso sin
  6.  Valor2 = Valor2 + 1 ' estas 2 lineas
  7.  If Valor2 > Valor1 Then
  8.    Valor1 = Valor1 Xor Valor2
  9.    Valor2 = Valor1 Xor Valor2
  10.    Valor1 = Valor1 Xor Valor2
  11.  End If
  12.  Bloque = (3 ^ Trits) / 3
  13.  Do Until Bloque = 1
  14.    Bloque2 = Bloque * 2
  15.    If Valor1 > Bloque2 Then
  16.      Valor1 = Valor1 - Bloque2
  17.      If Valor2 > Bloque2 Then
  18.        Valor2 = Valor2 - Bloque2
  19.      Else
  20.        Acu = Acu + 1
  21.        If Valor2 > Bloque Then Valor2 = Valor2 - Bloque
  22.      End If
  23.      GoTo Sort
  24.    End If
  25.  
  26.    If Valor1 > Bloque Then
  27.      Valor1 = Valor1 - Bloque
  28.      If Valor2 > Bloque Then
  29.        Valor2 = Valor2 - Bloque
  30.      Else
  31.        Acu = Acu + 1
  32.      End If
  33.    End If
  34. Sort:
  35.    If Valor2 > Valor1 Then
  36.      Valor1 = Valor1 Xor Valor2
  37.      Valor2 = Valor1 Xor Valor2
  38.      Valor1 = Valor1 Xor Valor2
  39.    End If
  40.    Bloque = Bloque / 3
  41.  Loop
  42.  If Valor1 = Valor2 Then
  43.  Else
  44.    Acu = Acu + 1
  45.  End If
  46.  
  47.  DimeQueHago = Acu
  48.  
  49.  
  50. End Function
  51.  

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?


« Última modificación: 15 Junio 2015, 20:19 pm por pkj » En línea

pkj

Desconectado Desconectado

Mensajes: 59



Ver Perfil
Re: Pequeño reto
« Respuesta #1 en: 16 Junio 2015, 20:34 pm »

Para los que quieran intentarlo, aquí os dejo una pista.

Esta es su hermanita pequeña. La otra me costó más sacarla (que borrico).

Código
  1. Function DimeQueHagoB(ByVal Valor1 As Long, ByVal Valor2 As Long, Bits As Integer) As Integer
  2.  Dim Valor3 As Long
  3.  Dim F As Integer
  4.  
  5.  Valor3 = (Valor1 Xor Valor2)
  6.  
  7.  For F = 0 To Bits - 1
  8.    If Valor3 And (2 ^ F) Then DimeQueHagoB = DimeQueHagoB + 1
  9.  Next F
  10.  
  11. End Function
  12.  

Las dos las tengo ya mejoradas reemplazando las operaciones mas gordas por sus resultados.
Mas código pero más velocidad.

Espero que con esto al menos sepáis lo que son los Trits :D

Saludos


En línea

pkj

Desconectado Desconectado

Mensajes: 59



Ver Perfil
Re: Pequeño reto
« Respuesta #2 en: 6 Julio 2015, 10:15 am »

Vaya decepción. Parece que ni siquiera lo habéis intentado.

Lo explicaré brevemente para no haceros perder vuestro tiempo. Las hice para un programa de reducciones 1X2.

La segunda función, la pequeña, compara 2 números binarios a partir de sus equivalentes decimales y devuelve las diferencias. Compara 2 dobles a partir de sus números de orden.

La primera función, la grande, hace lo mismo pero con 2 valores que representan dos potencias de 3. Compara 2 triples.

Las dos se pueden mejorar mucho, pero no voy a entrar en detalles.

Saludos
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Pequeño reto
« Respuesta #3 en: 6 Julio 2015, 18:54 pm »

Lo que hace es contar los bits encendidos de la diferencia de los bits de dos valores.

Código
  1. Function DimeQueHagoB(ByVal Valor1 As Long, ByVal Valor2 As Long, Bits As Byte) As Integer
  2. Dim lV3 As Long
  3. Dim iCount As Byte
  4.  
  5. lV3 = (Valor1 Xor Valor2)
  6.  
  7. if lV3 = 0 Then exit function
  8.        REM {
  9. No recuerdo si es 32 o 64 dejo 32...
  10. }
  11. If (Bits > 32) Then Bits = 32
  12.  
  13. For iCount = 1 to Bits
  14. REM {
  15. No recuerdo si para dividir y tener un valor entero es \ o / :(
  16. }
  17. lV3 = lV3 \ 2
  18. If (lV3 And &H1) Then
  19. DimeQueHagoB = DimeQueHagoB + 1
  20. Else If (lV3 = 0) Then
  21. Exit Function
  22. End If
  23. Next iCount
  24. End Function
  25.  

P.D.: No tengo compilador :(.

Dulces Lunas!¡.
« Última modificación: 6 Julio 2015, 19:08 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
pkj

Desconectado Desconectado

Mensajes: 59



Ver Perfil
Re: Pequeño reto
« Respuesta #4 en: 6 Julio 2015, 20:27 pm »

Buen trabajo, BlackZeroX, algo tarde pero muy bueno.

Solo he tenido que retocarla un pelín y es mucho mas rápida que la de muestra.
Parece incluso más rápida que la más rápida que he hecho yo :P

Código
  1. Function DimeQueHagoB(ByVal Valor1 As Long, ByVal Valor2 As Long, Bits As Byte) As Integer
  2.  
  3.  Dim lV3 As Long
  4.  
  5.  Dim iCount As Byte
  6.  
  7.  lV3 = (Valor1 Xor Valor2)
  8.  
  9.  If lV3 = 0 Then Exit Function
  10.  
  11.  If (Bits > 32) Then Bits = 32
  12.  
  13.  For iCount = 1 To Bits
  14.  
  15.    If (lV3 And &H1) Then
  16.  
  17.      DimeQueHagoB = DimeQueHagoB + 1
  18.  
  19.    ElseIf (lV3 = 0) Then
  20.  
  21.      Exit For
  22.  
  23.    End If
  24.  
  25.    lV3 = lV3 \ 2
  26.  
  27.  Next iCount
  28.  
  29. End Function
  30.  

En VB6 un Long tiene 32 bits, en VB.Net creo que son 64

¿Veis los demás como solo era ponerse?

Saludos
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Pequeño reto
« Respuesta #5 en: 6 Julio 2015, 22:34 pm »


¿Veis los demás como solo era ponerse?


Si gustas retos aquí tienes:

http://foro.elhacker.net/programacion_visual_basic/recopilacion_de_retos_vbclassic_por_79137913-t360748.0.html;msg1743290#msg1743290

Si puedes superar esta te ganas mi respeto :).

IsNumeric_????

Version VB6
http://foro.elhacker.net/programacion_visual_basic/reto_reemplazo_de_funcion_isnumeric-t336067.0.html;msg1652210#msg1652210
Version en C:
http://foro.elhacker.net/programacion_cc/cisnumeric_vb6_a_c-t336564.0.html;msg1652677#msg1652677

Dulces Lunas!¡.
« Última modificación: 6 Julio 2015, 22:36 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
pkj

Desconectado Desconectado

Mensajes: 59



Ver Perfil
Re: Pequeño reto
« Respuesta #6 en: 7 Julio 2015, 09:55 am »


Es lo que me animó a poner el reto.
Estuve mirando, e incluso he comentado algo, pero en general acabo mareado si intento descifrar los codigos :P
Trabajais con cosas que nunca he visto o que no entiendo y me hago un lio.

Si puedes superar esta te ganas mi respeto :).

He echado un vistazo y me parece que teneis el tema bien trillado. No creo que se me ocurra nada nuevo. Ni siquiera he usado nunca esa función IsNumeric :D
De todos modos, al menos lo voy a pensar. Igual salta la liebre.

Saludos
En línea

pkj

Desconectado Desconectado

Mensajes: 59



Ver Perfil
Re: Pequeño reto
« Respuesta #7 en: 7 Julio 2015, 10:29 am »

Algo debo estar haciendo mal, porque mi nombre no aparece en la lista de errores  :o

Código
  1. Private Function IsNumeric_PKJ(Cadena As String) As Boolean
  2.  Dim Valor As Variant
  3.  On Error GoTo Error1
  4.  Valor = CDbl(Cadena)
  5.  IsNumeric_PKJ = True
  6. Error1:
  7. End Function

O eso o 7913+pkj = 1Genius
EDIT: No, ahora me estoy fijando que 7913 no necesita socios :D
Su nombre tampoco aparece en la lista de fallos.
EDIT2:
En realidad hemos pensado lo mismo pero al revés.
Supongo que parece que lo he copiado, pero ha sido pura casualidad.
Intentaré buscar otro modo, aunque ya digo que esto esta muy trillado.

EDIT3:
Lo siento. Solo se me ocurren variantes de lo mismo.
Si lo que quiero es saber si es un número no se me ocurre nada mejor que esto, y ya que funciona creo que me conformaré:

Código
  1. Private Function IsNumeric_PKJ(Cadena As String) As Boolean
  2.  On Error GoTo Error1
  3.  If CDbl(Cadena) = 0 Or CDbl(Cadena) <> 0 Then IsNumeric_PKJ = True
  4. Error1:
  5. End Function
  6.  

Por cierto, pensaba que ninguna funcion superaba el test y resulta que hay varias que tampoco dan errores, solo que como no dan errores pasan desapercibidas y no lo habia notado. Por eso cuando me ha funcionado a la primera no me lo creia.
Copie la funcion de 7913 para evitarme escribir el encabezado y cuando vi que era parecida a lo que queria hacer, pense que habia mejorado esa funcion, cuando de por si ya funcionaba.
En fin, creo que darle mas vueltas es complicarse la vida.

Saludos
« Última modificación: 7 Julio 2015, 11:25 am por pkj » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Pequeño reto
« Respuesta #8 en: 7 Julio 2015, 22:16 pm »

Como demonio borro mi msg ...

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
79137913


Desconectado Desconectado

Mensajes: 1.169


4 Esquinas


Ver Perfil WWW
Re: Pequeño reto
« Respuesta #9 en: 21 Agosto 2015, 19:54 pm »

HOLA!!!

XD estaban hablando de mi y mi reto...

Black lo gano bien ganado no hay mucho que hacer ni mucho que inventar XD  :silbar:

GRACIAS POR LEER!!!
En línea

"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

 79137913                          *Shadow Scouts Team*
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pequeño reto de crypto
Ingeniería Inversa
ViKT0RY 8 4,651 Último mensaje 20 Octubre 2004, 11:42 am
por mikel
Pequeño reto crackme
WarZone
idzen 3 3,264 Último mensaje 15 Junio 2013, 18:06 pm
por EscritoEstáSatanás
Quisiera proponer un pequeño reto
Desafíos - Wargames
crazykenny 1 4,140 Último mensaje 7 Junio 2014, 12:20 pm
por grayFox1
Pequeño reto para los usuarios más curiosos « 1 2 »
Desafíos - Wargames
Mad Antrax 10 12,260 Último mensaje 28 Octubre 2015, 16:49 pm
por torelio
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines