Wariacje z powtórzeniami

0

Witam.
Potrzebuję funkcję która pobiera stringa, długość_kombinacji. I generuje z tego stringa wariację z powtórzeniami o długości długość kombinacji.
Wzorowałem się na tym ale nie wychodzi:
http://en.literateprograms.org/Permutations_with_repetition_%28Java%29#chunk def:usage

Szukałem w necie ale nigdzie nie ma gotowego kodu w pascalu.

0

a algorytm do brute-force to już nie łaska w google wpisać ?

0

Przykład dla trzylementowego stringa. Dla k-długiego stringa będziesz miał k pętli od 1 do k itp. Przerób to na uniwersalne rozwiązanie:

var
s,tmp: String;
r,t,y: Integer;
begin
s:='123'; tmp:='aaa';


for r:=1 to 3 do
   for t:=1 to 3 do     
          for y:=1 to 3 do
          begin

              tmp[1]:=s[r];
              tmp[2]:=s[t];
              tmp[3]:=s[y];
              memo1.Lines.Add(tmp);
          end;
          

end;
0

A jak to przerobic na uniwersalne rozwiazanie? Tak aby wariacje mialy tyle liter ile zazada uzytkownik.. Mecze sie juz z tym zadaniem kilka dni i nie moge tego wykombinowac.. Bylbym wdzieczny za jakies wsazowki.

1

A mi się wydaje, że pytającemu chodzi o Anagramy (wcześniej baran ze mnie pisałem akronimy i na szukaniu tego się skupiłem, chyba za dużo Tyskich dzisiaj pochłonąłem i przez to ta pomyłka wcześniej). Oczywiście kody obu programów znalazłem na dysku i można też sporo wygooglować w sieci. Kod w archiwum anagramy.rar generuje wszystkie możliwe kombinacje z podanych liter o minimalnej oraz maksymalnej długości równej długości wyrazu. Kod anagramy_2.rar jest mniej optymalny. Powinno się tam użyć TStringList z Duplicates ustawionymi na dupIgnore, co kiedyś w innym kodzie doradzil mi Misiekd, a nie powolnego przeszukiwaniac się TStringList powolną, bo będącą kolejną pętlą - metodą IndexOf. Jednak jeżeli z tego zrezygnujesz otrzymasz powtarzające się wyrazy. Więcej masz na google, może to Ci w czymś pomoże. Jeżeli nie to pewnie ktoś bardziej obeznany w temacie tutaj się wypowie.

1
var
        s:string;
        t:array[1..255] of integer;
        licz:integer;
 
procedure war(n,k,m:integer);
var i:integer;
begin
        inc(m);
        if m>k then begin
                inc(licz); write(licz:5, ' - ');
                for i:=1 to k do
                        write(s[t[i]]);
                writeln;
        end else 
                for i:=1 to n do begin
                        t[m]:=i;
                        war(n,k,m);
                end;
end;
 
begin
        s:='ABCDE';
        war(length(s), 3, 0);
end. 
0

dzieki wielkie, o to wlasnie chodzilo :)

0

Wirtualne piwo dla Xitami i olesio. O to właśnie chodziło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1