Witam. Chciałbym zapytać, czy widział ktoś gdzieś w internecie gotowy program/gotową stronkę, na której mógłbym wpisać np. 8 znaków (litery oraz cyfry), a następnie algorytm zwróciłby mi wszystkie 8 znakowe kody, bez powtarzania się? bardzo proszę o pomoc, wiem, że nie jest to trudne do napisania, dlatego jeśli nie ma czegoś takiego w internecie pokombinuje sam.
https://code.google.com/archive/p/delphi-standard-template-library/source/default/source?page=2
delphi-standard-template-library/test/Algorithm/next_permutation.dpr
Dawno temu pisałem coś takiego - podaje się zbiór znaków (dowolną liczbę dowolnych znaków) oraz długość początkową i końcową generowanych słów, a następnie odpala odpowiednią metodę i wszystkie ciągi zapisywane są w pliku tekstowym;
Napisałem na ten temat artykuł - Generator słów (metoda znaczników)
Jednak kod z głównej metody jest nieco powolny, a kod klasy jak tak teraz patrzę nieco z d**y, więc na pewno wymaga poprawki; Gdzieś na dysku miałem o wiele szybszą wersję, którą przygotowywałem i testowałem dla jednego gościa, ale zapodziałem gdzieś po formacie; Jak znajdę źródła tej szybszej wersji to postaram się podać w załączniku;
Edit: znalazłem - moduł z klasą generatora dorzucam w załączniku WordsGenerator.pas
Klasa jest bardzo prosta w użyciu - wystarczy utworzyć obiekt, za pomocą metod ustalić zbiór znaków i oraz długości początkową i końcową, a na koniec wywołać metodę Generate
; Przykład użycia poniżej:
uses
WordsGenerator in 'WordsGenerator.pas';
begin
with TWordsGenerator.Create() do
try
SetChars('01XY');
SetLengths(1, 2);
Generate();
finally
Free();
end;
end.
na wyjściu dostaniemy:
0
1
X
Y
00
01
0X
0Y
10
11
1X
1Y
X0
X1
XX
XY
Y0
Y1
YX
YY
Algorytm działa w taki sposób, że generuje ciągi unikalne, więc spełnia założenia; Natomiast Ty potrzebujesz ośmioznakowych ciągów na wyjściu, więc podaj ósemki w metodzie SetLengths
:
SetLengths(8, 8);
W module WordsGenerator.pas znajduje się komentarz nad procedurą Writeln:
// W tym miejscu zmienna strWord jest gotowa do użytku;
WriteLn(strWord);
Jeśli generowane słowo (ciąg znaków) ma zostać zapisany do pliku - w miejsce procedury Writeln wstaw instrukcję zapisującą ciąg znaków do pliku (albo podaj zmienną plikową w pierwszym parametrze Writeln);
Edit2: Chyba że potrzebujesz czegoś innego, np. generowania takich ciągów, które nie posiadają zdublowanych znaków - tego powyższa klasa nie implementuje i będziesz potrzebował czegoś innego.
Cześć, dzięki wielkie za pomoc. Jestem bardzo wdzięczny :) Mam jednak problem z zapisem do pliku.
Utworzyłem obiekt, przypisałem kod, który podałeś wyżej. Następnie wszedłem do pliku WordsGenerator.pas i wybralem miejsce zapisu. Coś jednak jest nie tak, ponieważ wywala błąd (po uruchomieniu programu i naciśnięcie na obiekt Tbutton, po którym ma nastąpić zapis). Tak to wygląda u mnie:
// W tym miejscu zmienna strWord jest gotowa do użytku;
WriteLn('C:\plik.txt',strWord);
I wywala:
Pisze, że plik nie jest otwarty, póbowałem otworzyć assignem ale nie wiem co wpisać w paramterach... Próbowałem utworzyć procedure w pliku WordsGenerator ale niestety nie umiem.
Jak widzisz, użytkuje Lazarusa, kiedyś ściągnąłem delphi ale był jakiś błąd podczas instalacji. Możliwe, że nie działa, ponieważ robie to na lazarusie? Bardzo prosiłbym o pomoc.
Przecież Ty nie masz ogarniętych nawet podstaw programowania w Pascalu... Jak więc chcesz ten program napisać czy przerobić?
Coś jednak jest nie tak, ponieważ wywala błąd (po uruchomieniu programu i naciśnięcie na obiekt Tbutton, po którym ma nastąpić zapis).
Bo nie masz pojęcia co ten Writeln robi; Po to podaję linki do funkcji, abyś w nie klikał i zapoznawał się z ich opisem; Kliknij w ten podany 10 słów wcześniej - pierwszy przykład dotyczy właśnie zapisu danych dopliku tekstowego;
W załączniku WordsGen.zip podaję gotowy program konsolowy, pobierający dane od użytkownika;
Najpierw wpisujesz nazwę pliku, następnie zestaw znaków, a na koniec początkową i końcową długość słowa; Po podaniu tej ostatniej, program zaczyna generować ciągi i zapisywać je do pliku;
Przykład wyjścia konsoli:
FileName: C:\Output.txt
Chars: ABC
Start Length: 2
Stop Length: 3
--------------------------------------------------
Done - 36 strings saved
Jeśli pojawi się ostatnia linijka (z Done
) to znaczy, że program zakończył generowanie ciągów;
PS: Jeśli podasz zbiór ośmiu znaków oraz długość początkową i końcową równą 8
:
FileName: C:\Output.txt
Chars: ABCDEFGH
Start Length: 8
Stop Length: 8
--------------------------------------------------
Done - 16777216 strings saved
generowanie potrwa kilka sekund, a plik wyjściowy będzie miał rozmiar ok. 160MiB.
Wielkie dzięki za program :) Za poświęcony czas i nerwy ;d Pozdrawiam :)