Avatar billede hmm_t Nybegynder
07. februar 2002 - 17:53 Der er 11 kommentarer

Kombinationer

Hvordan laver man nemest et program der laver alle kombinationer af alle tegn og bogstaver? kombinationerne skal værer 16 tegn lang?

Jeg ved godt det lyder lidt indviklet, men jeg ved ikke hvordan jeg ellers skal forklarer det!

Så bare spørg!
Avatar billede soreno Praktikant
07. februar 2002 - 19:43 #1
prøv at lave nestede loops der gennem løber alle tegn i hvert loop
pseudo kode:
tegnXX er en char og lig 0 i starten
loop1:
  print tegn1
  tegn1++
  loop2:
    print tegn2
    tegn2++
    loop3:
      print tegn3
      tegn3++
      ..
print '\n' // for linieskrift

ekspempel på output:
aaa
aab
aac
aad
osv..
Avatar billede hmm_t Nybegynder
07. februar 2002 - 20:36 #2
Jeg har lavet noget lingene en gang men det lar timer for den at lave alle kombinationer op til 16 tegn!

For det andet skal alle kombinationerne add'es i en listbox!
Avatar billede jhc Nybegynder
07. februar 2002 - 21:31 #3
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    TempArray : Array[1..16] of byte;

    { Private declarations }
  public
    Procedure SkrivStreng;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j : integer;

begin
j := 16;
for i := 1 to 16 do
begin
  TempArray[i] := 33;
end;

while (j >= 1) do
begin
i := 33;

While TempArray[j] <= 254 do
begin
  inc(i);
  TempArray[j] := i;
  Skrivstreng;
  form1.Caption := inttostr(memo1.Lines.Count);
end;
dec(j);
end;



end;

Procedure TForm1.SkrivStreng;
var
  i : integer;
  S : String;
begin
  for i := 1 to 16 do
  begin
    S:= S + chr(TempArray[i]);
  end;
  Memo1.Lines.Add(S);
end;

end.

meget meget grimt programmeret kunne dette være en løsning
Avatar billede hmm_t Nybegynder
07. februar 2002 - 22:39 #4
Det går pænt stærkt.
Men det er jo ikke alle kombinationer!
og tegn som ikke er i det danske alfabet skal jeg ikke bruge!
Avatar billede geek Nybegynder
07. februar 2002 - 22:45 #5
Hvis du vil have en komplet liste over alle tegn i en 16 ciffret løsning kommer du nok til at vente et stykke tid.
Eftersom det er 255^16 = 3,1962657931507848761677563491821e+38 forskellige muligheder du vil få.
Hvis vi sagde at din computer kunne "indtaste" 10 milliarder = 10000000000 løsninger i sek. (hvilket jeg ikke tror medmindre du har en rimelig sej computer) ville du komme til at vente i :
31.962.657.931.507.848.761.677.563.491,8213 sek
som er lig med :
532.710.965.525.130.812.694.626.058,197021 min
som er lig med :
8.878.516.092.085.513.544.910.434,30328369 timer
som er lig med :
369.938.170.503.563.064.371.268,095970154 døgn
som er lig med :
12.331.272.350.118.768.812.375,6031990051 måneder
som er lig med :
1.027.606.029.176.564.067.697,96693325043 år

Du vil også for brug for en hel del ram eller hdd plads hvis du vil lager denne liste, eftersom den komplette liste vil komme til at fylde :
3,1962657931507848761677563491821e+38 * 16 = 5,1140252690412558018684101586914e+39 bit
som er lig med :
5,1140252690412558018684101586914e+39 / 8 = 6,3925315863015697523355126983638e+38 byte
som er lig med :
6,3925315863015697523355126983638e+38 / 1024 = 624.270.662.724.762.671.126.514.911.949.585.000 kb
som er lig med :
624.270.662.724.762.671.126.514.911.949.585.000 / 1024 = 609.639.319.067.151.046.021.987.218.700.767  mb
som er lig med :
609.639.319.067.151.046.021.987.218.700.767 / 1024 = 595.350.897.526.514.693.380.846.893.262,467 gb
OSV OSV...

Jeg håber ikke jeg har taget modet helt fra dig, men det kan godt være at du skal regne med at du ikke kommer til at få genereret en komplet liste over forskellige 16 cifferet løsninger :(

Geek
Avatar billede geek Nybegynder
07. februar 2002 - 22:54 #6
Mine udregninger er ud fra hvad du skrev i spørgsmålet "alle tegn og bogstaver" er derfor regnet udfra 255 tegn.
men er det kun bogstaver i det danske alfabet bliver tiden og størelse strax meget mindre :
vil så komme til at tage : 28^16 / 311040000000000000 = 458.893,8719 år
og vil fylde : 28^16 * 16 / 8589934592 = 265.863.444.556.808 gb
Avatar billede djernaes Nybegynder
08. februar 2002 - 01:46 #7
Hvad er det for en skole hvor de giver saadanne opgaver?

Det svar din laere vil have er det som "soreno" skriver - nu skal du bare selv lave programmet.... kom nu saa svaert er det heller ikke.

Martin
Avatar billede hmm_t Nybegynder
08. februar 2002 - 13:00 #8
Så lad os korte det ned til 5 tegn!
Men det tar stadig meget lang tid!
Avatar billede djernaes Nybegynder
08. februar 2002 - 17:12 #9
Hvad er 5^5 ?
Avatar billede soreno Praktikant
09. februar 2002 - 11:18 #10
djernaes> mener du ikke 256^5 ?
hmm_t> du er lidt inde på emnet tidskompleksitet. En funktion der skal lave alle mulige kombinationer mellem x tal, vil have kompleksiteten O(n^x) (store-o af n^x), hvilket vil give en meget stejl graf hvis man tegnede det. Der er ingen let løsning på det problem, det er jo samme teknik der bruges til at gætte passwords (brute force).
Desunden tror jeg også at det der tager længst tid er at vise outputtet, men det kunne jo komme an på et eksperiment.
Avatar billede hmm_t Nybegynder
09. februar 2002 - 21:05 #11
Jaa,så må jeg vel bruge noget lignene soreno's metode!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester