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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 ... 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 [400] 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 ... 432
3991  Seguridad Informática / Seguridad / Re: ejecución de código al abrir un archivo de Word? en: 22 Mayo 2017, 02:11 am
Una macro son acciones ejecutables preestablecidas.
Si paras el vídeo hacia el crono: 1'21, podrás ver parte del código de la macro.

Aquí tienes la especificación de word, y otros formatos de Office (la descarga de todos, última versión son 82Mb.):
https://msdn.microsoft.com/en-us/library/office/cc313153(v=office.12).aspx
3992  Foros Generales / Foro Libre / Re: IBM revela su procesador cuántico más potente en: 22 Mayo 2017, 01:57 am
Quita la tilde a la "a" en "cuántico" y funcionará el enlace...

Que, qué se puede hacer con 16Qubits?. Pués probar que funciona bien y servir de base para ir mejorando.

Una nave espacial no se construyó de la nocha a la mañana, primero, se empezó con las alas de cera de Ícaro... (quién sabe si fue algo más que mitología), y hasta los hermanos Mongolfier con su globo, o los Wright con su aeroplano, ha llovido mucho... luego se ha corrido más en muy poco tiempo.
Así suele suceder con todo, al principio los pasos son lentos y cortos, cuando se empieza a conocer como funciona y la tecnología da para construirlo, es cuando se produce una expansión rápida y dilatada.
3993  Seguridad Informática / Seguridad / Re: Como han podido hackearme? en: 21 Mayo 2017, 21:47 pm
No solo uede ser que hayas entrado desde un cyber (por ejemplo), también podría ser que tu contraseña sea la típica 123456, o el nombre de tu perro?
3994  Programación / ASM / Re: Ejercicio ensamblador en: 21 Mayo 2017, 18:37 pm
Un número negativo, es una convención de acuerdo.
Aunque pueden proveerse diferentes formas de usar números negativos, al comienzo del diseño de la lógica del hardware, se vio claro que:
 x - x = 0
 0 - 1 = -1
 -1 + 2 =1
 1 - 1 = 0
Luego en binario debería ser igual... entonces se encontró que la forma de hacelro igual es que el último bit (el de más peso), tiene la función asignada del signo.
Así, éste valor: 1111.1111 puede significar 2 valores
si no admite números negativos es 255, pero si es un número negativo, será -1
Por tanto que sea positivo o negativo, depende del tipo de datos declarado. Sin más datos al respecto (por ejemplo podríamos estar trabajando con datos BCD) lo más que se puede hacer es verificar el bit de más peso.

Hay varias maneras... una podría ser haciendo desplazamiento (o rotaciones) a la izquierda (multiplicar por 2) y consultar luego el banderín de Acarreo (incluso el de desbordamiento). Si hubo acarrero, es porque es ebit estaba a 1, por tanto es negativo.
Código
  1. MOV al, Valor
  2. SAL al, 1  <--- desplazamiento aritmetico a la izquierda (1bit)
  3. JC Negativo
  4.  --> Es positivo
  5. RET
  6. Negativo:
  7.  --> Es negativo
  8. RET
  9.  
  10.  
También se puede hacer con RCL, RCR, ROL y ROR, pero tienes que controlar que contiene previamente el acarrero. en cualquier caso, el registro afectado (al), queda modificado... Estudia el comportamiento (condiciones) de los banderines de acarreo y desbordamiento en este tipo de operaciones: Rotaciones y Desplazamientos.

Otra forma es comparar el bit 7 del valor con un valor inmediato que tiene ese bit a 1 y el resto a 0, es decir con 128
Código
  1. MOV al, Valor
  2. TEST al, 128 <--- ¿Esta activado el bit 7 del registro 'al'?
  3. JNZ Negativo
  4.  --> Es positivo
  5. RET
  6. Negativo:
  7.  --> Es negativo
  8. RET

El segundo método es superior, por su sencillez. La ventaja del 2º método sobre el primero, es que el 2º, no modifica el estado del registro 'al', en el 1º, se ha multiplicado por 2 y como operamos con un byte, si era negativo, el valor queda truncado (el valor de ese bit se conserva en el banderín, por si se precisa).

Para devolver una llamada a una función usas RET x (Retorno, Return, x es un parámetro opcional que se suma al registro SP, para descartar parámetros de llamada), y para Salir, se usan directivas end: END, END modulo, ENDM para fin de una macro... etc... esto puede variar ligeramente según el ensamblador usado, pero varían poca cosa entre sí.
Código
  1. ProcA Proc FAR
  2. ...
  3. ...
  4. Ret
  5. ProcA ENDP <---- fin del procedmientoA
3995  Foros Generales / Noticias / Re: IoT: La tecnología que promete cambiar al mundo conectándolo todo a Internet en: 21 Mayo 2017, 16:48 pm
Conectar cada aparato electrónico a Internet, nos hará más esclavos de lo que ya somos...

En razonable que determinadas cosas conectadas a Internet, facilitarán muchísimo las cosas, pero no veo ningún motivo para conectar una cafetera a Internet. Ya sé, que el vendedor (que por ello reclamará 10 veces lo que cuesta una cafetera sin conexión a internet, y ahí radica todo su interés), te dirá que así cuando se acabe el café, puede ahcer el pedido por tí... Incluso así, sería más fácl que la cafetera, simplemente se conectara a tu móvil y pusiera en tu lista de la compra: café = cero patatero... no hace falta nada más... tampoco hace falta que desede internet se controle la temeperatura o el tiempo que ha de estar la cafetera encendida, de verdad que no...

Ya me veo en un futuro no muy lejano, 'enjaulando' todos los dispositivos electrónicos caseros que NO NECESITAN ninguna conexión a Internet para absolutamente nada.
3996  Foros Generales / Foro Libre / Re: Parece que Corea del Norte está detrás de WannaCry en: 21 Mayo 2017, 13:56 pm
El problema al que se enfrenta un país que 'invada' Korea del norte, es que tras la 'liquidación', se encontraría de alguna manera forzado a mantener o facilitar un estado de transición hacia una democracia, pero al mismo tiempo (y he aquí el problema), asegurarse de mantener a la población una calidad de vida mínima que ahora mismo roza la pobreza extrema... pero por la que ahora mismo no pueden ni rechistar.

Vas a un sitio a solucionar un 'problema', y te encuentras que el trasfondo es exageradamente más grave que el problema que en principio parecía haber.

