Berkeley Pascal PI -- Version 3.1 (9/7/85) Sun Jul 21 14:56 1985 insan.p 0 TRA4 0 1 program insane(input, output); 2 label 6 GOTO:1 6 3 1; 4 type 5 alfa = packed array[1..10] of char; 6 metaface = (notaface, front, back, top, bottom, left, right); 7 face = front .. right; 8 metapair = (notapair, one2, three4, five6); 9 pair = one2 .. five6; 10 metacolor = (notacolor, red, blue, green, white); 11 color = red .. white; 12 blockno = 1..4; 13 var 14 nosolutions: Boolean; 15 index, halfindex: integer; 16 pointr: integer; 17 datas: array[blockno, face] of alfa; 18 sum: array[blockno, pair, color] of integer; 19 halfsolution: array[blockno, 1..30] of pair; 12 TRA4 12 21 function word(alf: alfa): color; 22 begin 23 if alf = 'red' then 24 word := red else 25 if alf = 'blue' then 26 word := blue else 27 if alf = 'green' then 28 word := green else 29 word := white; patch 12 18 18 BEG:20 0 24 CASE4 12 28 CASE4 1 32 CASE2 22 34 "word" 40 LINO:23 42 RV:5 32 10 48 CONG:10 50 "red" 62 RELG EQ 10 66 IF -2 70 LINO:24 72 LV:5 44 76 CON1:1 78 RANG2:1 4 82 AS2 84 TRA -2 patch 66 20 88 LINO:25 90 RV:5 32 10 96 CONG:10 98 "blue" 110 RELG EQ 10 114 IF -2 118 LINO:26 120 LV:5 44 124 CON1:2 126 RANG2:1 4 130 AS2 132 TRA -2 patch 114 20 136 LINO:27 138 RV:5 32 10 144 CONG:10 146 "green" 158 RELG EQ 10 162 IF -2 166 LINO:28 168 LV:5 44 172 CON1:3 174 RANG2:1 4 178 AS2 180 TRA -2 patch 162 20 184 LINO:29 186 LV:5 44 190 CON1:4 192 RANG2:1 4 196 AS2 patch 180 16 patch 132 64 patch 84 112 198 END patch 18 0 30 end; 200 TRA4 200 32 procedure readin; 33 var 34 hue: alfa; 35 ch: char; 36 cube: blockno; 37 position: face; 206 TRA4 206 39 procedure tone; 40 begin 41 case ch of 42 'r': hue := 'red'; 43 'w': hue := 'white'; 44 'g': hue := 'green'; 45 'b': hue := 'blue'; 46 end; patch 206 214 214 BEG:20 0 220 CASE4 0 224 CASE4 1 228 CASE2 40 230 "tone" 236 LINO:41 238 RV1:4 -13 242 CASE1OP:4 244 .=.+8 252 CASE1 114 253 CASE1 119 254 CASE1 103 255 CASE1 98 256 TRA -2 patch 242 16 260 LINO:42 262 LV:4 -12 266 CONG:10 268 "red" 280 AS:10 282 TRA -28 patch 244 42 286 LINO:43 288 LV:4 -12 292 CONG:10 294 "white" 306 AS:10 308 TRA -54 patch 246 68 312 LINO:44 314 LV:4 -12 318 CONG:10 320 "green" 332 AS:10 334 TRA -80 patch 248 94 338 LINO:45 340 LV:4 -12 344 CONG:10 346 "blue" 358 AS:10 360 TRA -106 patch 256 106 364 END patch 214 0 47 end; 49 begin 50 for cube := 1 to 4 do 51 begin 52 for position := front to right do 53 begin 54 read(ch); 55 tone; 56 datas[cube, position] := hue; 57 end; 58 readln; 59 end; patch 200 366 366 BEG:22 0 372 CASE4 0 376 CASE4 1 380 CASE2 49 382 "readin" 390 LINO:50 392 LV:4 -20 396 CON1:1 398 AS24 400 LV:4 -24 404 CON1:4 406 AS24 408 RV4:4 -20 412 RV4:4 -24 416 REL4 LE 418 IF -2 422 LV:4 -25 426 RV4:4 -24 430 RANG42:1 4 434 AS41 436 LV:4 -25 440 RV4:4 -20 444 RANG42:1 4 448 AS41 450 LV:4 -14 454 RV14:4 -25 458 AS41 460 LINO:52 462 LV:4 -32 466 CON1:1 468 AS24 470 LV:4 -36 474 CON1:6 476 AS24 478 RV4:4 -32 482 RV4:4 -36 486 REL4 LE 488 IF -2 492 LV:4 -37 496 RV4:4 -36 500 RANG42:1 6 504 AS41 506 LV:4 -37 510 RV4:4 -32 514 RANG42:1 6 518 AS41 520 LV:4 -15 524 RV14:4 -37 528 AS41 530 LINO:54 532 UNITINP 534 LV:4 -13 538 READC 540 RSNG2:127 542 AS21 544 LINO:55 546 CALL:2 206 552 LINO:56 554 LV:2 -256 558 RV1:4 -25 562 INX2:60 1 4 568 RV1:4 -37 572 INX2:10 1 6 578 RV:4 -12 10 584 AS:10 586 LINO:52 588 RV4:4 -36 592 LV:4 -37 596 FOR1U:-78 patch 488 108 598 LINO:58 600 UNITINP 602 READLN 604 LINO:50 606 RV4:4 -24 610 LV:4 -25 614 FOR1U -168 patch 418 198 618 END patch 366 40 60 end; 620 TRA4 620 62 procedure sumcolors; 63 var 64 cube: blockno; 65 side: face; 626 TRA4 626 66 function facepair(aface: face): pair; 67 begin 68 case aface of 69 front, back: facepair := one2; 70 top, bottom: facepair := three4; 71 left, right: facepair := five6 72 end; patch 626 634 634 BEG:24 0 640 CASE4 4 644 CASE4 1 648 CASE2 67 650 "facepair" 660 LINO:68 662 RV1:7 33 666 CASE1OP:6 668 .=.+12 680 CASE1 1 681 CASE1 2 682 CASE1 3 683 CASE1 4 684 CASE1 5 685 CASE1 6 686 TRA -2 patch 666 22 patch 668 22 690 LINO:69 692 LV:7 36 696 CON1:1 698 RANG2:1 3 702 AS2 704 TRA -20 patch 670 40 patch 672 40 708 LINO:70 710 LV:7 36 714 CON1:2 716 RANG2:1 3 720 AS2 722 TRA -38 patch 674 58 patch 676 58 726 LINO:71 728 LV:7 36 732 CON1:3 734 RANG2:1 3 738 AS2 740 TRA -56 patch 686 56 744 END patch 634 0 73 end; 746 TRA4 746 75 procedure initializesum; 76 var 77 cube: blockno; 78 side: face; 79 technicolor: color; 80 begin 81 for cube := 1 to 4 do 82 for side := front to right do 83 for technicolor := red to white do 84 sum[cube, facepair(side), technicolor] := 0; patch 746 754 754 BEG:28 0 760 CASE4 0 764 CASE4 1 768 CASE2 80 770 "initializesum" 784 LINO:81 786 LV:6 -8 790 CON1:1 792 AS24 794 LV:6 -12 798 CON1:4 800 AS24 802 RV4:6 -8 806 RV4:6 -12 810 REL4 LE 812 IF -2 816 LV:6 -13 820 RV4:6 -12 824 RANG42:1 4 828 AS41 830 LV:6 -13 834 RV4:6 -8 838 RANG42:1 4 842 AS41 844 LV:6 -1 848 RV14:6 -13 852 AS41 854 LINO:82 856 LV:6 -20 860 CON1:1 862 AS24 864 LV:6 -24 868 CON1:6 870 AS24 872 RV4:6 -20 876 RV4:6 -24 880 REL4 LE 882 IF -2 886 LV:6 -25 890 RV4:6 -24 894 RANG42:1 6 898 AS41 900 LV:6 -25 904 RV4:6 -20 908 RANG42:1 6 912 AS41 914 LV:6 -2 918 RV14:6 -25 922 AS41 924 LINO:83 926 LV:6 -32 930 CON1:1 932 AS24 934 LV:6 -36 938 CON1:4 940 AS24 942 RV4:6 -32 946 RV4:6 -36 950 REL4 LE 952 IF -2 956 LV:6 -37 960 RV4:6 -36 964 RANG42:1 4 968 AS41 970 LV:6 -37 974 RV4:6 -32 978 RANG42:1 4 982 AS41 984 LV:6 -3 988 RV14:6 -37 992 AS41 994 LINO:84 996 LV:2 -448 1000 RV1:6 -13 1004 INX2:48 1 4 1010 PUSH:-4 1012 RV1:6 -25 1016 RANG2:1 6 1020 CALL:2 626 1026 INX2:16 1 3 1032 RV1:6 -37 1036 INX2:4 1 4 1042 CON1 1044 AS24 1046 LINO:83 1048 RV4:6 -36 1052 LV:6 -37 1056 FOR1U:-74 patch 952 104 1058 LINO:82 1060 RV4:6 -24 1064 LV:6 -25 1068 FOR1U -158 patch 882 188 1072 LINO:81 1074 RV4:6 -12 1078 LV:6 -13 1082 FOR1U -242 patch 812 272 1086 END patch 754 40 85 end; 87 begin 88 initializesum; 89 for cube := 1 to 4 do 90 for side := front to right do 91 sum[cube, facepair(side), word(datas[cube,side])] := 92 sum[cube, facepair(side), word(datas[cube,side])] + 1; patch 620 1090 1090 BEG:24 0 1096 CASE4 0 1100 CASE4 1 1104 CASE2 87 1106 "sumcolors" 1116 LINO:88 1118 CALL:2 746 1124 LINO:89 1126 LV:4 -8 1130 CON1:1 1132 AS24 1134 LV:4 -12 1138 CON1:4 1140 AS24 1142 RV4:4 -8 1146 RV4:4 -12 1150 REL4 LE 1152 IF -2 1156 LV:4 -13 1160 RV4:4 -12 1164 RANG42:1 4 1168 AS41 1170 LV:4 -13 1174 RV4:4 -8 1178 RANG42:1 4 1182 AS41 1184 LV:4 -1 1188 RV14:4 -13 1192 AS41 1194 LINO:90 1196 LV:4 -20 1200 CON1:1 1202 AS24 1204 LV:4 -24 1208 CON1:6 1210 AS24 1212 RV4:4 -20 1216 RV4:4 -24 1220 REL4 LE 1222 IF -2 1226 LV:4 -25 1230 RV4:4 -24 1234 RANG42:1 6 1238 AS41 1240 LV:4 -25 1244 RV4:4 -20 1248 RANG42:1 6 1252 AS41 1254 LV:4 -2 1258 RV14:4 -25 1262 AS41 1264 LINO:91 1266 LV:2 -448 1270 RV1:4 -13 1274 INX2:48 1 4 1280 PUSH:-4 1282 RV1:4 -25 1286 RANG2:1 6 1290 CALL:2 626 1296 INX2:16 1 3 1302 PUSH:-4 1304 LV:2 -256 1308 RV1:4 -13 1312 INX2:60 1 4 1318 RV1:4 -25 1322 INX2:10 1 6 1328 IND:10 1330 CALL:1 12 1336 INX2:4 1 4 1342 LV:2 -448 1346 RV1:4 -13 1350 INX2:48 1 4 1356 PUSH:-4 1358 RV1:4 -25 1362 RANG2:1 6 1366 CALL:2 626 1372 INX2:16 1 3 1378 PUSH:-4 1380 LV:2 -256 1384 RV1:4 -13 1388 INX2:60 1 4 1394 RV1:4 -25 1398 INX2:10 1 6 1404 IND:10 1406 CALL:1 12 1412 INX2:4 1 4 1418 IND4 1420 CON1:1 1422 ADD24 1424 AS4 1426 LINO:90 1428 RV4:4 -24 1432 LV:4 -25 1436 FOR1U -186 patch 1222 216 1440 LINO:89 1442 RV4:4 -12 1446 LV:4 -13 1450 FOR1U -270 patch 1152 300 1454 END patch 1090 28 93 end; 1456 TRA4 1456 95 procedure find2222; 96 var 97 subtotals: array[red..white] of integer; 98 pair1, pair2, pair3, pair4: pair; 1462 TRA4 1462 100 function two222(pair1, pair2, pair3, pair4: pair): Boolean; 101 var 102 hue: color; 103 begin 104 for hue := red to white do 105 subtotals[hue] := 106 sum[1, pair1, hue]+ 107 sum[2, pair2, hue]+ 108 sum[3, pair3, hue]+ 109 sum[4, pair4, hue]; 110 if (subtotals[red]=2) and 111 (subtotals[blue]=2) and 112 (subtotals[green]=2) and 113 (subtotals[white]=2) then 114 two222 := true else 115 two222 := false; patch 1462 1470 1470 BEG:22 0 1476 CASE4 16 1480 CASE4 1 1484 CASE2 103 1486 "two222" 1494 LINO:104 1496 LV:6 -8 1500 CON1:1 1502 AS24 1504 LV:6 -12 1508 CON1:4 1510 AS24 1512 RV4:6 -8 1516 RV4:6 -12 1520 REL4 LE 1522 IF -2 1526 LV:6 -13 1530 RV4:6 -12 1534 RANG42:1 4 1538 AS41 1540 LV:6 -13 1544 RV4:6 -8 1548 RANG42:1 4 1552 AS41 1554 LV:6 -1 1558 RV14:6 -13 1562 AS41 1564 LINO:105 1566 LV:4 -16 1570 RV1:6 -13 1574 INX2:4 1 4 1580 LV:2 -448 1584 RV1:7 45 1588 INX2:16 1 3 1594 RV1:6 -13 1598 INX2:4 1 4 1604 IND4 1606 LV:2 -448 1610 CON1:48 1612 ADD24 1614 RV1:7 41 1618 INX2:16 1 3 1624 RV1:6 -13 1628 INX2:4 1 4 1634 IND4 1636 ADD4 1638 LV:2 -448 1642 CON1:96 1644 ADD24 1646 RV1:7 37 1650 INX2:16 1 3 1656 RV1:6 -13 1660 INX2:4 1 4 1666 IND4 1668 ADD4 1670 LV:2 -448 1674 CON2 144 1678 ADD24 1680 RV1:7 33 1684 INX2:16 1 3 1690 RV1:6 -13 1694 INX2:4 1 4 1700 IND4 1702 ADD4 1704 AS4 1706 LINO:104 1708 RV4:6 -12 1712 LV:6 -13 1716 FOR1U -166 patch 1522 196 1720 LINO:110 1722 LV:4 -16 1726 IND4 1728 CON1:2 1730 REL24 EQ 1732 LV:4 -16 1736 CON1:4 1738 ADD24 1740 IND4 1742 CON1:2 1744 REL24 EQ 1746 AND 1748 LV:4 -16 1752 CON1:8 1754 ADD24 1756 IND4 1758 CON1:2 1760 REL24 EQ 1762 AND 1764 LV:4 -16 1768 CON1:12 1770 ADD24 1772 IND4 1774 CON1:2 1776 REL24 EQ 1778 AND 1780 IF -2 1784 LINO:114 1786 LV:7 48 1790 CON1:1 1792 RSNG2:1 1794 AS2 1796 TRA -2 patch 1780 18 1800 LINO:115 1802 LV:7 48 1806 CON1 1808 RSNG2:1 1810 AS2 patch 1796 14 1812 END patch 1470 16 116 end; 1814 TRA4 1814 118 procedure listsolution; 119 begin 120 halfsolution[1, halfindex] := pair1; 121 halfsolution[2, halfindex] := pair2; 122 halfsolution[3, halfindex] := pair3; 123 halfsolution[4, halfindex] := pair4; 124 halfindex := halfindex + 1; patch 1814 1822 1822 BEG:28 0 1828 CASE4 0 1832 CASE4 1 1836 CASE2 119 1838 "listsolution" 1852 LINO:120 1854 LV:2 -568 1858 RV4:2 -12 1862 INX4:1 1 30 1868 RV1:4 -17 1872 RANG2:1 3 1876 AS21 1878 LINO:121 1880 LV:2 -568 1884 CON1:30 1886 ADD24 1888 RV4:2 -12 1892 INX4:1 1 30 1898 RV1:4 -18 1902 RANG2:1 3 1906 AS21 1908 LINO:122 1910 LV:2 -568 1914 CON1:60 1916 ADD24 1918 RV4:2 -12 1922 INX4:1 1 30 1928 RV1:4 -19 1932 RANG2:1 3 1936 AS21 1938 LINO:123 1940 LV:2 -568 1944 CON1:90 1946 ADD24 1948 RV4:2 -12 1952 INX4:1 1 30 1958 RV1:4 -20 1962 RANG2:1 3 1966 AS21 1968 LINO:124 1970 LV:2 -12 1974 RV4:2 -12 1978 CON1:1 1980 ADD24 1982 AS4 1984 END patch 1822 0 125 end; 127 begin 128 halfindex := 1; 129 for pair1 := one2 to five6 do 130 for pair2 := one2 to five6 do 131 for pair3 := one2 to five6 do 132 for pair4 := one2 to five6 do 133 if two222(pair1, pair2, pair3, pair4) then 134 listsolution; 135 if halfindex <= 2 then 136 begin 137 nosolutions := true; 138 goto 1; 139 end; patch 1456 1986 1986 BEG:24 0 1992 CASE4 0 1996 CASE4 1 2000 CASE2 127 2002 "find2222" 2012 LINO 128 2016 LV:2 -12 2020 CON1:1 2022 AS24 2024 LINO 129 2028 LV:4 -24 2032 CON1:1 2034 AS24 2036 LV:4 -28 2040 CON1:3 2042 AS24 2044 RV4:4 -24 2048 RV4:4 -28 2052 REL4 LE 2054 IF -2 2058 LV:4 -29 2062 RV4:4 -28 2066 RANG42:1 3 2070 AS41 2072 LV:4 -29 2076 RV4:4 -24 2080 RANG42:1 3 2084 AS41 2086 LV:4 -17 2090 RV14:4 -29 2094 AS41 2096 LINO 130 2100 LV:4 -36 2104 CON1:1 2106 AS24 2108 LV:4 -40 2112 CON1:3 2114 AS24 2116 RV4:4 -36 2120 RV4:4 -40 2124 REL4 LE 2126 IF -2 2130 LV:4 -41 2134 RV4:4 -40 2138 RANG42:1 3 2142 AS41 2144 LV:4 -41 2148 RV4:4 -36 2152 RANG42:1 3 2156 AS41 2158 LV:4 -18 2162 RV14:4 -41 2166 AS41 2168 LINO 131 2172 LV:4 -48 2176 CON1:1 2178 AS24 2180 LV:4 -52 2184 CON1:3 2186 AS24 2188 RV4:4 -48 2192 RV4:4 -52 2196 REL4 LE 2198 IF -2 2202 LV:4 -53 2206 RV4:4 -52 2210 RANG42:1 3 2214 AS41 2216 LV:4 -53 2220 RV4:4 -48 2224 RANG42:1 3 2228 AS41 2230 LV:4 -19 2234 RV14:4 -53 2238 AS41 2240 LINO 132 2244 LV:4 -60 2248 CON1:1 2250 AS24 2252 LV:4 -64 2256 CON1:3 2258 AS24 2260 RV4:4 -60 2264 RV4:4 -64 2268 REL4 LE 2270 IF -2 2274 LV:4 -65 2278 RV4:4 -64 2282 RANG42:1 3 2286 AS41 2288 LV:4 -65 2292 RV4:4 -60 2296 RANG42:1 3 2300 AS41 2302 LV:4 -20 2306 RV14:4 -65 2310 AS41 2312 LINO 133 2316 PUSH:-4 2318 RV1:4 -29 2322 RANG2:1 3 2326 RV1:4 -41 2330 RANG2:1 3 2334 RV1:4 -53 2338 RANG2:1 3 2342 RV1:4 -65 2346 RANG2:1 3 2350 CALL:2 1462 2356 IF -2 2360 LINO 134 2364 CALL:2 1814 patch 2356 12 2370 LINO 132 2374 RV4:4 -64 2378 LV:4 -65 2382 FOR1U:-82 patch 2270 112 2384 LINO 131 2388 RV4:4 -52 2392 LV:4 -53 2396 FOR1U -170 patch 2198 200 2400 LINO 130 2404 RV4:4 -40 2408 LV:4 -41 2412 FOR1U -258 patch 2126 288 2416 LINO 129 2420 RV4:4 -28 2424 LV:4 -29 2428 FOR1U -346 patch 2054 376 2432 LINO 135 2436 RV4:2 -12 2440 CON1:2 2442 REL24 LE 2444 IF -2 2448 LINO 137 2452 LV:2 -1 2456 CON1:1 2458 RSNG2:1 2460 AS21 2462 LINO 138 2466 TRA4 6 patch 2444 26 2472 END patch 1986 68 140 end; 2474 TRA4 2474 142 procedure simultaneous; 143 var 144 done: Boolean; 145 begin 146 nosolutions := false; 147 pointr := 0; 148 done := false; 149 repeat 150 pointr := pointr + 1; 151 repeat 152 index := succ(pointr); 153 if (halfsolution[1, pointr]<>halfsolution[1,index]) and 154 (halfsolution[2, pointr]<>halfsolution[2,index]) and 155 (halfsolution[3, pointr]<>halfsolution[3,index]) and 156 (halfsolution[4, pointr]<>halfsolution[4,index]) then 157 done := true else 158 index := index + 1; 159 until done or (index = pred(halfindex)); 160 until done or (pointr = halfindex); 161 if pointr = halfindex then 162 begin 163 nosolutions := true; 164 goto 1; 165 end; patch 2474 2482 2482 BEG:28 0 2488 CASE4 0 2492 CASE4 1 2496 CASE2 145 2498 "simultaneous" 2512 LINO 146 2516 LV:2 -1 2520 CON1 2522 RSNG2:1 2524 AS21 2526 LINO 147 2530 LV:2 -16 2534 CON1 2536 AS24 2538 LINO 148 2542 LV:4 -1 2546 CON1 2548 RSNG2:1 2550 AS21 2552 LINO 150 2556 LV:2 -16 2560 RV4:2 -16 2564 CON1:1 2566 ADD24 2568 AS4 2570 LINO 152 2574 LV:2 -8 2578 RV4:2 -16 2582 SUCC4 -2147483648 2147483647 2592 AS4 2594 LINO 153 2598 LV:2 -568 2602 RV4:2 -16 2606 INX4:1 1 30 2612 IND1 2614 LV:2 -568 2618 RV4:2 -8 2622 INX4:1 1 30 2628 IND1 2630 REL2 NE 2632 LV:2 -568 2636 CON1:30 2638 ADD24 2640 RV4:2 -16 2644 INX4:1 1 30 2650 IND1 2652 LV:2 -568 2656 CON1:30 2658 ADD24 2660 RV4:2 -8 2664 INX4:1 1 30 2670 IND1 2672 REL2 NE 2674 AND 2676 LV:2 -568 2680 CON1:60 2682 ADD24 2684 RV4:2 -16 2688 INX4:1 1 30 2694 IND1 2696 LV:2 -568 2700 CON1:60 2702 ADD24 2704 RV4:2 -8 2708 INX4:1 1 30 2714 IND1 2716 REL2 NE 2718 AND 2720 LV:2 -568 2724 CON1:90 2726 ADD24 2728 RV4:2 -16 2732 INX4:1 1 30 2738 IND1 2740 LV:2 -568 2744 CON1:90 2746 ADD24 2748 RV4:2 -8 2752 INX4:1 1 30 2758 IND1 2760 REL2 NE 2762 AND 2764 IF -2 2768 LINO 157 2772 LV:4 -1 2776 CON1:1 2778 RSNG2:1 2780 AS21 2782 TRA -2 patch 2764 20 2786 LINO 158 2790 LV:2 -8 2794 RV4:2 -8 2798 CON1:1 2800 ADD24 2802 AS4 patch 2782 20 2804 RV1:4 -1 2808 RV4:2 -8 2812 RV4:2 -12 2816 PRED4 -2147483648 2147483647 2826 REL4 EQ 2828 OR 2830 IF -262 2834 RV1:4 -1 2838 RV4:2 -16 2842 RV4:2 -12 2846 REL4 EQ 2848 OR 2850 IF -300 2854 LINO 161 2858 RV4:2 -16 2862 RV4:2 -12 2866 REL4 EQ 2868 IF -2 2872 LINO 163 2876 LV:2 -1 2880 CON1:1 2882 RSNG2:1 2884 AS21 2886 LINO 164 2890 TRA4 6 patch 2868 26 2896 END patch 2482 4 166 end; 2898 TRA4 2898 168 procedure rearrange; 169 var 170 box: blockno; 171 a, b: pair; 2904 TRA4 2904 173 procedure put(a, b: pair); 174 var 175 old1, new1, old2, new2: face; 176 save1, save2: alfa; 2910 TRA4 2910 178 procedure oldpair(c: pair); 179 begin 180 case c of 181 one2: 182 begin 183 old1 := front; 184 old2 := back; 185 end; 186 three4: 187 begin 188 old1 := top; 189 old2 := bottom; 190 end; 191 five6: 192 begin 193 old1 := left; 194 old2 := right; 195 end 196 end; patch 2910 2918 2918 BEG:22 0 2924 CASE4 4 2928 CASE4 1 2932 CASE2 179 2934 "oldpair" 2942 LINO 180 2946 RV1:9 33 2950 CASE1OP:3 2952 .=.+6 2958 CASE1 1 2959 CASE1 2 2960 CASE1 3 2962 TRA -2 patch 2950 14 2966 LINO 183 2970 LV:6 -1 2974 CON1:1 2976 RANG2:1 6 2980 AS21 2982 LINO 184 2986 LV:6 -3 2990 CON1:2 2992 RANG2:1 6 2996 AS21 2998 TRA -38 patch 2952 50 3002 LINO 188 3006 LV:6 -1 3010 CON1:3 3012 RANG2:1 6 3016 AS21 3018 LINO 189 3022 LV:6 -3 3026 CON1:4 3028 RANG2:1 6 3032 AS21 3034 TRA -74 patch 2954 86 3038 LINO 193 3042 LV:6 -1 3046 CON1:5 3048 RANG2:1 6 3052 AS21 3054 LINO 194 3058 LV:6 -3 3062 CON1:6 3064 RANG2:1 6 3068 AS21 3070 TRA -110 patch 2962 110 3074 END patch 2918 0 197 end; 3076 TRA4 3076 198 procedure newpair(d: pair); 199 begin 200 oldpair(b); 201 new1 := old1; 202 new2 := old2; patch 3076 3082 3082 BEG:22 0 3088 CASE4 4 3092 CASE4 1 3096 CASE2 199 3098 "newpair" 3106 LINO 200 3110 RV1:7 33 3114 RANG2:1 3 3118 CALL:3 2910 3124 LINO 201 3128 LV:6 -2 3132 RV1:6 -1 3136 RANG2:1 6 3140 AS21 3142 LINO 202 3146 LV:6 -4 3150 RV1:6 -3 3154 RANG2:1 6 3158 AS21 203 end; In procedure newpair: w - variable d is never used 3160 END patch 3082 0 205 begin 206 newpair(b); 207 oldpair(a); 208 save1 := datas[box, new1]; 209 datas[box, new1] := datas[box, old1]; 210 datas[box, old1] := save1; 211 save2 := datas[box, new2]; 212 datas[box, new2] := datas[box, old2]; 213 datas[box, old2] := save2; patch 2904 3162 3162 BEG:18 0 3168 CASE4 8 3172 CASE4 1 3176 CASE2 205 3178 "put" 3182 LINO 206 3186 RV1:7 33 3190 RANG2:1 3 3194 CALL:3 3076 3200 LINO 207 3204 RV1:7 37 3208 RANG2:1 3 3212 CALL:3 2910 3218 LINO 208 3222 LV:6 -16 3226 LV:2 -256 3230 RV1:4 -1 3234 INX2:60 1 4 3240 RV1:6 -2 3244 INX2:10 1 6 3250 IND:10 3252 AS:10 3254 LINO 209 3258 LV:2 -256 3262 RV1:4 -1 3266 INX2:60 1 4 3272 RV1:6 -2 3276 INX2:10 1 6 3282 LV:2 -256 3286 RV1:4 -1 3290 INX2:60 1 4 3296 RV1:6 -1 3300 INX2:10 1 6 3306 IND:10 3308 AS:10 3310 LINO 210 3314 LV:2 -256 3318 RV1:4 -1 3322 INX2:60 1 4 3328 RV1:6 -1 3332 INX2:10 1 6 3338 RV:6 -16 10 3344 AS:10 3346 LINO 211 3350 LV:6 -28 3354 LV:2 -256 3358 RV1:4 -1 3362 INX2:60 1 4 3368 RV1:6 -4 3372 INX2:10 1 6 3378 IND:10 3380 AS:10 3382 LINO 212 3386 LV:2 -256 3390 RV1:4 -1 3394 INX2:60 1 4 3400 RV1:6 -4 3404 INX2:10 1 6 3410 LV:2 -256 3414 RV1:4 -1 3418 INX2:60 1 4 3424 RV1:6 -3 3428 INX2:10 1 6 3434 IND:10 3436 AS:10 3438 LINO 213 3442 LV:2 -256 3446 RV1:4 -1 3450 INX2:60 1 4 3456 RV1:6 -3 3460 INX2:10 1 6 3466 RV:6 -28 10 3472 AS:10 3474 END patch 3162 28 214 end; 216 begin 217 for box := 1 to 4 do 218 begin 219 a := halfsolution[box, pointr]; 220 b := halfsolution[box, index]; 221 if (a=one2) and (b=five6) then 222 put(five6, three4) else 223 begin 224 if a = three4 then 225 begin 226 if b = one2 then 227 begin 228 put(one2, five6); 229 put(three4, one2); 230 put(five6, three4); 231 end else 232 begin 233 put(three4, one2); 234 put(five6, three4); 235 end 236 end else 237 if b = one2 then 238 begin 239 put(one2, three4); 240 put(five6, one2); 241 end else 242 put(five6, one2); 243 end; 244 end; patch 2898 3478 3478 BEG:24 0 3484 CASE4 0 3488 CASE4 1 3492 CASE2 216 3494 "rearrange" 3504 LINO 217 3508 LV:4 -8 3512 CON1:1 3514 AS24 3516 LV:4 -12 3520 CON1:4 3522 AS24 3524 RV4:4 -8 3528 RV4:4 -12 3532 REL4 LE 3534 IF -2 3538 LV:4 -13 3542 RV4:4 -12 3546 RANG42:1 4 3550 AS41 3552 LV:4 -13 3556 RV4:4 -8 3560 RANG42:1 4 3564 AS41 3566 LV:4 -1 3570 RV14:4 -13 3574 AS41 3576 LINO 219 3580 LV:4 -2 3584 LV:2 -568 3588 RV1:4 -13 3592 INX2:30 1 4 3598 RV4:2 -16 3602 INX4:1 1 30 3608 IND1 3610 RANG2:1 3 3614 AS21 3616 LINO 220 3620 LV:4 -3 3624 LV:2 -568 3628 RV1:4 -13 3632 INX2:30 1 4 3638 RV4:2 -8 3642 INX4:1 1 30 3648 IND1 3650 RANG2:1 3 3654 AS21 3656 LINO 221 3660 RV1:4 -2 3664 CON1:1 3666 REL2 EQ 3668 RV1:4 -3 3672 CON1:3 3674 REL2 EQ 3676 AND 3678 IF -2 3682 LINO 222 3686 CON1:3 3688 RANG2:1 3 3692 CON1:2 3694 RANG2:1 3 3698 CALL:2 2904 3704 TRA -2 patch 3678 28 3708 LINO 224 3712 RV1:4 -2 3716 CON1:2 3718 REL2 EQ 3720 IF -2 3724 LINO 226 3728 RV1:4 -3 3732 CON1:1 3734 REL2 EQ 3736 IF -2 3740 LINO 228 3744 CON1:1 3746 RANG2:1 3 3750 CON1:3 3752 RANG2:1 3 3756 CALL:2 2904 3762 LINO 229 3766 CON1:2 3768 RANG2:1 3 3772 CON1:1 3774 RANG2:1 3 3778 CALL:2 2904 3784 LINO 230 3788 CON1:3 3790 RANG2:1 3 3794 CON1:2 3796 RANG2:1 3 3800 CALL:2 2904 3806 TRA -2 patch 3736 72 3810 LINO 233 3814 CON1:2 3816 RANG2:1 3 3820 CON1:1 3822 RANG2:1 3 3826 CALL:2 2904 3832 LINO 234 3836 CON1:3 3838 RANG2:1 3 3842 CON1:2 3844 RANG2:1 3 3848 CALL:2 2904 patch 3806 46 3854 TRA -2 patch 3720 136 3858 LINO 237 3862 RV1:4 -3 3866 CON1:1 3868 REL2 EQ 3870 IF -2 3874 LINO 239 3878 CON1:1 3880 RANG2:1 3 3884 CON1:2 3886 RANG2:1 3 3890 CALL:2 2904 3896 LINO 240 3900 CON1:3 3902 RANG2:1 3 3906 CON1:1 3908 RANG2:1 3 3912 CALL:2 2904 3918 TRA -2 patch 3870 50 3922 LINO 242 3926 CON1:3 3928 RANG2:1 3 3932 CON1:1 3934 RANG2:1 3 3938 CALL:2 2904 patch 3918 24 patch 3854 88 patch 3704 238 3944 LINO 217 3948 RV4:4 -12 3952 LV:4 -13 3956 FOR1U -394 patch 3534 424 3960 END patch 3478 16 245 end; 3962 TRA4 3962 247 procedure correct; 248 var 249 list: array[1..8] of integer; 250 done: Boolean; 251 side: face; 252 counter: integer; 3968 TRA4 3968 254 procedure check; 255 var 256 delux: array[red..white] of integer; 257 kolor: color; 258 counter: integer; 259 begin 260 done := true; 261 for kolor := red to white do 262 for counter := 1 to 4 do 263 delux[kolor] := 0; 264 for counter := 1 to 4 do 265 begin 266 delux[word(datas[counter,side])] := 267 delux[word(datas[counter,side])] + 1; 268 if delux[word(datas[counter,side])] >= 2 then 269 done := false; 270 end; patch 3968 3974 3974 BEG:20 0 3980 CASE4 0 3984 CASE4 1 3988 CASE2 259 3990 "check" 3996 LINO 260 4000 LV:4 -33 4004 CON1:1 4006 RSNG2:1 4008 AS21 4010 LINO 261 4014 LV:6 -28 4018 CON1:1 4020 AS24 4022 LV:6 -32 4026 CON1:4 4028 AS24 4030 RV4:6 -28 4034 RV4:6 -32 4038 REL4 LE 4040 IF -2 4044 LV:6 -33 4048 RV4:6 -32 4052 RANG42:1 4 4056 AS41 4058 LV:6 -33 4062 RV4:6 -28 4066 RANG42:1 4 4070 AS41 4072 LV:6 -17 4076 RV14:6 -33 4080 AS41 4082 LINO 262 4086 LV:6 -40 4090 CON1:1 4092 AS24 4094 LV:6 -44 4098 CON1:4 4100 AS24 4102 RV4:6 -40 4106 RV4:6 -44 4110 REL4 LE 4112 IF -2 4116 LV:6 -48 4120 RV4:6 -44 4124 AS4 4126 LV:6 -48 4130 RV4:6 -40 4134 AS4 4136 LV:6 -24 4140 RV4:6 -48 4144 AS4 4146 LINO 263 4150 LV:6 -16 4154 RV1:6 -33 4158 INX2:4 1 4 4164 CON1 4166 AS24 4168 LINO 262 4172 RV4:6 -44 4176 LV:6 -48 4180 FOR4U:-46 patch 4112 68 4182 LINO 261 4186 RV4:6 -32 4190 LV:6 -33 4194 FOR1U:-124 patch 4040 154 4196 LINO 264 4200 LV:6 -52 4204 CON1:1 4206 AS24 4208 LV:6 -56 4212 CON1:4 4214 AS24 4216 RV4:6 -52 4220 RV4:6 -56 4224 REL4 LE 4226 IF -2 4230 LV:6 -60 4234 RV4:6 -56 4238 AS4 4240 LV:6 -60 4244 RV4:6 -52 4248 AS4 4250 LV:6 -24 4254 RV4:6 -60 4258 AS4 4260 LINO 266 4264 LV:6 -16 4268 PUSH:-4 4270 LV:2 -256 4274 RV4:6 -60 4278 INX4:60 1 4 4284 RV1:4 -34 4288 INX2:10 1 6 4294 IND:10 4296 CALL:1 12 4302 INX2:4 1 4 4308 LV:6 -16 4312 PUSH:-4 4314 LV:2 -256 4318 RV4:6 -60 4322 INX4:60 1 4 4328 RV1:4 -34 4332 INX2:10 1 6 4338 IND:10 4340 CALL:1 12 4346 INX2:4 1 4 4352 IND4 4354 CON1:1 4356 ADD24 4358 AS4 4360 LINO 268 4364 LV:6 -16 4368 PUSH:-4 4370 LV:2 -256 4374 RV4:6 -60 4378 INX4:60 1 4 4384 RV1:4 -34 4388 INX2:10 1 6 4394 IND:10 4396 CALL:1 12 4402 INX2:4 1 4 4408 IND4 4410 CON1:2 4412 REL24 GE 4414 IF -2 4418 LINO 269 4422 LV:4 -33 4426 CON1 4428 RSNG2:1 4430 AS21 patch 4414 16 4432 LINO 264 4436 RV4:6 -56 4440 LV:6 -60 4444 FOR4U -198 patch 4226 220 4448 END patch 3974 60 271 end; 4450 TRA4 4450 273 procedure rotate; 274 var 275 save: alfa; 276 opposite: face; 277 begin 278 if side = back then 279 opposite := front else 280 if side = front then 281 opposite := back else 282 if side = top then 283 opposite := bottom else 284 if side = bottom then 285 opposite := top; 286 save := datas[list[counter], side]; 287 datas[list[counter], side] := datas[list[counter], opposite]; 288 datas[list[counter], opposite] := save; patch 4450 4458 4458 BEG:22 0 4464 CASE4 0 4468 CASE4 1 4472 CASE2 277 4474 "rotate" 4482 LINO 278 4486 RV1:4 -34 4490 CON1:2 4492 REL2 EQ 4494 IF -2 4498 LINO 279 4502 LV:6 -13 4506 CON1:1 4508 RANG2:1 6 4512 AS21 4514 TRA -2 patch 4494 22 4518 LINO 280 4522 RV1:4 -34 4526 CON1:1 4528 REL2 EQ 4530 IF -2 4534 LINO 281 4538 LV:6 -13 4542 CON1:2 4544 RANG2:1 6 4548 AS21 4550 TRA -2 patch 4530 22 4554 LINO 282 4558 RV1:4 -34 4562 CON1:3 4564 REL2 EQ 4566 IF -2 4570 LINO 283 4574 LV:6 -13 4578 CON1:4 4580 RANG2:1 6 4584 AS21 4586 TRA -2 patch 4566 22 4590 LINO 284 4594 RV1:4 -34 4598 CON1:4 4600 REL2 EQ 4602 IF -2 4606 LINO 285 4610 LV:6 -13 4614 CON1:3 4616 RANG2:1 6 4620 AS21 patch 4602 18 patch 4586 34 patch 4550 70 patch 4514 106 4622 LINO 286 4626 LV:6 -12 4630 LV:2 -256 4634 LV:4 -32 4638 RV4:4 -40 4642 INX4:4 1 8 4648 IND4 4650 INX4:60 1 4 4656 RV1:4 -34 4660 INX2:10 1 6 4666 IND:10 4668 AS:10 4670 LINO 287 4674 LV:2 -256 4678 LV:4 -32 4682 RV4:4 -40 4686 INX4:4 1 8 4692 IND4 4694 INX4:60 1 4 4700 RV1:4 -34 4704 INX2:10 1 6 4710 LV:2 -256 4714 LV:4 -32 4718 RV4:4 -40 4722 INX4:4 1 8 4728 IND4 4730 INX4:60 1 4 4736 RV1:6 -13 4740 INX2:10 1 6 4746 IND:10 4748 AS:10 4750 LINO 288 4754 LV:2 -256 4758 LV:4 -32 4762 RV4:4 -40 4766 INX4:4 1 8 4772 IND4 4774 INX4:60 1 4 4780 RV1:6 -13 4784 INX2:10 1 6 4790 RV:6 -12 10 4796 AS:10 4798 END patch 4458 16 289 end; 291 begin 292 list[1] := 4; 293 list[2] := 3; 294 list[3] := 4; 295 list[4] := 2; 296 list[5] := 4; 297 list[6] := 3; 298 list[7] := 4; 299 list[8] := 3; 300 for side := back to top do 301 begin 302 counter := 0; 303 check; 304 while not done do 305 begin 306 counter := counter + 1; 307 rotate; 308 check; 309 end; 310 end patch 3962 4802 4802 BEG:22 0 4808 CASE4 0 4812 CASE4 1 4816 CASE2 291 4818 "correct" 4826 LINO 292 4830 LV:4 -32 4834 CON1:4 4836 AS24 4838 LINO 293 4842 LV:4 -32 4846 CON1:4 4848 ADD24 4850 CON1:3 4852 AS24 4854 LINO 294 4858 LV:4 -32 4862 CON1:8 4864 ADD24 4866 CON1:4 4868 AS24 4870 LINO 295 4874 LV:4 -32 4878 CON1:12 4880 ADD24 4882 CON1:2 4884 AS24 4886 LINO 296 4890 LV:4 -32 4894 CON1:16 4896 ADD24 4898 CON1:4 4900 AS24 4902 LINO 297 4906 LV:4 -32 4910 CON1:20 4912 ADD24 4914 CON1:3 4916 AS24 4918 LINO 298 4922 LV:4 -32 4926 CON1:24 4928 ADD24 4930 CON1:4 4932 AS24 4934 LINO 299 4938 LV:4 -32 4942 CON1:28 4944 ADD24 4946 CON1:3 4948 AS24 4950 LINO 300 4954 LV:4 -44 4958 CON1:2 4960 AS24 4962 LV:4 -48 4966 CON1:3 4968 AS24 4970 RV4:4 -44 4974 RV4:4 -48 4978 REL4 LE 4980 IF -2 4984 LV:4 -49 4988 RV4:4 -48 4992 RANG42:1 6 4996 AS41 4998 LV:4 -49 5002 RV4:4 -44 5006 RANG42:1 6 5010 AS41 5012 LV:4 -34 5016 RV14:4 -49 5020 AS41 5022 LINO 302 5026 LV:4 -40 5030 CON1 5032 AS24 5034 LINO 303 5038 CALL:2 3968 5044 LINO 304 5048 RV1:4 -33 5052 NOT 5054 IF -2 5058 LINO 306 5062 LV:4 -40 5066 RV4:4 -40 5070 CON1:1 5072 ADD24 5074 AS4 5076 LINO 307 5080 CALL:2 4450 5086 LINO 308 5090 CALL:2 3968 5096 TRA -54 patch 5054 44 5100 LINO 300 5104 RV4:4 -48 5108 LV:4 -49 5112 FOR1U:-102 patch 4980 132 5114 END patch 4802 52 311 end; 5116 TRA4 5116 313 procedure printout; 314 var 315 space: integer; 316 cube: integer; 317 side: face; 318 begin 319 if nosolutions then 320 writeln('no solutions') else 321 begin 322 writeln('solution to instant insanity'); 323 for cube := 1 to 4 do 324 begin 325 write(cube, ' '); 326 for side := front to bottom do 327 write(datas[cube, side]); 328 writeln; 329 end; 330 end; patch 5116 5122 5122 BEG:24 0 5128 CASE4 0 5132 CASE4 1 5136 CASE2 318 5138 "printout" 5148 LINO 319 5152 RV1:2 -1 5156 IF -2 5160 LINO 320 5164 UNITOUT 5166 FILE 5168 CON14:1 5170 CON14:12 5172 LVCON:14 5174 "no solutions" 5188 WRITES:16 5190 WRITLN 5192 TRA -2 patch 5156 38 5196 LINO 322 5200 UNITOUT 5202 FILE 5204 CON14:1 5206 CON14:28 5208 LVCON:30 5210 "solution to instant insanity" 5240 WRITES:16 5242 WRITLN 5244 LINO 323 5248 LV:4 -16 5252 CON1:1 5254 AS24 5256 LV:4 -20 5260 CON1:4 5262 AS24 5264 RV4:4 -16 5268 RV4:4 -20 5272 REL4 LE 5274 IF -2 5278 LV:4 -24 5282 RV4:4 -20 5286 AS4 5288 LV:4 -24 5292 RV4:4 -16 5296 AS4 5298 LV:4 -8 5302 RV4:4 -24 5306 AS4 5308 LINO 325 5312 UNITOUT 5314 RV4:4 -24 5318 LVCON:6 5320 "%10D" 5326 FILE 5328 WRITEF:12 5330 FILE 5332 CON14:1 5334 CON14:3 5336 LVCON:4 5338 " " 5342 WRITES:16 5344 LINO 326 5348 LV:4 -28 5352 CON1:1 5354 AS24 5356 LV:4 -32 5360 CON1:4 5362 AS24 5364 RV4:4 -28 5368 RV4:4 -32 5372 REL4 LE 5374 IF -2 5378 LV:4 -33 5382 RV4:4 -32 5386 RANG42:1 6 5390 AS41 5392 LV:4 -33 5396 RV4:4 -28 5400 RANG42:1 6 5404 AS41 5406 LV:4 -9 5410 RV14:4 -33 5414 AS41 5416 LINO 327 5420 UNITOUT 5422 FILE 5424 CON14:1 5426 CON14:10 5428 LV:2 -256 5432 RV4:4 -24 5436 INX4:60 1 4 5442 RV1:4 -33 5446 INX2:10 1 6 5452 WRITES:16 5454 LINO 326 5458 RV4:4 -32 5462 LV:4 -33 5466 FOR1U:-62 patch 5374 92 5468 LINO 328 5472 UNITOUT 5474 WRITLN 5476 LINO 323 5480 RV4:4 -20 5484 LV:4 -24 5488 FOR4U -194 patch 5274 216 patch 5192 298 331 end; In procedure printout: w - variable space is neither used nor set 5492 END patch 5122 36 333 begin 334 reset(input); 335 readin; 336 sumcolors; 337 find2222; 338 simultaneous; 339 rearrange; 340 correct; 341 1: 342 printout; patch 0 5494 5494 BEG:22 0 5500 CASE4 0 5504 CASE4 1 5508 CASE2 333 5510 "insane" 5518 LINO 334 5522 CON14 5524 CON14 5526 CON4 0 5532 RV4 -8 5536 RESET 5538 LINO 335 5542 CALL:1 200 5548 LINO 336 5552 CALL:1 620 5558 LINO 337 5562 CALL:1 1456 5568 LINO 338 5572 CALL:1 2474 5578 LINO 339 5582 CALL:1 2898 5588 LINO 340 5592 CALL:1 3962 patch 6 5598 5598 LINO 342 5602 CALL:1 5116 343 end. In program insane: w - type metacolor is never used w - constant notacolor is never used w - type metapair is never used w - type metaface is never used w - constant notapair is never used w - constant notaface is never used 5608 END patch 5494 568 344 { 345 wbggrb 346 wbrgrr 347 wbgwrg 348 wrgwbr 349 }