Algoritmo para gerar número de lote para medicamentos

Delphi

28/10/2004

Olá pessoal estou querendo faze rum algoritimo que monte varias strings baseado em uma variavel String, tipo:

const
var1 = ´abcdefghijlkmnopqrstuvxz´;

for i = N do
begin
.
....
end;

aih ele monta palavras de acordo com o N

tipo se o N for 2 sairia:
ab
ac
ad
ae
af
...
ba
bb
bc
bd
... etc..
tipo forma palavras com todas as palavras da minha var const, e vai monstando as possibilidades de palavras e exibindo num ListBox, para eventual gravacao no futuro..

como faco isso gente! tentei de tudo quanto eh forma e nao consegui!

desde ja agradeco!

[b:2e11b41c7f][color=red:2e11b41c7f]Título editado pelo Moderador (AZ) - ´Removido: Preciso de uma ajuda em um algotimo dificil!!´[/color:2e11b41c7f][/b:2e11b41c7f]


Titanius

Titanius

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

28/10/2004

Dê uma olhada nessa página, pode ser que ajude
[url]http://www.theory.csc.uvic.ca/~cos/inf/comb/CombinationsInfo.html[/url]


GOSTEI 0
Titanius

Titanius

28/10/2004

amigo, tentei olhar, mas nao entendi nada :cry:


GOSTEI 0
Carnette

Carnette

28/10/2004

Hmmmm

Tá me parecendo um ACHA SENHA na força bruta...


GOSTEI 0
Titanius

Titanius

28/10/2004

Na realidade nao eh... :wink:

Pois estou desenvolvendo um sistema pra farmacia de manipulacao, e deverrei gerar uma lista de ´alfas´ para os lotes de fabricacao, assim nenhum será repetido, e nao pode ser soh numeros e tem q ser sequencias, sakou?!? senao o pessoal da fiscalizacao, nao deixa rodar... sakou?!

Tipo, pra um medicamento o lote tem q ser 4 caracteres, pra outro 6, pra outro 3... e por aih vai :D

Sacaram!?


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

28/10/2004

Colega,

Não entendi exatamente a lógica que precisa, mas segue uma dica:

function GerarNumeroLote: String;
Const LetraDia = ´QWERTYUIOPASDFGHJKLÇZXCVBNM1234´;
var Ano, Mes, Dia, Hora, Min, Seg, mSeg: Word;
begin
Result := ´´;
DecodeDate(Date,Ano,Mes,Dia);
  DecodeTime(Now,Hora,Min,Seg,mSeg);
  Result := IntToStr(Trunc(Ano-2000)) + Chr(Trunc(64+(Mes*2)))+LetraDia[dia]+FloatToStr(Min)+FloatToStr(Seg)+FloatToStr(mSeg);
end;



GOSTEI 0
Titanius

Titanius

28/10/2004

Amigo, irei tentar explicar melhor:

Preciso gerar varias strings formadas apartir de outra string [b:f5b9170a0a]const[/b:f5b9170a0a] e o tamanho devera ser variavel.

const
 stringpadrao = ´abcd123´;

for i := 0 to N do
 string := string+StringPadrao[i];

levando N =2, ficando assim:
ab
ac
ad
a1
a2
a3

ba
bc
bd
b1
b2
b3

cb
ca
cd
c1
c2
c3

etc...



Entao, gerarei varias strings com TODAS as possibilidades de formacao da string com a const padrao.

Espero ter sido mais claro dessa vez :D :wink:


GOSTEI 0
Marco Salles

Marco Salles

28/10/2004

Dois Sites Relacionados ao assunto
a) http://www.rmheise.brturbo.com/delphi/down/Arranjo.zip

este diz que tem o [b:097318e56e]programa incluindo o código fonte[/b:097318e56e]...eu ate hoje nao
consegui acessar :cry: :cry: ..Quem sabe voce tem mais sorte :P

b) http://www-cs-faculty.stanford.edu/~knuth/taocp.html (em inglês) procure por pre-fascicle 2b.

O Segundo diz que tem [b:097318e56e]Diferentes algoritmos [/b:097318e56e]para permutações e combinações..Eu nao consegui entender quase nada :cry: ..Quem sabe voce consiga entender :P

[b:097318e56e]Minha modesta análise do fato:[/b:097318e56e]

Arranjo(n,p):=n! / (n-p)! ; onde
n e o numero de elementos e
P =  numero de elementos que se quer agrupar


A primeira vista parece fácil, mas os calculos que o computador necessita realisar, cresce muito com pouquissimas variaçoes de [b:097318e56e]n e p[/b:097318e56e]..o que tornas estes programas muitas das vezes [b:097318e56e]insoluveis[/b:097318e56e]...A necessidade de se ter uma [b:097318e56e]maquina boa [/b:097318e56e]para realizar estes calculos é [b:097318e56e]certo e imprescendivel[/b:097318e56e]..so para se ter uma idéia com o programa que eu tenho :
e usando sua [b:097318e56e]variável ´abcdefghijlkmnopqrstuvxz´;[/b:097318e56e]
sinifica para [b:097318e56e]n = 24 [/b:097318e56e]temos:
Arranjo(24,1) = o meu pc gastou pouquissimo tempo para dar a resposta
arranjo(24,2) = o meu pc gastou 3s Para realisar os calculos
arranjo(24,3) = o meu pc gastou 25s para realisar os calculos


Diga-se de passagem:
a) O Meu pc e novo e bom
b)3s e quase um ano
c)25s e um ano Luz
d)o arranjo de [b:097318e56e]24 para 4[/b:097318e56e] eu nem me arrisquei em fazer...

Ja para o seu segundo exemplo [b:097318e56e]stringpadrao = ´abcd123´ [/b:097318e56e] e
[b:097318e56e]p=2[/b:097318e56e] o tempo e tranquilo , mas com [b:097318e56e]p=6[/b:097318e56e] o tempo gasto e de aproximadamente [b:097318e56e]1m47s[/b:097318e56e] <e o fim do Universo>, afinal sao [b:097318e56e]5040 [/b:097318e56e]possivéis combinaçoes para este esta numero de elementos.... Agora imagine a Situação de [b:097318e56e]n=24 e p=6[/b:097318e56e]..dá um total de aproximadamente :arrow: 96 milhoes de combinaçoes...So usando o computador da Nasa :lol:

Saida para isto é claro que tem. :idea: .uma delas e [b:097318e56e]limitar[/b:097318e56e] o numero de [b:097318e56e]n e p[/b:097318e56e],
senão o usuário,corre o risco de ficar num processo ´duradouro´ e nem sempre, podemos garantir que convirgirá para o fim...

Este Blablabla todo para que :?: :?: :?: O entuito, aqui e participar de maneira construtiva da questão lançada..ate mesmo com alguma ironia, mas diga-se de passagem com muito respeito..Então eu , para finalisar sugiro entre outras duas alternativas: :arrow:

a)a primeira e fazer um processo bem mais simples, onde cada vez, que o usuário necessitar de um [b:097318e56e]novo[/b:097318e56e] número de lote , o programa forneça para ele.....o unico incoveniente e que para cada novo numero de lote gerado o programa deverá conferir em sua base de dados se este numero ja foi gerado..com o tempo esta base de dados aumenta , mas acredito que deva [b:097318e56e]demorar muitos e longos anos[/b:097318e56e], para que a base de dados aumente de maneira considerável, e ate la :arrow: a evolução da máquina supera este inconveniente :wink:

b)o segundo, e se voce optar pelo programa que eu desponho, como nos moramos na mesma cidade, entre em contato comigo...


GOSTEI 0
Titanius

Titanius

28/10/2004

Amigo, poderia me enviar este programa seu?

O problema, eh q meu chefe, quer porque quer, ver todos os lotes possiveis, sacou?!?

vai ser exigentes assim no inferno... :twisted:

abracos e obrigado pelas respostas! :D


GOSTEI 0
E_gama

E_gama

28/10/2004

Olá amigo,

Realmente o tempo de processamento de um arranjo (26, 4) é bem superior a de um arranjo (26, 3).

