[Src] GetSimplificNumbers [No es una Compresion]

Iniciado por BlackZeroX, 5 Julio 2010, 23:09 PM

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

BlackZeroX

Solo es un simple algoritmo para simplificación de números en un array!¡.

la idea es ingresar números y qué los Simplifique, es decir 1,2,3,4,5,9,10,15,16,17,18,555,342,423,422 los ordena de la siguiente manera:

1~5,9,10,15~18,555,342,423,422

si se integra un ordenamiento QuickSort ordenaría adecuadamente!¡.

OJO: NO Es RECOMENDABLE USARLO CON NÚMEROS DECIMALES!¡.

Código (Vb) [Seleccionar]


'
'   /////////////////////////////////////////////////////////////
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este Código siempre y cuando   //
'   // no se eliminen los créditos originales de este código   //
'   // No importando qué sea modificado/editado o engrandecido //
'   // o achicado, si es en base a este código                 //
'   /////////////////////////////////////////////////////////////
Option Explicit

Public Function GetSimplificNumbers(ByRef ArrayOfNumbers() As Variant) As String()
If (Not ArrayOfNumbers) = -1 Then Exit Function '   //  Array entrante, iniciado?.
Dim Lng_ArrayTmp$()                             '   //  Colección de Números Simplificados!¡.
Dim Lng_Ini&, Lng_End&, Lng_Index&              '   //  Variables para el Bucle.
Dim Lng_AntPosNumber&                           '   //  Indice del Numero anterior (Numero del Array entrante).
Dim Lng_ResNumber&                              '   //  residuo de Lng_Index& - Lng_AntPosNumber&.
Dim Lng_ArrayCount&                             '   //  Contador de las dimensiones de Lng_ArrayTmp$.
Dim Bool_Swith                  As Boolean      '   //  swith para saber si se debe simplificar!¡.

   '   //  Call Start_QuickSort(ArrayOfNumbers(), AcendetOrder)    '   //  http://foro.elhacker.net/programacion_vb/source_ordenar_array_low_y_fast-t272312.0.html
   
   Lng_Ini = LBound(ArrayOfNumbers):   Lng_End = UBound(ArrayOfNumbers)
   ReDim Lng_ArrayTmp$(Lng_ArrayCount&)
   Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index&)
   
   For Lng_Index& = Lng_Ini + 1 To Lng_End
       Lng_ResNumber& = ArrayOfNumbers(Lng_Index&) - ArrayOfNumbers(Lng_Index& - 1)
       If Lng_ResNumber& > 1 Then
           If Bool_Swith Then
               If Lng_AntPosNumber& > 2 Then
                   Lng_ArrayTmp$(Lng_ArrayCount&) = Lng_ArrayTmp$(Lng_ArrayCount&) & "~" & ArrayOfNumbers(Lng_Index& - 1)
               Else
                   Lng_ArrayCount& = Lng_ArrayCount& + 1
                   ReDim Preserve Lng_ArrayTmp$(Lng_ArrayCount&)
                   Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index& - 1)
               End If
           End If
           Lng_ArrayCount& = Lng_ArrayCount& + 1
           ReDim Preserve Lng_ArrayTmp$(Lng_ArrayCount&)
           Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index&)
           Bool_Swith = False
       ElseIf Lng_ResNumber& = 1 Then
           If Not Bool_Swith Then Lng_AntPosNumber& = 0
           Bool_Swith = True
           If Lng_Index& = Lng_End Then
               If conversion.cbool(InStr(1, Lng_ArrayTmp$(Lng_ArrayCount& - 1), "~")) Then
                   Lng_ArrayCount& = Lng_ArrayCount& + 1
                   ReDim Preserve Lng_ArrayTmp$(Lng_ArrayCount&)
                   Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index&)
               Else
                   Lng_ArrayTmp$(Lng_ArrayCount&) = Lng_ArrayTmp$(Lng_ArrayCount&) & "~" & ArrayOfNumbers(Lng_Index&)
               End If
           Else
               Lng_AntPosNumber& = Lng_AntPosNumber& + 1
           End If
       ElseIf Lng_ResNumber& = 0 Then
           If Lng_AntPosNumber& > 0 Then
               Lng_AntPosNumber& = Lng_AntPosNumber& + 1
           Else
               Lng_AntPosNumber& = 0
           End If
       End If
   Next
   GetSimplificNumbers = Lng_ArrayTmp$
End Function



Ejemplo:

Código (Vb) [Seleccionar]


Public Function NumeroAleatorio(MinNum As Long, MaxNum As Long) As Long
Dim Tmp                                 As Long
   If MaxNum < MinNum Then: Tmp = MaxNum: MaxNum = MinNum: MinNum = Tmp
   Randomize: NumeroAleatorio = (MinNum - MaxNum + 1) * Rnd + MaxNum
End Function

Sub main()
Dim ArrayTmp() As Variant
Dim i&, i2&
   i& = 100
   ReDim ArrayTmp(i&)
   For i2& = 0 To i&
       ArrayTmp(i2&) = CStr(NumeroAleatorio(5, 99))
   Next
   Call Start_QuickSort(ArrayTmp(), AcendetOrder) '   //  http://foro.elhacker.net/programacion_vb/source_ordenar_array_low_y_fast-t272312.0.html
   Call MsgBox(Strings.Join(GetSimplificNumbers(ArrayTmp), ","))
End Sub



Alternativas:
http://foro.elhacker.net/programacion_visual_basic/src_abbreviatenumericarray_by_psyke1-t298689.0.html

P.D.: No escribí los números yo en Array fueron generados aleatoria-mente!¡.

Sangriento Infierno Lunar!¡.
The Dark Shadow is my passion.

raul338

Cita de: BlackZeroX▓▓▒▒░░ en  5 Julio 2010, 23:09 PM
P.D.: No escribí los números yo en Array fueron generados aleatoria-mente!¡.

Hubiera sido lindo que el array se generara consecutiva y aleatoriamente ;)

BlackZeroX

#2
Código (Vb) [Seleccionar]


Public Function NumeroAleatorio(MinNum As Long, MaxNum As Long) As Long
Dim Tmp                                 As Long
   If MaxNum < MinNum Then: Tmp = MaxNum: MaxNum = MinNum: MinNum = Tmp
   Randomize: NumeroAleatorio = (MinNum - MaxNum + 1) * Rnd + MaxNum
End Function

Sub main()
Dim ArrayTmp() As Variant
Dim i&, i2&
   i& = 100
   ReDim ArrayTmp(i&)
   For i2& = 0 To i&
       ArrayTmp(i2&) = CStr(NumeroAleatorio(5, 99))
   Next
   Call Start_QuickSort(ArrayTmp(), AcendetOrder) '   //  http://foro.elhacker.net/programacion_vb/source_ordenar_array_low_y_fast-t272312.0.html
   Call MsgBox(Strings.Join(GetSimplificNumbers(ArrayTmp), ","))
End Sub



Sangriento Infierno Lunar!¡.
The Dark Shadow is my passion.

Psyke1

Muy buena Black!!! ;-)
Y encima es el doble de rapida que la mia... :-\

Dulces Ranas¡! :)