Después de todo, ir allí a "quitarle la Gameboy al niño gordito", no es para tanto, el verdadero problema sería luego atender a los millones de personas con graves carencias y que sin una democracia o un sometimiento como el actual, quién sabe por qué derroteros tirarían... sería fácil que surgieran luego muchos delincuentes.
Suele ocurrir cuando en un sitio, por robar un trozo de pan te cortan la mano, que si luego no te cortan ni el pelo por robar a unos viejitos, da pie a una especie de "envalentonamiento", que hace que surjan delincuentes y odiadores como hongos... (aunque antes estuvieran a la sombra calladitos y acobardados).
3997  Programación / .NET (C#, VB.NET, ASP) / Re: WebBrowser Bot en Visual Basic en: 21 Mayo 2017, 13:43 pm
Los botones en una interfaz, están para que el usuario pulse y que precisamente el usuario sea consciente de que pulsa.

Modificar esa interacción entre el usuario y la interfaz, no es ético, por muy buenas intenciones que tengas con tu bot. Si el usuario decide pulsar "like", lo pulsa, si no quiere, no pulsa. Y es importante que sea así, para que no se falsifique su voluntad.

Un bot, tiene que limitarse a la realización de tareas tediosas, o complejas PERO necesarias, nunca a las tareas que le compete hacer SI O SI, al usuario, como es pulsar un botón... ejemplos:
- Un bot, podría tener encomendado hacer tu comida a las 3 de la tarde, pero nunca sería tarea suya obligarte con la cuchara a que te lo tragues.
- Un bot podría tener encomendado la tarea de recordarte que el domingo tienes cita para ir a casa de tu primo que es su cumpleaños incluso de indicarte la ruta en carretera por el coche, pero no de secuestrarte y lllevarte a la fuerza allí.
- Un bot, podría facilitarte ciertos aspectos sobre transacciones económicas, como recordarte que si haces esa compra te queda menos de x dinero en la cuenta, pero NUNCA obligarte a hacer la compra (o a hacerla por ti), solo porque hayas visitado la página...
- Un bot, podría sugerirte que escuches tal o cual canción si estás estresado, "porque te relaja", pero no debería ponértela "por C0J0N3X", sin consultarte...
- Un bot, podría ayudar a un piloto sobre tareas tediosas durante el vuelo (como recordar a los pasajeros tal o cual cosa, o señalar que si miran a su derecha, verán...), pero jamás hacer maniobras bruscas y menos si no está el piloto automático activado y/o el corazón del piloto parado (vamos que incluso con el piloto con un derrame cerebral, sería mejor avisar al copiloto, que tomar los mandos de la nave).
- Un bot, en un sistema de un silo de lanzamiento de misiles, podría tener encomendado como tarea simplemente revisar el buen estado y funcionamniento de pequeños subsistemas, pero JAMÁS otorgarle control sobre el 'botón de disparo'. ¿No crees???

Hay cosas que SIEMPRE debe hacer uno mismo, la delegación absoluta en automatizaciones lleva a derroteros altamente peligrosos.

No me parece ético lo que intentas, aunque quizás no te hayas parado a pensar donde están los límites de lo ético y lo no ético. Los ejemplos deberian darte una idea...
3998  Foros Generales / Noticias / Re: Las distros Linux no funcionarán en Windows 10 S en: 20 Mayo 2017, 23:06 pm

Debo de ser bobo, o algo falla.

No termino de entender el título.
Como alguien no me lo explique...
Te lo explico...  :silbar:

Si no se puede instalar alegremente software, eso incluye Linux (previamente Mocosoft, había anunciado que haría concesiones con Linux, pero no para esta versión concreta).

El título es un poco ...oso "escandaloso, ostentoso", y quizás se deba a que una noticia ha venido muy seguida de la siguiente. Si en la 1ª se anunciaban concesiones para Linux, y en la siguiente se dice, Aquí no... pués listo, hay quien saca punta al lápiz para poner título llamativo, para que los linuxeros, se lancen, puñal en dientes... (en resumen: una forma de conseguir visitas, solo por un título inapropiado).
3999  Seguridad Informática / Abril negro / Re: [Abril Negro] S.P.O.K (Simple Production Of Keys) en: 19 Mayo 2017, 03:00 am
Voy con la siguiente entrega...

En esta ocasión, trato las permutaciones con una clase que se llama recursivamente.
Otra clase (padre de ésta), hace la vez de bucle principal y es la que el cliente invoca externamente.

Como en el caso previo, se opera con cada carácter de una vez, por lo que igualmente aquí, cada carácter puede tener su propio alfabeto, exactamente en la smismas condiciones que el código del algoritmo previo.
En este caso además se provee la capacidad de establecer un estado inicial distinto del comienzo de la permutación. El código también resulta algo más elegante (que un montón de bucles FOR), sin embargo el rendimiento es menor, ya que la recursividad siempre es más lenta que la iteración, dado que con cada llamada, debe almacenarse en la pila el estado previo de la función de la que se sale.

En esta ocasión el código se muestra en 4 apartados:
- El de la interfaz del usuario (como respuesta a pulsar el botón). La ventana
- El de la clase instanciada desde la interfaz. clase cPermut
- El código en un módulo (compartido con el proyecto). módulo mComun
- El de la clase instanciada desde la clase pública. clase Ciclos


Respecto de la interfaz, es la misma que aparece en el mensaje previo (ver la imagen), solo que aquí se expone el código relativo al botón que aparece en el centro...

Código
  1. Public Class frm2 ' la ventana, formulario
  2.  
  3.    Private perm As New cPermut
  4.  
  5.   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.        Dim ClaveActual() As Byte, Min() As Byte, Max() As Byte
  7.        Dim z As Decimal
  8.  
  9.        ClaveActual = StringToByteArray(TextBox1.Text) ' Valor inicial: "ABXFD"
  10.        Min = StringToByteArray(TextBox2.Text)  ' Valor mínimo: Ejemplo: "AAAAZ"
  11.        Max = StringToByteArray(TextBox3.Text)  ' Valor final, Ejemplo: "ZWZZA
  12.  
  13.        z = perm.Enumerar(ClaveActual, Min, Max)
  14.    End Sub
  15. End Clasee
  16.  
El código es muy simple.
Una referencia a la clase que alberga la funcionalidad, y luego el trabajo del botón, donde convierte a un array de bytes los 3 textos que la función encargada de permutar requiere como parámetros: El valor inicial, el valor mínimo y el valor máximo (de las permutaciones, respectivamente). Finalmente se llama a a la función enumerar de la clase. Devuelve el número de permutaciones y como se decía en el mensaje previo, no es estrictamente necesario... podría devoverse simplemente un buleano.


Ahora vamos por el código de la clase cPermut:
Esta clase es pública y contiene a la otra anidada, así es privada para esta clase. Si un lenguaje no admite clases anidadas, no importa, basta ponerla al mismo nivel que esta clase, pero dejarla privada, para ser instaciada sólo a nivel de proyecto y listo...
El código d ela clase anidada, se pone aparte, para facilitar entender cada parte y por si uno tiene que ponerlo como clases sueltas e independientes (o hacer cambios cómodamente).
Código
  1. Public Class cPermut
  2.  
  3.    Public Enum ValoresDeIncremento
  4.        VALOR_DECREMENTO = -1
  5.        VALOR_INCREMENTO = 1
  6.    End Enum
  7.  
  8. #Region "Accesible para las clases 'Ciclo'. "
  9.    Private Shared Fin As Boolean ' Control de fin de la enumeración (mejor que forzar una comparación).
  10.    Private Shared SizeClave As Short  ' Tamaño de las claves (cantidad de caracteres que contienen)
  11.    Private Shared ClavePermutada() As Byte  ' Clave generada en bytes.
  12.  
  13.    Private Shared Max() As Byte ' En cada índice se deja el valor máximo.
  14.    '    Ejemplo: 78,78,78,78,78,78,78,78 --> Todos iguales.
  15.    '    Ejemplo: 45,37,22,65,90,90,90,90 --> Cada uno distinto.
  16.  
  17.    Private Shared Min() As Byte ' En cada valor se deja el valor mínimo.
  18.    '    Ejemplo: 00,00,00,00,00,00,00,00 --> Todos iguales.
  19.    '    Ejemplo: 00,18,05,22,12,12,00,08 --> Cada uno distinto.
  20.  
  21.    ' Establece datos operativos.
  22.    '  Establecer un tamaño, no necesariamente borra el previo.
  23.    Private Shared Sub EstablecerPuntoInicial(ByRef Abc() As Byte, ByRef vMax() As Byte, ByRef vMin() As Byte, Optional ByVal SinRepeticion As Boolean = False)
  24.        SizeClave = (Abc.Length - 2)
  25.        ClavePermutada = Abc
  26.        Max = vMax : Min = vMin
  27.        Fin = False
  28.    End Sub
  29. #End Region
  30.  
  31.    Private p_Ciclos As New Ciclos ' Crea una instancia de la clase anidada (privada)
  32.    Private Alfabeto As String
  33.    Private vMin() As Byte
  34.    Private vMax() As Byte
  35.    Private UltimaPalabra As String
  36.  
  37.  
  38.  
  39.    ' Enumera todas las permutaciones desde la combinación de entrada con los límites establecidos.
  40.    '  Devuelve el número de permutaciones totales
  41.    Public Function Enumerar(ByVal ClaveActual() As Byte, ByVal Min() As Byte, ByVal Max() As Byte) As Decimal
  42.        Dim z As Decimal, Crono As Single
  43.  
  44.        Crono = TimeOfDay.Ticks ' ticks a la hora actual
  45.  
  46.        z = CalcularNumPermutaciones(ClaveActual, Min, Max)
  47.        If (z < 0) Then
  48.            Return -1
  49.            Exit Function
  50.        End If
  51.  
  52.        ' Establece el estado inicial y final de las permutaciones
  53.        Call EstablecerPuntoInicial(ClaveActual, Max, Min) ', SinRepeticion)
  54.        ' Prepara los valores iniciales en cada clase 'ciclo'
  55.        p_Ciclos.SetEstadoInicial()
  56.  
  57.        ' Iniciar las permutaciones de entre los límites fijados
  58.        Do
  59.            p_Ciclos.Mutar()
  60.            ' Usar Permutación desde aquí:
  61.            ' call FuncionX(Permutacion)
  62.        Loop While (Fin = False)
  63.  
  64.        ' Devolver resultados
  65.        Enumerar = z
  66.        Crono = ((TimeOfDay.Ticks - Crono) / 10000000)  ' ticks a la hora actual, menos los de comienzo= ticks invertidos en la tarea.
  67.        MessageBox.Show("Tiempo: " & Crono.ToString & vbCrLf & "Permutaciones: " & z.ToString)
  68.    End Function
  69.  
Comentando el código:
- Primero aparece una enumeración, básicamente sirve para saber si el alfabeto para un carácter es creciente o decreciente, es decir, puede indicarse el alfabeto para un carácter tanto A-Z, como Z-A, en cuyo caso debe ser decrementado.
- Después delimitado en una region (una región no es código, solo es de carácter informativo, para agrupar código e indicar que está relacionado (por el comentario que se acompaña), aparecen varios campos "Private Shared", que señala que no son accesibles fuera d ela clase, pero que si son compartidos con las clases anidad que 'ésta' tuviere (de hecho tiene una, Ciclos...si se traduce a otro lenguaje y la clase ciclos debe quedar fuera, también este código debe quedar fuera y ser accesible tanto desde esta clase, como de cualquier instancia de Ciclos.
- En la misma región se ha incluído una función que establece el valor de esos campos. El detalle de esos valores se verá en la clase ciclos, ya que desde aquí sólo se establecen, no se opera con ellos.

- Luego llegamos a la función enumerar:
---- Como ya se explicó en el algoritmo previo (mensaje previo), pasando como parámetros los límites de la enumeración para cada carácter, es posible de forma sencilla delimitar el alfabeto, además para cada carácter (ver mensaje previo), en este además se adjunta un terce rparámetro, la claveActual desde donde continuar la permutación. Esto implica que podemos empezar donde queramos parar en la parte señalada como final, y en otra ocasión continuar desde donde se dejó y marcar otro punto como final...
---- Tras acceder a la función enumerar, lo primero es verificar que los parámetros son congruentes entre si, llamando a  la función CalcularNumPermutaciones(,,,), aunque ya la vimos más arriba esta es ligeramente distinta, es una sobrecarga de la otra... De entrada se exige que tengan el mismo tamaño (que define el tamaño de las claves que se generan, así:
Actual:   CCC
Minimo:   AAA
Maximo:   ZZZ
Declara que se van a generar claves de 3 caracteres, que para cada carácter su alfabeto será A-Z, y que la clave Inicial será CCC, por tanto se permutará desde esa clave.
Otro ejemplo:
Actual:  C0CCXXCC
Minimo:  A0AAZZAA
Maximo:   Z9ZZAAZZ
Declara que se van a generar claves de 8 caracteres, que cada carácter tiene su propio alfabeto, para algunas es de A-Z, para otras de Z-A y para otra es de 0-9
Además, dicha función verifica (y trunca si procede) que la clave actual está en el rango fijado para el alfabeto de cada carácter, si no es así, se trunca (se fuerza), al valor límite... es decir si se pone estos parámetros como entrada:
Actual:  AAA
Minimo: DDX
Maximo: ZZD
Dado que, inicio para los dos caracteres a la izquierda sean DD, trunca la clave actual para esos caracteres a DD, ya que AA, es menor que DD. Igualmente para el carácter a la derecha de la clave actual es Z, queda fuera de rango, pués empieza en  X y finaliza en D, y A es menor, pasa a valer truncada 'D', así la clave actual finalmente sería: DDD
El código de esta función va debajo de estos comentarios... 
---- Una vez validado los parámetros, se establecen los valores a los campos sobre los que la clase Ciclos, va a operar. Función: EstablecerPuntoInicial
---- Luego invoca a la clase ciclos, para establecer el estado inciial. Esto se explica más abajo al describir la clase Ciclos. (SetEstadoInicial)
---- Finalmente viene el bucle de enumeración, invocando un método de la clase Ciclos.Mutar , que hace la Permutación. Con cada llamada se genera una clave. Tras la vuelta, puede usarse la clave generada, luego si alcanzó el final de la permutación el bucle finaliza y se sale de la función.


Viene ahora el código de la sobrecarga de la función que verifica los parámetros de enumerar... se acaba de describir suficientemente ya el código de esta función:
Código
  1. Module mComun
  2.  
  3. ' nota: ya hay una función del mismo nombre muy similar, pero con solo dos parámetros, cuyo código está más arriba, en otro mensaje...
  4.  
  5. ''' <summary>
  6.    ''' Calcula el número de permutaciones totales. Y garantiza que la clave actual esté dentro del rango, truncándolo cuando sea preciso.
  7.    ''' </summary>
  8.    ''' <param name="ClaveActual">Fija la clave actual de comienzo, dentro del rango.</param>
  9.    ''' <param name="Min">Define el valor mínimo para cada carácter.</param>
  10.    ''' <param name="Max">Define el valor máximo para cada carácter.</param>
  11.    ''' <returns>El número de permutaciones totales. Un valor negativo, si hubo errores.</returns>
  12.    ''' <remarks>Cada carácter tiene su propio alfabeto, circunscrito al rango Min-Max, para el índice que ocupa.</remarks>
  13.    Friend Function CalcularNumPermutaciones(ByRef ClaveActual() As Byte, ByRef Min() As Byte, ByRef Max() As Byte) As Decimal
  14.        Dim k As Short, j As Short, n As Decimal, v As Short
  15.        Dim x As Short, y As Short, z As Short
  16.  
  17.        k = ClaveActual.Length
  18.        If ((k <> Min.Length) Or (k <> Max.Length)) Then
  19.            MsgBox("Los 3 arrays deben ser del mismo tamaño: Palabra, Min y Max.")
  20.            Return -2
  21.            Exit Function
  22.        End If
  23.  
  24.        Try
  25.            n = 1
  26.            For j = 0 To k - 2 Step 2
  27.                x = ClaveActual(j)
  28.                y = Min(j)
  29.                z = Max(j)
  30.                v = (z - y)
  31.  
  32.                If (v > 0) Then
  33.                    If (x > z) Then
  34.                        ClaveActual(j) = z
  35.                    ElseIf (x < y) Then
  36.                        ClaveActual(j) = y
  37.                    End If
  38.                ElseIf (v < 0) Then
  39.                    If (x > y) Then
  40.                        ClaveActual(j) = y
  41.                    ElseIf (x < z) Then
  42.                        ClaveActual(j) = z
  43.                    End If
  44.                End If
  45.  
  46.                n = (n * (Math.Abs(v) + 1))
  47.            Next
  48.  
  49.            Return n
  50.        Catch ' de ocurrir un error se espera que sea desbordamiento... sucederá si ponemos demasiados caracteres y un rango de alfabeto para ellos muy grande... depende de tales valores que se llegue a un desboramiento o no.
  51.            Return -1
  52.        End Try
  53.    End Function
  54. End Module
  55.  
Solo queda por comentar que al truncar un carácter se comprueba que límite supera, si supera el límite 'Max', se fija con el carácter 'Máx', si supera el límite 'Min', se fija el carácter con el carácter'Min'. Máx y Min, como extremos del alfabeto para ese carácter.

Finalmente vamos con el código de la clase Ciclos, que es quien realiza todo el trabajo 'sucio'...

Código
  1. 'Public Class cPermut
  2.  
  3.  
  4. ' Se crean tantas instancias de esta clase como caracteres ha de tener la clave +1.
  5.    ''' <summary>
  6.    ''' Esta clase representa un sólo carácter en una posición dada de la clave. Y retiene los valores máximo y mínimo que puede alcanzar.
  7.    ''' </summary>
  8.    ''' <remarks>La clase se encadena al siguiente carácter a través de p_Next.</remarks>
  9.    Private Class Ciclos
  10.        Private p_Valor As Byte          ' El valor actual del byte/carácter
  11.        Private p_Min As Byte            ' El valor mínimo que puede alcanzarse (en el rango 0-255)
  12.        Private p_Max As Byte            ' El valor máximo que puede alcanzarse (en el rango 0-255)
  13.        Private p_PosicionChar As Byte   ' La posición que registra el 'Valor' de esta clase en el alfabeto.
  14.        Private s_Inc As Short           ' el valor que se aumenta: -1 si es regresivo (Min mayos que Max), sino, es +1.
  15.        Private p_Next As Ciclos         ' Referencia a la instancia que opera sobre el carácter á la izquierda de éste.
  16.  
  17.        ''' <summary>
  18.        ''' Prepara los valores de inicio, fin e incremento para el 'carácter x' del alfabeto.
  19.        ''' </summary>
  20.        ''' <remarks>Se reinvoca a sí mismo, hasta asignar una instancia de la clase a cada carácter del alfabeto. Tras el carácter más a la izquierda asocia una instancia 'fin'.</remarks>
  21.        Public Sub SetEstadoInicial()
  22.            Dim niM As Byte, xaM As Byte
  23.  
  24.            If (SizeClave >= 0) Then         ' C - Examina Size y si es mayor o igual a cero:
  25.                p_PosicionChar = SizeClave    ' A - se asigna el índice actual.
  26.                '                                               B - Con el índice actual, tomar:
  27.                ' el 'valor' actual y los límites 'Max' y 'Min'.
  28.                p_Valor = ClavePermutada(p_PosicionChar)
  29.                niM = Min(p_PosicionChar)
  30.                xaM = Max(p_PosicionChar)
  31.  
  32.                s_Inc = Math.Sign(xaM - niM) ' esto devuelve = 0, -1, +1
  33.                If (s_Inc = 0) Then
  34.                    p_Valor = niM : p_Min = niM : p_Max = niM  ' El carácter es fijo en la clave.
  35.                Else
  36.                    p_Max = xaM : p_Min = niM
  37.                End If
  38.  
  39.                SizeClave -= 2              ' Z - Decrementa Size en 1
  40.                If (p_Next Is Nothing) Then ' Y - Si no existe,
  41.                    p_Next = New Ciclos '     crea otra clase anidada 'Next' (que será las decenas, centenas, etc...)
  42.                End If
  43.                Call p_Next.SetEstadoInicial()            ' X - Invoca su método 'Nuevo'.
  44.                '                             W - vuelve a sumar el size... para compararlo con 'fin'.
  45.            Else                            ' Si es menor que cero:
  46.                ' Es el dígito a la izquierda del último reclamado,
  47.                ' Su función es detectar el final de la enumeración.
  48.  
  49.                ' Se ponen los valores en la clase que intercepta el final de la enumeración.
  50.                p_PosicionChar = 255 ' Este valor detecta el final.
  51.                p_Min = 0 : p_Max = 0 : p_Valor = 0 ' necesario, porque si ya exisitía esta clase antes, podría tener valores...
  52.                p_Next = Nothing    ' Z - Elimina (si existe) la clase anidada 'Next' y subsiguientes.
  53.            End If
  54.        End Sub
  55.  
  56.        ' Sumar ó restar 1.
  57.        ''' <summary>
  58.        '''  Incrementar ó decrementa el valor en una unidad y lo actualiza en la posición asignada. Si no alcanza el límite
  59.        ''' </summary>
  60.        ''' <remarks></remarks>
  61.        Friend Sub Mutar()
  62.            If (p_Valor = p_Max) Then
  63.                p_Valor = p_Min
  64.                If (p_PosicionChar < 255) Then ' se llegó a un dígito/carácter más alla del tamaño de la clave?
  65.                    p_Next.Mutar()
  66.                Else
  67.                    Fin = True
  68.                    Exit Sub ' porque noo existe ese index en permutacion
  69.                End If
  70.            Else
  71.                p_Valor += s_Inc ' s_inc puede valer:  +1, ó -1
  72.            End If
  73.            ClavePermutada(p_PosicionChar) = p_Valor
  74.        End Sub
  75.  
  76.        ' Elimina las clase anidadas de nivel superior (existentes previamente y no usadas en esta enumeración)... y aquélla elimina a la siguiente, etc... (dígitos).
  77.        Protected Overrides Sub Finalize()
  78.            p_Next = Nothing
  79.            MyBase.Finalize()
  80.        End Sub
  81.    End Class
  82.  
  83. 'End Class
  84.  
---- La clase registra un sólo carácter y nada más que uno, y guarda la info especifica para ello. Esto es: el valor actual, el valor Max, El Min, el incremento (+1
ó -1, en realidad +2, -2, pués manejamos 2 bytes por carácter).
---- p_PosicionChar, indica la posición que este carácter (ésta instancia de la clase ciclos) ocupa en la clave que se está generando.
---- p_Next, es una instancia a la clase que amneja el siguiente carácter. Recuerdo, que se opera como un cuentakilómetros, solo se mueve un dígito, y cuando alcanza su tope, fuerza-arrastra al siguiente al tiempo, que este regresa a su valor mínimo.
---- El método, SetEstadoInicial, en realidad recrea el 'cuentakilómetros, ya que recursivamente va generando una clase por cada carácter y luego se le cede el control, con cada 'carácter' coloca los valores asociados al carácter, valor actual límites Maxy Min, el valor de incremento... Cuando se llega al último carácter (el de la izquierda), se crea una última instancia con datos específicos, que luego son entendidos como: fin, ya no hay más caracteres, y sirve para retroceder en las devoluciones de llamdas en recursividad.
Si una llamada previa hubiere generado 2 caracteres, y por tanto 20 instancias, y la de ahora solo 6, asociar p_Next, para la clase final a Nothing, tiene por objeto destruir toda la estructura por encima de ella, es decir las instancias de clases, para los caracteres 7 a 21, serían  eliminadas y la 6ª haría las veces de clase límite.

--- Cuando desde el bucle del metodo "Enumerar" de la clase cPermut,  se invoca Ciclos.Mutar, se esta pidiendo generar una clave cada vez. el método Mutar (de Permutar), realiza un incremento-decremento (según la dirección del alfabeto), al valor actual. Pero si ya se alcanzó el límite, entonces se coloca el valor mínimo y luego invoca a la siguiente clase, para mutar su valor. Se reconoce, cuantas veces puede invocarse Mutar, porque tras el último carácter, se invoca la instancia que actúa de límite, la cual tiene establecido como posición en el array 255, y por tanto se avisa de que ha llegado al final (Fin = True), valor que detecta el bucle iterador principal de la clase padre, tras cada permutación.
En la práctica, asignar el valor de psoición del carácter como 255, implica que se podría permutar (sin cambios en el código), claves de hasta 254 caracteres de largo, ya que la instancia con valor 255, actúa de límite.
Finalmente, la instancia 'mutada' coloca el valor actual en la clave generada.
- El último método (finalize), es para liberar la memoria, cuando ya no se requiera el objeto... Esto en cad alenguaje debe hacerse tal como sea preciso en el lenguaje.

Y eso es todo. El código es más elegante y más corto que para el algortimo de los bucles FOR, pero mucho más lento, por usar recursividad, también porque constantemente se verifica que posición de carácter ocupa esa instancia. La recursividad no es la misma función, si no a la misma función de otra clase.

Mañana o pasado, más...
4000  Foros Generales / Noticias / Re: Una profesora es suspendida de su empleo por reírse del examen de una alumna ... en: 18 Mayo 2017, 23:08 pm
Técnicamente, el examen es correcto...
Si te preguntan (sea en el idioma que sea), ¿qué hiciste la semana pasada?. Y tú respondes (en español), pués listo... Y es correcto, porque la pregunta es imprecisa.

Si la pregunta hubiera sido: Responde en ingles; ¿qué hiciste la semana pasada?... otro gallo cantaría y quién podría discutir que tiene razón...
Páginas: 1 ... 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 [400] 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 ... 432
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines