program COUNTDWN ; {$IFDEF WINDOWS} uses WinCrt ; {$ENDIF} type A6 = array [1..6] of longint ; Opr = (Pl, Mi, Mu, Di) ; const Ops : array [Opr] of char = '+-*/' ; Sp = #32 ; var Ans : longint ; Ex : string ; const total : longint = 0 ; function I(const K : longint) : string ; var S : string ; begin Str(K, S) ; I := S end {I} ; procedure P(Got : A6 ; NL : byte ; Stk : A6 ; NS : byte ; St : string) ; forward ; procedure R(Got : A6 ; NL : byte ; Stk : A6 ; NS : byte ; St : string ; Op : Opr) ; begin St := St + Ops[Op] + Sp ; Dec(NS) ; case Op of Pl : Stk[NS] := Stk[NS] + Stk[NS+1] ; Mi : Stk[NS] := Stk[NS] - Stk[NS+1] ; Mu : Stk[NS] := Stk[NS] * Stk[NS+1] ; Di : Stk[NS] := Stk[NS] div Stk[NS+1] ; end {Op} ; if (NL=0) and (NS=1) then begin if (Stk[NS]=Ans) then Writeln(St, ' = ', Ans, ' OK ', Ex) ; Inc(total) end ; P(Got, NL, Stk, NS, St) ; end {R} ; procedure Q(Got : A6 ; NL : byte ; Stk : A6 ; NS : byte ; St : string ; K : byte) ; var GK : longint ; begin GK := Got[K] ; St := St + I(GK) + Sp ; Inc(NS) ; Stk[NS] := Got[K] ; Got[K] := Got[NL] ; Dec(NL) ; P(Got, NL, Stk, NS, St) ; end {Q} ; procedure P(Got : A6 ; NL : byte ; Stk : A6 ; NS : byte ; St : string) ; var K : byte ; Op : Opr ; begin for K := 1 to NL do Q(Got, NL, Stk, NS, St, K) ; if NS>=2 then for Op := Low(Opr) to High(Opr) do if (Op<>Di) or ((Stk[NS]<>0) and (Stk[NS-1] mod Stk[NS] =0)) then R(Got, NL, Stk, NS, St, Op) ; end {P} ; var Given, Stack : A6 ; J : byte ; begin Writeln('COUNTDWN.PAS - www.merlyn.demon.co.uk >= 1999-02-23') ; Write('?????? = ? ') ; for J := 1 to 6 do Read(Given[J]) ; Readln(Ans) ; for J := 1 to 6 do Write(Given[J]:7) ; Writeln('=>':8, Ans:8) ; Ex := '' ; P(Given, 6, Stack, 0, '') ; Writeln(Total:15) ; end.