Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 15-02-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Yo creo que luxus nos ha dejado a todos hechos un lío con su secuencia. Como bien menciona Delphius en sus reglas, al parecer no se han preparado antes de elaborar el programa. Estamos ante un problema de secuencias sui-generis, ya que no había visto algo similar antes.

¿Es un sistema posicional? ¿Las letras pueden volverse números? en fin por decir solo unas interrogantes.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #22  
Antiguo 15-02-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por eduarcol Ver Mensaje
a ver si entendi lo que explicas, necesitas recursividad, algo como esto:
Bueno, y porque no usar los conceptos de las conversiones Binarias, decimales, octales, hexadecimales, pues nos hacemos de una nueva Base36.

Código Delphi [-]
unit UBase36;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Math;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Label2: TLabel;
    Edit1: TEdit;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  // Generamos nuestro vector de valores de '0' a 'Z'
  Base36 : Array[0..35] of char = ('0','1','2','3','4','5','6','7','8',
                                   '9','A','B','C','D','E','F','G','H',
                                   'I','J','K','L','M','N','O','P','Q',
                                   'R','S','T','U','V','W','X','Y','Z');

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Suma,Numero: Extended;
  PosCaracter,Indice: Integer;

  function ConvABase36(N:Extended):String;
  var
    Cadena: string;
    Dividendo,Resultado,Residuo: Extended;

  begin
    Cadena := '';
    Dividendo := N;
    REPEAT
      // 1. Se divide el numero entre 36
      Resultado := Dividendo / 36; 
     // 2. Se resta el resultado y parte entera del resultado y se multiplica por 36
      Residuo := (Resultado - Trunc(Resultado)) * 36; 
      // Se agrega el caracter correspondiente al residuo obtenido
      Cadena := Base36[Trunc(Residuo)]+ Cadena;
      Dividendo := Resultado;
    UNTIL Resultado < 36;
    //Se agrega el caracter del último valor (dividendo) a la cadena
    Result := Base36[Trunc(Dividendo)]+Cadena;
  end;

  function ConvADecimal(B36:string):Extended;

    function GetIndex(Value: Char): Integer;
    begin
      Result := Byte(Value) - 48;
      if Result > 9 then Dec(Result, 7);
    end;

  begin
    Indice := 0;
    PosCaracter := length(B36);
    REPEAT
       Suma := Suma + GetIndex(B36[PosCaracter]) * Power(36,Indice);
       Indice := Indice + 1;
       Dec(PosCaracter);
    UNTIL Indice = (length(B36)-1);
    Result := Suma;
  end;

begin
  //Usar solo cadenas de hasta 12 digitos , (por ahora )
  //Estoy usando un signo ~ antes de la cadena por cuestiones de indices 
  Numero := ConvADecimal('~'+Edit1.Text)+1; //Directamente sumo uno al valor decimal
  Label2.Caption := ConvABase36(Numero); //Se convierte el numero a Base36
end;

end.

Ahora, podemos sumar a cualquier cadena que nos coloquen, por ejemplo LX345J8ON99.

Nota: No se porque, pero solo suma correctamente hasta 12 digitos, pues bien, habría que mejorar este código.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #23  
Antiguo 16-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Buenas!

Aqui vengo yo... con un código revolucionario. No usa recursividad, pero debido a no se... solo funciona correctamente si se pasa cadena en mayusculas. Por más que le meta ansiuppercase(), no funciona. Si alguno le ve el error avise.

Bueno no más espera, aqui suelto al bicho. Guarda que muerde

EDITO:Realizado en D6.

Código Delphi [-]
unit UCode;

{
 UCode.pas
 Version: 1.quien_sabe
 Autor: Delphius, Clubdelphi
 Idioma del código: Inglés ¿Sino cual :P?

 Descripción:
 (¡No seas vago/a lee!)

 Esta unidad fue elaborara para diseñar un nuevo código a partir de un
 incremento cíciclo. (No se me ocurrió mejor brillante palabra :P)
 La idea de este algoritmo es que dependiendo de si los caracteres son
 números o letras se incremente cíclicamente el valor.

 Después de romper mucho cerebro :S logré percatarme de que:
 1. No es necesario ser recursivo.
 2. No es necesario hacer un pre-análisis para saber el nuevo valor.
 3. Sólo se debe continuar incrementando si es necesario. ¡La consigna indica
    de que se necesita el siguiente. No que debe incrementarse todos los ca-
    racteres!

 Este algoritmo se detiene una vez que no han detectado cambios.
 Un cambio es producido únicamente cuando es necesario incrementar el siguiente
 caracter a su izquierda, y por tanto sólo se produce cuando el caracter ana-
 lizado sea un 9 o Z.

 Se dice que es cíclico debido a que:
 Sig(9) = 0, Sig(0) = 1.
 Sig(Z) = A, Sig(A) = B.

 La confección del algoritmo no está basada en los valores ASCII, sino en la
 ubicación dentro de un vector. Lo cual favorece implementar el ciclo mediante
 la función MOD. Por tanto la fórmula se reduce a un:

 Posic_NuevoChar = (Posic_ViejoChar + 1)  mod Longitud(Vector)

 Teniendo esto en mente se consigue una nueva ventaja. Es fácilmente adaptable
 a la ampliación del vector, logrando así añadir, borrar o alterar la posición
 de los caracteres.
 El vector se llama ALPHA y funciona del siguiente modo:
 * Las diez primeras posiciones pertenecen a los números. REQUISITO: el cero
   debe estar en la décima posición.
 * Las restantes posiciones son letras (o si se desea, caracteres extraños).
   REQUISITO: la 11va posición será para el primer valor del ciclo de letras.

 La unidad cuenta con dos funciones:
 NewCode: Recibe el código (string) y devuelve el siguiente (string).
 EvaluateRule: determina el valor del incremento y predice si se necesita se-
               guir analizando.

 El usuario final sólo necesita llamar a NewCode. EvaluateRule es llamada in-
 ternamente por NewCode.

 Ejemplo de uso:

 Edit2.Text := NewCode(Edit1.Text);

 Así mismo la unidad cuenta con una constante que define la cantidad de carac-
 teres que conforma al código (MAX_LEN). Su valor es 14. Modificando esta
 constante se permite variar el tamaño. Por esto, NewCode emitirá una excep-
 ción si recibe un texto que no sea de igual tamaño que MAX_LEN.

 NOTAS FINALES:
 1. El código no está preparado para chequear caracteres fuera del vector ALPHA
 2. Al ser un algoritmo cíciclo si se recibe como parámetro el valor extremo en
    la secuencia, se obtiene el primer valor. Ejemplos:

    1) NewCode(ZZZ..Z) = AAA..A
    2) NewCode(999..9) = 000..0
    3) NewCode(Z9Z9..Z9) = A0A0..A0
    4) NewCode(9Z9Z..9Z) = 0A0A..0A

 3. Si no es esto lo que se busca... ¡Que hable ahora o calle para siempre!

 BUGS:
 1. Se ha encontrado hasta el momento un sólo bug... no funciona correctamente
    si se ingresa minúsculas! Se ha probado tanto ingresando una preventiva
    con AnsiUpperCase, pero igualmente el código falla. Mostrando el texto
    en minusculas y sustituyendo el valor 13vo por 1. ¡RARO!

 ¿Copyleft? No se... ya estoy dudando... :P
 Se reciben sugerencias! ¡Y cerebro nuevo!  ¡Si tiene euros mejor! Envíe por
 e-mail...   :P 

 Muchas gracias por leer este rollo!
 ¿Ya puedo ir a dormir? :S

}

