program set2num; type item = record c : string; g : integer; end; procedure Read_Parameters(var uit : string); { Calling sequence interpretation of: [program] [string] } var tel,k,L : integer; bekijk : string; OK : boolean; begin tel := ParamCount; if not (tel = 1) then begin Writeln; writeln('Syntax: [SET2NUM] [string]'); Halt; end; bekijk := ParamStr(1); L := Length(bekijk); OK := true; for k := 1 to L do begin if not (bekijk[k] in ['{','}']) then OK := false; end; tel := 0; for k := 1 to L do begin if bekijk[k] = '{' then tel := tel + 1; if bekijk[k] = '}' then tel := tel - 1; if tel < 0 then OK := false; end; OK := OK and (tel = 0); if not OK then begin Writeln; writeln('"',bekijk,'" is not a proper set string'); Halt; end; uit := bekijk; end; function twee(n : integer) : integer; { 2^n } begin twee := 1 shl n; end; function Getal(V : string) : integer; { Make Natural corresponding to Set (V) } var L,R : string; s,k,P,T : integer; stapel : array of item; OK : boolean; begin L := char(123); { Left bracket } R := char(125); { Right bracket } s := Length(V); SetLength(stapel,s); P := 0; for k := 1 to s do begin { Ignore commas } if V[k] = ',' then Continue; { Push if left bracket } if V[k] = L then begin stapel[P].c := L; P := P + 1; end; { Pop if right bracket } if V[k] = R then begin P := P - 1; OK := (stapel[P].c = L); { Empty Set = zero } if OK then begin stapel[P].g := 0; stapel[P].c := 'G'; end; T := 0; { Bit mapped members } while not OK do begin if stapel[P].c = 'G' then T := T or twee(stapel[P].g); P := P - 1; OK := (stapel[P].c = L); end; { Number growth } if OK then begin stapel[P].g := T; stapel[P].c := 'G'; end; P := P + 1; end; end; Getal := stapel[0].g; end; procedure doen; var uit : string; begin Read_Parameters(uit); Writeln(Getal(uit)); end; begin doen; end.