program DistinctDigitGenerator;
{$mode objfpc}
// ------------------------------------------------------------
// Function: generate_number
// Purpose: Create one integer with distinct digits, drawn from
// a shared pool of available digits. Always returns
// a 3-digit integer (leading zeros allowed).
// ------------------------------------------------------------
function generate_number(var available_digits: array of char; var available_count: integer; length: integer): integer;
var
i, idx, nz_count: integer;
non_zero_indices: array[0..9] of integer;
first_digit: char;
chosen: array[0..2] of char;
begin
// Find non-zero digits in the pool
nz_count := 0;
for i := 0 to available_count - 1 do
if available_digits[i] <> '0' then
begin
non_zero_indices[nz_count] := i;
Inc(nz_count);
end;
// Choose first digit
idx := non_zero_indices[Random(nz_count)];
first_digit := available_digits[idx];
// Remove first digit from pool
for i := idx to available_count - 2 do
available_digits[i] := available_digits[i + 1];
Dec(available_count);
// Choose remaining digits
chosen[0] := first_digit;
for i := 1 to length - 1 do
begin
idx := Random(available_count);
chosen[i] := available_digits[idx];
// Remove chosen digit
for nz_count := idx to available_count - 2 do
available_digits[nz_count] := available_digits[nz_count + 1];
Dec(available_count);
end;
// Convert to integer
Result :=
(Ord(chosen[0]) - Ord('0')) * 100 +
(Ord(chosen[1]) - Ord('0')) * 10 +
(Ord(chosen[2]) - Ord('0'));
end;
// ------------------------------------------------------------
// Function: generate_three_distinct_digit_numbers
// Purpose: Produce three integers, each with distinct digits,
// and no digit repeated across all three numbers.
// All numbers are exactly 3 digits long.
// ------------------------------------------------------------
procedure generate_three_distinct_digit_numbers(var a, b, c: integer);
var
digits: array[0..9] of char = ('0','1','2','3','4','5','6','7','8','9');
count: integer;
begin
count := 10;
a := generate_number(digits, count, 3);
b := generate_number(digits, count, 3);
c := generate_number(digits, count, 3);
end;
// ------------------------------------------------------------
// Main execution
// ------------------------------------------------------------
var
i: integer;
n1, n2, n3: integer;
begin
Randomize;
// Run the generator 5 times
for i := 1 to 5 do
begin
generate_three_distinct_digit_numbers(n1, n2, n3);
WriteLn('(', n1, ', ', n2, ', ', n3, ')');
end;
end.
(*
run:
(970, 451, 286)
(561, 984, 703)
(893, 267, 510)
(284, 509, 316)
(129, 675, 803)
*)