Losowanie ośmiu znaków

0

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.

0

https://code.google.com/archive/p/delphi-standard-template-library/source/default/source?page=2
delphi-standard-template-library/test/Algorithm/next_permutation.dpr

1

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.

0

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:
user image
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.

2

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.

0

Wielkie dzięki za program :) Za poświęcony czas i nerwy ;d Pozdrawiam :)

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