Varijacije

Peruzzi

Domaćin
Poruka
4.066
Druga stvar (u pauzi dok se hladi modem)

imam skup znakova {a..z, razmak( ), zarez(,), tacka(.)} (25 znakova)

treba da odredim koji je broj varijacije (ili kako se to vec strucno zove) znakova u slogu od 4 znaka. npr

aaaa 1 var
aaab 2 var
aaac 3 var
aaba 26 var
aabb 27 var
abaa 626 var

shvatate na sta mislim?

moze i kodno uradjeno, svejedno

probao sam, ubih se, al nikako da nadjem kako...

Podproblem:
da li se pravilo moze uopstiti na slog od n znakova sa skupom od m clanova?
 
Zamisli heksadecimalni sistem. Sad zamisli da je osnova sistema 25 (ako sam dobro shvatio) a ne 10, i da ti je svaki znak cifra. Sad uzmes prvi znak sleva i ocitas vrednost (ascii(znak) - ascii(a)) i pomnozis sa 25^3, za drugi isto tako i pomnozis sa 25^2...saberes sve i to je broj varijacije. Mozda dodas 1 jer je aaaa prva a ne nulta, i mozda sam jos ponesto zaboravio, ali to je to u principu.
 
To je kombinatorika, neznam zasto, ali uvijek sam je volio izbjegavati.
Uglavnom pogledaj malo na netu na tu temu, trebao bi pronaci formulu kojom mozes rijesiti svoj problem. Uglavnom to su uzasno veliki brojevi u pitanju.
 
Pa napisao sam ti gore kako treba da radis, zamisli da je to brojni sistem sa osnovom 25 ili koliko vec znakova imas. Uzmes polazni decimalni broj, delis sa 25^3, nadjes znak koji odgovara celom delu kolicnika, ispises, od polaznog broja oduzmes ceo deo koicnika * 25^3, pa onda delis sa 25^2, itd...
 
nije meni bio problem prebacivanje iz sistema u sistem nego odredjivanje broja varijacije teksta i obrnuto

sredio sam sve, jos samo da spojim funkcije kako treba pa cu vam pustim cisto da vidite zbog cega potrosih par KB na serveru za ovu temu :D
 
ako sam dobro shvatio onda garwor nije u pravu

ako je recimo slog od 4 znaka - abcd - onda je broj varijacije ovako nesto

(a-1)*25^3 + (b-1)*25^2 + (c-1)*25 + d

gde su a,b,c,d broj znaka u uredjenom skupu {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u,v,z, ,,,.}

rade mi tri procedure al jedna nece...



function TekstuBroj10(var text:string):string;
function Broj10uTekst(var broj:word):string;
function Broj10uBroj50(var broj:word):string;
function Broj50uBroj10(var broj:string):word;

tekst u dekadni broj je dobro uradjena i radi kako treba

pretvaranje dekadnog u 50 i 50 u dekadni je isto izvedeno kako treba

ostaje samo jos dekadni broj u tekst, koja mi je i inace sumnjivai mislim da je greska bas u njoj

evo je

function TForm1.Broj10uTekst(var broj:word):string;
var
a1,b1,c1,d1:char;
a,b,c,d:integer;
begin
Broj10uTekst:='';
d:=broj mod 25;
c:=( trunc((broj-d)/25) mod 25 + 1 ) div 1;
b:=( trunc(((broj-d)/25 - c + 1)/25) mod 25 + 1 ) div 1;
a:=trunc( (((broj-d)/25 - c + 1)/25 - b + 1)/25 + 1 );

if d<23 then d1:=chr(d+96)
else if d=23 then d1:=' '
else if d=24 then d1:=','
else if d=25 then d1:='.';
if c<23 then c1:=chr(c+96)
else if c=23 then c1:=' '
else if c=24 then c1:=','
else if c=25 then c1:='.';
if b<23 then b1:=chr(b+96)
else if b=23 then b1:=' '
else if b=24 then b1:=','
else if b=25 then b1:='.';
if a<23 then a1:=chr(a+96)
else if a=23 then a1:=' '
else if a=24 then a1:=','
else if a=25 then a1:='.';

Broj10uTekst:=a1+b1+c1+d1;
end;


ostale su malo duze (sto ne znaci da su komplikovane nego da me je mrzelo da skracujem kod, nema potrebe, a i ne verujem da bi dalo nekog efektnog rezultata)
ali ipak cu da ih pustim u sledecem postu
 
ovo su funkcije koje pretvaraju dekadni u 50 i obrnuto

function TForm1.Broj10uBroj50(var broj:word):string;
var
a,N,N1:word;
broj1:string;
begin
N:=50;
N1:=1;
Broj10uBroj50:='';
broj1:='';
repeat
a:=trunc(broj/N1)mod N;
N1:=N1*N;
broj1:=broj1 + chr(48+a);
until trunc(broj/N1)=0;
Broj10uBroj50:=broj1;
end;

function TForm1.Broj50uBroj10(var broj:string):word;
var
i:integer;
suma:word;
n:word;
begin
suma:=1;
n:=1;
for i:=1 to Length(broj) do
begin
suma:=(ord(broj)-48)*n;
n:=n*50;
end;
Broj50uBroj10:=suma;
end;

a ovde je funkcija koja izracunava koja je varijacija tekst. ucitava tekst u slogovima po 4 znaka
moglo je to i krace ali i ovako mi je pregledno (onaj veliki blok sa if se ponavlja vise puta)

function TForm1.TekstuBroj10(var text:string):string;
var
i:integer;
suma:integer;
a,b,c,d:char;
broj:string;

