wszystkie mozliwe kombinacje

0

Jak wygenerowac wszystkie mozliwe kombinacje z podanych przez uzytkownika znakow i dlugosci kombinacji przy czym wszystkie znaki moga sie powtarzac</delphi>

0

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.

0

A czy nie lepiej pobawić się kobinatoryką?
To o co Ci chodzi to będą wariacje z powtórzeniami.

0

(...)
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 ;-(

0

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.

0

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.

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