interface

uses
 SysUtils;

const
  MAX_LEN = 14;
  ALPHA = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function NewCode(Code: string): string;


implementation

function EvaluateRule(Character: char; var Changes: boolean): char;
var Posic, MaxChar: integer;
begin
  Posic := Pos(Character,ALPHA);

  // Comprobamos si habrá nuevos cambios.
  // Se producirán cambios en el caracter siguiente a evaluar
  // siempre y cuando el caracter sea 9 o Z
  Changes := (Posic = 9) OR (Posic = Length(ALPHA));

  // incrementamos el valor. De cualquier manera se incrementa el caracter!
  inc(Posic);
  if Posic = (Length(ALPHA) + 1)
     then MaxChar := 10
     else if Posic = 11
             then MaxChar := -10
             else MaxChar := 0;

  // MaxChar nos servirá para movernos entre los números o las letras
  result :=  ALPHA[(Posic mod Length(ALPHA)) + MaxChar];
end;

function NewCode(Code: string): string;
var i,len: integer;
    AuxCode: string;
    FindChanges: boolean;
begin
  len := Length(Code);
  if Len <> MAX_LEN
     then raise Exception.Create('El código no es de MAX_LEN caracteres!');

  i := MAX_LEN + 1;
  FindChanges := False;
  //SetLength(AuxCode,MAX_LEN);
  AuxCode := Copy(Code,1,MAX_LEN);
  AuxCode := AnsiUpperCase(AuxCode);

  repeat
    i := i - 1;
    AuxCode[i] := EvaluateRule(Code[i],FindChanges); // ¿es aquí el bug?
  until NOT FindChanges;

  result := AuxCode;
end;

end.

Y/o por las dudas, lo adjunto.

Saludos,
Archivos Adjuntos
Tipo de Archivo: zip UCode.zip (2,4 KB, 8 visitas)
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 16-02-2008 a las 04:17:08.
Responder Con Cita
  #24  
Antiguo 16-02-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
¿Esto no viene en la otra guía de estilo?.

"No aparezcas en dos semanas, estaremos encantados de seguir soucionando tu problema "

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #25  
Antiguo 16-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Lepe Ver Mensaje
¿Esto no viene en la otra guía de estilo?.

"No aparezcas en dos semanas, estaremos encantados de seguir soucionando tu problema "

Saludos
Pues yo ya tomé a este algoritmo como mi enemigo. Y si le deseamos encontrar el lado bueno, se a vuelto divertido debido a las diversas maneras de comprender a los extraños pedidos del ausente luxus... y en estos días se van a ver florecer coloridos códigos (tal vez muy distintos unos a otros) porque se que esto a atrapado a muchos y los hizo filosofar como a mi.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #26  
Antiguo 17-02-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por Delphius Ver Mensaje
Pues yo ya tomé a este algoritmo como mi enemigo. Y si le deseamos encontrar el lado bueno, se a vuelto divertido debido a las diversas maneras de comprender a los extraños pedidos del ausente luxus... y en estos días se van a ver florecer coloridos códigos (tal vez muy distintos unos a otros) porque se que esto a atrapado a muchos y los hizo filosofar como a mi.

Saludos,
Nada que, mas parece que estamos en un concurso "a ver quien le atina

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ordenar una table numericamente por un campo alfanumerico jose.mendez Tablas planas 2 31-12-2007 17:56:16
longitud de un campo alfanumerico dtomeysoto SQL 2 10-03-2007 20:08:55
Generacion de scripts AMO Oracle 2 10-10-2005 17:55:15
Generación de archivos dcu jplj Varios 2 26-04-2005 21:44:29


La franja horaria es GMT +2. Ahora son las 02:29:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi