Fórum Algoritmo para gerar número de lote para medicamentos #256496
28/10/2004
0
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
Curtir tópico
+ 0Posts
28/10/2004
Gandalf.nho
[url]http://www.theory.csc.uvic.ca/~cos/inf/comb/CombinationsInfo.html[/url]
Gostei + 0
28/10/2004
Titanius
Gostei + 0
28/10/2004
Carnette
Tá me parecendo um ACHA SENHA na força bruta...
Gostei + 0
29/10/2004
Titanius
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
29/10/2004
Aroldo Zanela
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
29/10/2004
Titanius
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
01/11/2004
Marco Salles
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
03/11/2004
Titanius
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
03/11/2004
E_gama
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
03/11/2004
Marco Salles
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:
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
04/11/2004
E_gama
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
04/11/2004
Titanius
Vou testar aqui e posto o resultado! :D
[]s
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)