program puzzle(input,output); (* an undocumented, compute-bound program from forest baskett *) const size = 511; (* d*d*d - 1 *) classMax = 3; typeMax = 12; d = 8; type pieceClass = 0..classMax; pieceType = 0..typeMax; position = 0..size; var pieceCount : array [pieceClass] of 0..13; class : array [pieceType] of pieceClass; pieceMax : array [pieceType] of position; puzzle : array [position] of boolean; p : array [pieceType, position] of boolean; m,n : position; i,j,k : 0..13; kount : integer; function fit (i : pieceType; j : position) : boolean; label 1; var k : position; begin fit := false; for k := 0 to pieceMax[i] do if p[i,k] then if puzzle[j+k] then goto 1; fit := true; 1: end; function place (i : pieceType; j : position) : position; label 1; var k : position; begin for k := 0 to pieceMax[i] do if p[i,k] then puzzle[j+k] := true; pieceCount[class[i]] := pieceCount[class[i]] - 1; for k := j to size do if not puzzle[k] then begin place := k; goto 1; end; writeln('puzzle filled'); place := 0; 1: end; procedure remove (i : pieceType; j : position); var k : position; begin for k := 0 to pieceMax[i] do if p[i,k] then puzzle[j+k] := false; pieceCount[class[i]] := pieceCount[class[i]] + 1; end; function trial (j : position) : boolean; label 1; var i : pieceType; k : position; begin for i := 0 to typeMax do if pieceCount[class[i]] <> 0 then if fit (i, j) then begin k := place (i, j); if trial(k) or (k = 0) then begin writeln ('piece', i+1, ' at', k+1); trial := true; goto 1; end else remove (i, j); end; trial := false; 1: kount := kount + 1; end; begin writeln('elapsed user time:',clock/1000:9:3); for m := 0 to size do puzzle[m] := true; for i := 1 to 5 do for j := 1 to 5 do for k := 1 to 5 do puzzle[i+d*(j+d*k)] := false; for i := 0 to typeMax do for m := 0 to size do p[i, m] := false; for i := 0 to 3 do for j := 0 to 1 do for k := 0 to 0 do p[0,i+d*(j+d*k)] := true; class[0] := 0; pieceMax[0] := 3+d*1+d*d*0; for i := 0 to 1 do for j := 0 to 0 do for k := 0 to 3 do p[1,i+d*(j+d*k)] := true; class[1] := 0; pieceMax[1] := 1+d*0+d*d*3; for i := 0 to 0 do for j := 0 to 3 do for k := 0 to 1 do p[2,i+d*(j+d*k)] := true; class[2] := 0; pieceMax[2] := 0+d*3+d*d*1; for i := 0 to 1 do for j := 0 to 3 do for k := 0 to 0 do p[3,i+d*(j+d*k)] := true; class[3] := 0; pieceMax[3] := 1+d*3+d*d*0; for i := 0 to 3 do for j := 0 to 0 do for k := 0 to 1 do p[4,i+d*(j+d*k)] := true; class[4] := 0; pieceMax[4] := 3+d*0+d*d*1; for i := 0 to 0 do for j := 0 to 1 do for k := 0 to 3 do p[5,i+d*(j+d*k)] := true; class[5] := 0; pieceMax[5] := 0+d*1+d*d*3; for i := 0 to 2 do for j := 0 to 0 do for k := 0 to 0 do p[6,i+d*(j+d*k)] := true; class[6] := 1; pieceMax[6] := 2+d*0+d*d*0; for i := 0 to 0 do for j := 0 to 2 do for k := 0 to 0 do p[7,i+d*(j+d*k)] := true; class[7] := 1; pieceMax[7] := 0+d*2+d*d*0; for i := 0 to 0 do for j := 0 to 0 do for k := 0 to 2 do p[8,i+d*(j+d*k)] := true; class[8] := 1; pieceMax[8] := 0+d*0+d*d*2; for i := 0 to 1 do for j := 0 to 1 do for k := 0 to 0 do p[9,i+d*(j+d*k)] := true; class[9] := 2; pieceMax[9] := 1+d*1+d*d*0; for i := 0 to 1 do for j := 0 to 0 do for k := 0 to 1 do p[10,i+d*(j+d*k)] := true; class[10] := 2; pieceMax[10] := 1+d*0+d*d*1; for i := 0 to 0 do for j := 0 to 1 do for k := 0 to 1 do p[11,i+d*(j+d*k)] := true; class[11] := 2; pieceMax[11] := 0+d*1+d*d*1; for i := 0 to 1 do for j := 0 to 1 do for k := 0 to 1 do p[12,i+d*(j+d*k)] := true; class[12] := 3; pieceMax[12] := 1+d*1+d*d*1; pieceCount[0] := 13; pieceCount[1] := 3; pieceCount[2] := 1; pieceCount[3] := 1; m := 1+d*(1+d*1); kount := 0; if fit(0, m) then n := place(0, m) else writeln('error 1'); if trial(n) then writeln('success in', kount, ' trials') else writeln('failure'); writeln('elapsed user time:',clock/1000:9:3); end.