program atspek_skaiciu;
  { 110 u‘davinys }
  uses zaidimas;

  type sarasas = ^elem;
       elem = record
                ska: 1000..9999;
                tolesnis: sarasas
              end;

  function skirtingi (ket: integer): boolean;
  { ar ketur‘enklio skai‡iaus ket skaitmenys yra skirtingi }
    var aibe: set of char;
        elem_sk: integer;
        c: char;
        eil: string;
  begin
    str (ket, eil);  { skai‡ius paver‡iamas eilute }
    aibe := [eil[1]] + [eil[2]] + [eil[3]] + [eil[4]];
    elem_sk := 0;
    for c := '0' to '9' do
      if c in aibe
         then elem_sk := elem_sk + 1;
    skirtingi := elem_sk = 4;
  end; { skirtingi }

  procedure saraso_sudarymas (var s: sarasas);
    var p, p1: sarasas;
        ket: integer;
  begin
    new (p);
    p^.ska := 1023; { ma‘iausias ketur‘enklis skai‡ius, kurio }
                     { skaitmenys skirtingi }
    p1 := p;
    for ket := 1024 to 9999 do
      if skirtingi (ket)
         then begin   { traukiame skai‡i—  s…raž… }
                new (p^.tolesnis);
                p := p^.tolesnis;
                p^.ska := ket
              end;
    p^.tolesnis := nil;
    s := p1
  end; { s…ražo_sudarymas }

  function vienodi (sk1, sk2: integer): integer;
  { suskai‡iuoja, kiek skai‡iai sk1 ir sk2 turi vienod— skaitmen— }
    var aibe: set of 0..9;
        kiek: integer;
  begin
    aibe := [];
    while sk1 <> 0 do { pirmojo skai‡iaus skaitmenis ražome }
      begin                                         {  aibŠ }
        aibe := aibe + [sk1 mod 10];
        sk1 := sk1 div 10;
      end;
    kiek := 0;
    while sk2 <> 0 do   { tikriname kiek antrojo skai‡iaus skaitmen— }
      begin                                             { yra aib‚je }
        if sk2 mod 10 in aibe
           then kiek := kiek + 1;
        sk2 := sk2 div 10
      end;
    vienodi := kiek
  end;  { vienodi }

  function vietoje (sk1, sk2: integer): integer;
  { suskai‡iuoja, kiek skai‡iai sk1 ir sk2 turi vienod— skaitmen— }
  { ir tie skaitmenys yra tose pa‡iose pozicijose }
    var eil1, eil2: string[4];
        i, kiek: integer;
  begin
    str (sk1, eil1);
    str (sk2, eil2);
    kiek := 0;
    for i := 1 to 4 do
      if eil1[i] = eil2[i]
         then kiek := kiek + 1;
    vietoje := kiek
  end; { vietoje }

  procedure speti (s: sarasas);
    var sk, atsp, vietoj: integer;
        p: sarasas;
  begin
    while s <> nil do
      begin { kol s…raže daugiau nei vienas elementas }
        sk := s^.ska;
        ejimas (sk, atsp, vietoj);
        p := s;  { per‘i–r‚sime s…raž… }
        while p^.tolesnis <> nil do
          begin
            if (vienodi (sk, p^.tolesnis^.ska) <> atsp) or
               (vietoje (sk, p^.tolesnis^.ska) <> vietoj)
               then { pažalinamas elementas }
                    p^.tolesnis := p^.tolesnis^.tolesnis
               else p := p^.tolesnis
          end;
        s := s^.tolesnis; { pažalinamas pirmasis s…ražo elementas }
      end;                { nes j jau sp‚jome }
  end; { speti }

  var s: sarasas;
begin
  saraso_sudarymas (s);
  speti (s);
end.