How to check if every digit in a number appears only once in Pascal

2 Answers

0 votes
program UniqueDigits;

uses
  SysUtils; // IntToStr

function AllDigitsUnique(n: LongInt): Boolean;
var
  s: string;
  digits: set of char;
  c: char;
begin
  s := IntToStr(n);
  digits := [];              { empty set }

  for c in s do
  begin
    if c in digits then
    begin
      AllDigitsUnique := False;
      Exit;
    end;
    Include(digits, c);      { add digit to set }
  end;

  AllDigitsUnique := True;
end;

var
  n: LongInt;

begin
  n := 123456;
  if AllDigitsUnique(n) then
    Writeln('Unique')
  else
    Writeln('Not unique');

  n := 123452;
  if AllDigitsUnique(n) then
    Writeln('Unique')
  else
    Writeln('Not unique');
end.




(*
run:

Unique
Not unique

*)

 



answered Feb 26 by avibootz
0 votes
program UniqueDigits;

{ n mod 10 extracts the last digit. }
{ 1 shl digit creates a bitmask for that digit. }
{ mask and bit checks whether the bit for this digit is already set. }
{ Mark the digit as seen: mask := mask or bit; This sets the bit for the current digit. }

function AllDigitsUnique(n: LongInt): Boolean;
var
  mask: LongInt;
  digit: Integer;
  bit: LongInt;
begin
  mask := 0;

  while n > 0 do
  begin
    digit := n mod 10;
    bit := 1 shl digit;

    if (mask and bit) <> 0 then
    begin
      AllDigitsUnique := False;  { digit already seen }
      Exit;
    end;

    mask := mask or bit;         { mark digit as seen }
    n := n div 10;
  end;

  AllDigitsUnique := True;
end;

var
  n: LongInt;

begin
  n := 123456;
  if AllDigitsUnique(n) then
    Writeln('Unique')
  else
    Writeln('Not unique');

  n := 123452;
  if AllDigitsUnique(n) then
    Writeln('Unique')
  else
    Writeln('Not unique');
end.




(*
run:

Unique
Not unique

*)

 



answered Feb 26 by avibootz
...