Segue uma implementação que preparei de última hora aqui (nem deu tempo de testar direito), mas em minha máquina (P4 2.66 384MB) demorou:
(26, 3) -> aprox. 3s
(26, 4) -> verifique por si mesmo, hehe...

segue o código:
function GeraCombinacoes(S: string; NumDig: Integer): TStrings;
var I, J: Integer;
       X: Char;
      TS: TStrings;
      S1: string;
begin
  Result := TStringList.Create;
  TS     := TStringList.Create;

  for I := 1 to Length(S) do Result.Add(S[I]);

  while Length(Result.Strings[0]) < NumDig do
    begin
      for I := 0 to (Result.Count - 1) do
        begin
          S1 := ´´;
          for J := 1 to Length(S) do
            begin
              X := S[J];
              if Pos(X, Result.Strings[I]) = 0 then S1 := S1 + X;
            end;

          for J := 1 to Length(S1) do
            begin
              X := S1[J];
              TS.Add(Result.Strings[I] + X);
            end;
        end;
      Result.Text := TS.Text;
      TS.Clear;
    end;

  TS.Free;
end;


e para testar, coloque um TButton, TLabel e um TMemo no seu form e escreva no evento OnClick do botão:
  Memo1.Lines.Assign(GeraCombinacoes(´ABCDEFGHIJKLMNOPQRSTUVWXYZ´, 3));
  Label1.Caption := IntToStr(Memo1.Lines.Count);



Você notará que, escrevendo o seguinte código:
  Label1.Caption := IntToStr(GeraCombinacoes(´ABCDEFGHIJKLMNOPQRSTUVWXYZ´, 4).Count);

O tempo de processamento cai drasticamente

É claro que essa não é a melhor forma de implementar isso, mas espero que lhe dê uma luz...


GOSTEI 0
Marco Salles

Marco Salles

28/10/2004

É claro que essa não é a melhor forma de implementar isso, mas espero que lhe dê uma luz...


Pelo pouco que eu ja vi sobre o assunto, sua solução foi genial, Foi muito feliz com seu código.... :D :D :D :D

So nao gostei desta parte :arrow:

Segue uma implementação que preparei de última hora aqui (nem deu tempo de testar direito),


Na epoca que fiz este código demorei um dia inteiro,e ficou bem pior do que o seu..Mas so posso e de dar os Parabens..Valeu


GOSTEI 0
E_gama

E_gama

28/10/2004

Fiz alguns testes aqui:
Memo1.Lines.Assign(GeraCombinacoes(´ABCDEFGHIJKLMNOPQRSTUVWXYZ´, 4)); 
Label1.Caption := IntToStr(Memo1.Lines.Count); 

Com o código acima gastou [b:331634a90e]30,454s[/b:331634a90e] (ufa! mais de um ANO LUZ)

já com o código abaixo gastou [b:331634a90e]2,516s[/b:331634a90e]:
Memo1.Lines.Text := GeraCombinacoes(´ABCDEFGHIJKLMNOPQRSTUVWXYZ´, 4).Text;
Label1.Caption := IntToStr(Memo1.Lines.Count);


e assim, gastou [b:331634a90e]1,25s[/b:331634a90e] :

Label1.Caption := IntToStr(GeraCombinacoes(´ABCDEFGHIJKLMNOPQRSTUVWXYZ´, 4).Count);



Total de combinações possíveis: [b:331634a90e]358800[/b:331634a90e]

Essa diferença toda dá-se devido ao [b:331634a90e]overhead[/b:331634a90e] na transferência de dados de um TStrings para outro.
Imagine ter quer transferir, 358800 linhas de uma variável para outra!

Mas no geral, para minha máquina, a rotina está boa.

Talvez alguém coloque na seção ´Puzzles´, como desafio criar um algoritmo mais rápido.


GOSTEI 0
Titanius

Titanius

28/10/2004

Pessoal, fico feliz que minha duvida gerou tanta polemica aos amigos... fico muito grato pelas solucoes, e pelo amigo MArco Salles pela prestatividade :D


Vou testar aqui e posto o resultado! :D

[]s


GOSTEI 0
POSTAR