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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [C#] Metodo de compresión
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C#] Metodo de compresión  (Leído 2,832 veces)
Hendrix
In The Kernel Land
Colaborador
***
Desconectado Desconectado

Mensajes: 2.276



Ver Perfil WWW
[C#] Metodo de compresión
« en: 24 Agosto 2007, 20:52 pm »

Esta tarde estaba aburrido y e diseñado este sencillo algoritmo. Funciona de la siguiente manera:

Texto Original: Heeendriixx
Texto Final: H2endr1i1x

Es decir, si hay 3 e's juntas, lo substituye por 2e.....y al descomprimirlo, pone tantas letras como indica el numero.

Evidentemente este metodo solo funciona en textos en donde se repitan muchas letras y esten juntas.

Si se preguntan lo siguiente: Que pasa si comprimimos un texto con numeros?? La respuesta es que el algoritmo no sirve, queda inservible, como se arregla?? pues muy fácil, añadiendo una marca delante del numero, si existe la marca pues el numero que viene depues nos interesa, si no esta la marca pues nos lo saltamos. Eso es muy facil de añadir, asi que si quereis añadirselo se lo añadiis  :)


Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7.    class Program
  8.    {
  9.        public static int contador = 0;
  10.  
  11.        public static bool IsNumeric(object Expression)
  12.        {
  13.            bool isNum;
  14.            double retNum;
  15.  
  16.            isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any,System.Globalization.NumberFormatInfo.InvariantInfo, out retNum );
  17.            return isNum;
  18.        }
  19.  
  20.        public static string Decompresor(string comprimido)
  21.        {
  22.            string decompres = "";
  23.            string num = "";
  24.            string caracter;
  25.            int diferencia = 1;
  26.            string sub;
  27.            string suba;
  28.            bool semaforo = false;
  29.  
  30.            for (int e = 0; e < comprimido.Length; e++)
  31.            {
  32.                if (IsNumeric(comprimido.Substring(e, 1)) == true)
  33.                {
  34.                    for (int j = 1; j < comprimido.Length; j++)
  35.                    {
  36.                        if (semaforo == true)
  37.                        {
  38.                            diferencia--;
  39.                            if (diferencia != 0)
  40.                            {
  41.                                semaforo = false;
  42.                                break;
  43.                            }
  44.                        }
  45.  
  46.                        string b;
  47.                        bool a;
  48.                        b = comprimido.Substring(e + j, 1);
  49.                        a = IsNumeric(b);
  50.                        if (a == false)
  51.                        {
  52.                            sub = comprimido.Substring(e);
  53.                            num = "";
  54.                            num = sub.Substring(0, j);
  55.                            caracter = sub.Substring(j, 1);
  56.                            diferencia = num.Length;
  57.                            for (int m = 0; m < Convert.ToInt32(num); m++)
  58.                            {
  59.                                decompres = decompres + caracter;
  60.                            }
  61.                            semaforo = true;
  62.                            break;
  63.                        }
  64.                    }
  65.                }
  66.                suba = comprimido.Substring(e, 1);
  67.                if (IsNumeric(suba) == false)
  68.                {
  69.                    decompres = decompres + suba;
  70.                }
  71.            }
  72.  
  73.            return decompres;
  74.  
  75.        }
  76.  
  77.  
  78.        public static string Compresor(string texto)
  79.        {
  80.            string res = "";
  81.  
  82.            for (int i=0;i<texto.Length-1;i++)
  83.            {
  84.                char a,b;
  85.  
  86.                a = Convert.ToChar(texto.Substring(i,1));
  87.                b = Convert.ToChar(texto.Substring(i+1,1));
  88.                if (a == b)
  89.                {
  90.                    contador++;
  91.                }
  92.                else
  93.                {
  94.                    if (contador != 0)
  95.                    {
  96.                        res = res + Convert.ToString(contador);
  97.                        contador = 0;
  98.                    }
  99.                    res = res + a;
  100.                }
  101.  
  102.            }
  103.  
  104.            res = res + texto.Substring(texto.Length - 1, 1);
  105.  
  106.            if (contador != 0)
  107.            {
  108.                res = res.Substring(0, res.Length - 1);
  109.                res = res + Convert.ToString(contador);
  110.                res = res + texto.Substring(texto.Length - 1, 1);
  111.            }
  112.  
  113.  
  114.            return res;
  115.  
  116.  
  117.        }
  118.  
  119.        static void Main(string[] args)
  120.        {
  121.            string palabra;
  122.            string resultado;
  123.            string result;
  124.  
  125.            palabra = "heeeeeeeeeeeennnnnnnnnnnnddddddddrrrrrrriiiiixxxxxxxxxx";
  126.  
  127.  
  128.            resultado = Compresor(palabra);
  129.            result = Decompresor(resultado);
  130.  
  131.  
  132.            Console.WriteLine("La palabra original es: {0} \nLa palabra comprimida es: {1}\nLa palabra descomprimida es: {2}\n\n",palabra, resultado,result);
  133.            Console.WriteLine("Tamaño inicial: {0}\nTamaño Final: {1}", palabra.Length, resultado.Length);
  134.            Console.Read();
  135.  
  136.  
  137.        }
  138.    }
  139. }

Nota: El codigo no esta depurado, se puede optimizar, ya que hay variables que las e agregado para poder depurarlo mejos cuano me provocaba errores  ;)

Un Saludo  :)



En línea

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines