Jak wygenerowac wszystkie mozliwe kombinacje z podanych przez uzytkownika znakow i dlugosci kombinacji przy czym wszystkie znaki moga sie powtarzac</delphi>
Jak wygenerowac wszystkie mozliwe kombinacje z podanych przez uzytkownika znakow i dlugosci kombinacji przy czym wszystkie znaki moga sie powtarzac
Potraktuj znaki jako "cyfry" systemu liczbowego o podstawie takiej, jak ilość tych znaków. Następnie wygeneruj wszystkie liczby w tym systemie - od 0 do (podstawa ^ długość)-1. Pamiętaj, aby uzupełnić je z przodu zerami (do otrzymania ciągów odpowiedniej długości).
Przykład: ciągi zawierające: a s d o długości 4.
a = 0
s = 1
d = 2
Zatem system trójkowy, liczb będzie (3 ^ 4) - 1 = 81 (od 0 do 80 dziesiątkowo).
0 = trójkowo 0 = a = aaaa
1 = 1 = s = aaas
...
22 = 211 = dss = adss
23 = 212 = dsd = adsd
23 = 220 = dsa = adsa
...
80 = 2222 = dddd = dddd
Kodu pisać mi się nie chce ;p ale rozwiązanie chyba dość działające (niekoniecznie optymalne). Zresztą, kod nie powinien być specjalnie trudny :> potrzebne będą jedynie jakieś metody do konwersji systemów liczbowych oraz sposób na przechowywanie liczb o podstawie większej niż 10 (jeśli nie zależy na pamięci i super-wydajności, wszystko da się załatwić TStringListą...).
Pozdrawiam,
Sorrow.
A czy nie lepiej pobawić się kobinatoryką?
To o co Ci chodzi to będą wariacje z powtórzeniami.
(...)
Zatem system trójkowy, liczb będzie (3 ^ 4) - 1 = 81 (od 0 do 80 dziesiątkowo).
0 = trójkowo 0 = a = aaaa
1 = 1 = s = aaas
...
22 = 211 = dss = adss
23 = 212 = dsd = adsd
23 = 220 = dsa = adsa
...
80 = 2222 = dddd = dddd
co znaczy
22 = 211 = dss = adss
23 = 212 = dsd = adsd
23 = 220 = dsa = adsa
??
moglby ktos kod podac. pisalem juz swoja koncepcje ale sie zapetlila i nastapilo przepelninie stosu ;-(
Wystarczy to przeciez rekurencyjnie zrobic. UWAGA. Moga byc bledy bo pisalem to od reki.
Procedure Tworz;
begin
text:= 'dom';
DlugoscTekstu:= 4;
DopiszLitery(1, '');
end;
Procedure DopiszLitery(Poz: Word; Odp: String);
var a1: Word;
begin
If Poz > DlugoscTekstu then
DodajUtworzoneSlowo(Odp)
else
For a1:= 1 to Length(Text) do
begin
Odp:= Odp + Text[a1];
DopiszLitery(Poz+1, Odp);
end;
end;
Nie wiem czy to bedzie dzialac, ale chpodi o sam sposob - rekurencyjne wywolanie fukcji ktore na konsu dodaje wszystkie mozliwe litery. Zmienna Odp przechowuje aktualnie tworzone slowo. Poz jest po to zeby zatrzymac rekurencje jesli dlugosc slowa bedzie odpowiednia.
co znaczy
22 = 211 = dss = adss
23 = 212 = dsd = adsd
23 = 220 = dsa = adsa
??
heh, dwa razy 23... literówka, miało być 24...
23 dziesiątkowo = 212 w systemie trójkowym = dsd, gdy zamienimy cyfry na literki = adsd, gdy uzupełnimy z przodu "zerem" ;P
Odrobina wyobraźni i podstawy matematyki... :>
moglby ktos kod podac. pisalem juz swoja koncepcje ale sie zapetlila i nastapilo przepelninie stosu ;-(
Podany przeze mnie sposób jest o tyle bezpieczny, że jedyne, co grozi, to przekroczenie zakresu liczbowego. Postaram się wieczorem wykombinować jakiś kod do tego.
Pozdrawiam,
Sorrow.