begin
i:=1;
broj:='';
while i<(Length(text) - Length(text)mod 4) do
begin
suma:=1;
a:=text; b:=text[i+1]; c:=text[i+2]; d:=text[i+3];
i:=i+4;
case a of
' ':suma:=suma+22*25*25*25;
',':suma:=suma+43*25*25*25;
'.':suma:=suma+45*25*25*25;
'a'..'z':suma:=suma+(ord(a)-96)*25*25*25;
end;
case b of
' ':suma:=suma+22*25*25;
',':suma:=suma+43*25*25;
'.':suma:=suma+45*25*25;
'a'..'z':suma:=suma+(ord(b)-96)*25*25;
end;
case c of
' ':suma:=suma+22*25;
',':suma:=suma+43*25;
'.':suma:=suma+45*25;
'a'..'z':suma:=suma+(ord(c)-96)*25;
end;
case d of
' ':suma:=suma+22;
',':suma:=suma+43;
'.':suma:=suma+45;
'a'..'z':suma:=suma+(ord(d)-96);
end;
broj:=broj+IntToStr(suma)+' ';
end;

if Length(text) mod 4 <> 0 then
if length(text) mod 4 = 1 then
begin
suma:=1;
a:=text[length(text)]; b:=' '; c:=' '; d:=' ';
case a of
' ':suma:=suma+22*25*25*25;
',':suma:=suma+43*25*25*25;
'.':suma:=suma+45*25*25*25;
'a'..'z':suma:=suma+(ord(a)-96)*25*25*25;
end;
case b of
' ':suma:=suma+22*25*25;
',':suma:=suma+43*25*25;
'.':suma:=suma+45*25*25;
'a'..'z':suma:=suma+(ord(b)-96)*25*25;
end;
case c of
' ':suma:=suma+22*25;
',':suma:=suma+43*25;
'.':suma:=suma+45*25;
'a'..'z':suma:=suma+(ord(c)-96)*25;
end;
case d of
' ':suma:=suma+22;
',':suma:=suma+43;
'.':suma:=suma+45;
'a'..'z':suma:=suma+(ord(d)-96);
end;
broj:=broj+IntToStr(suma)+' ';
end
else if length(text) mod 4 = 2 then
begin
suma:=1;
a:=text[length(text)]; b:=text[length(text)-1]; c:=' '; d:=' ';
case a of
' ':suma:=suma+22*25*25*25;
',':suma:=suma+43*25*25*25;
'.':suma:=suma+45*25*25*25;
'a'..'z':suma:=suma+(ord(a)-96)*25*25*25;
end;
case b of
' ':suma:=suma+22*25*25;
',':suma:=suma+43*25*25;
'.':suma:=suma+45*25*25;
'a'..'z':suma:=suma+(ord(b)-96)*25*25;
end;
case c of
' ':suma:=suma+22*25;
',':suma:=suma+43*25;
'.':suma:=suma+45*25;
'a'..'z':suma:=suma+(ord(c)-96)*25;
end;
case d of
' ':suma:=suma+22;
',':suma:=suma+43;
'.':suma:=suma+45;
'a'..'z':suma:=suma+(ord(d)-96);
end;
broj:=broj+IntToStr(suma)+' ';
end
else if length(text) mod 4 = 3 then
begin
suma:=1;
a:=text[length(text)]; b:=text[length(text)-1]; c:=text[length(text)-3]; d:=' ';
case a of
' ':suma:=suma+22*25*25*25;
',':suma:=suma+43*25*25*25;
'.':suma:=suma+45*25*25*25;
'a'..'z':suma:=suma+(ord(a)-96)*25*25*25;
end;
case b of
' ':suma:=suma+22*25*25;
',':suma:=suma+43*25*25;
'.':suma:=suma+45*25*25;
'a'..'z':suma:=suma+(ord(b)-96)*25*25;
end;
case c of
' ':suma:=suma+22*25;
',':suma:=suma+43*25;
'.':suma:=suma+45*25;
'a'..'z':suma:=suma+(ord(c)-96)*25;
end;
case d of
' ':suma:=suma+22;
',':suma:=suma+43;
'.':suma:=suma+45;
'a'..'z':suma:=suma+(ord(d)-96);
end;
broj:=broj+IntToStr(suma)+' ';
end;
TekstuBroj10:=broj;
end;
 
Obzirom da prvih 22 elemenata ne predstavljaju jedan opseg u okviru ASCII sistema, za pronalaženje vrednosti nekog elementa ne možeš da koristiš ord funkciju ili njen rezultat moraš da modifikuješ u zavisnosti koje elemente iz skupa [a..z] ne koristiš. Najjednostavnije rešenje je da imaš dve funkcije elementToIndex i indexToElement koji će raditi te konverzije.
 
jel si shvatio kod?

jer se i ja cesto pogubim sta je sta :D

vidis pametan ti taj pristup, probacu tako sutra pa cu da javim sta ispalo, spava mi se sad, bio sam kod snayke pa me izmucila malo, sta da se radi...
 
Začudilo me je odakle ti samo 25 elemenata u tekstu zadatka kada bi moralo da ih bude 29. Onda je eksplictino navođenje skupa uređenih elementa razrešilo "misteriju". Kod nisam ni pogledao. :)

Dakle ovo nije nije ispravno na osnovu postavke zadatka:
Kod:
    if d<23 then d1:=[b]chr(d+96)[/b]

      'a'..'z':suma:=suma+([b]ord(a)-96[/b])*25*25*25;
Ima na mnogo mesta ovo su samo dva primera.
 

Back
Top