Annotation of 43BSDReno/pgrm/pascal/tstpx/src/insan.p, revision 1.1.1.1

1.1       root        1: program insane(input, output);
                      2: label
                      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;
                     20: 
                     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;
                     30: end;
                     31: 
                     32: procedure readin;
                     33: var
                     34:        hue: alfa;
                     35:        ch: char;
                     36:        cube: blockno;
                     37:        position: face;
                     38: 
                     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;
                     47: end;
                     48: 
                     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;
                     60: end;
                     61: 
                     62: procedure sumcolors;
                     63: var
                     64:        cube: blockno;
                     65:        side: face;
                     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;
                     73: end;
                     74: 
                     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;
                     85: end;
                     86: 
                     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;
                     93: end;
                     94: 
                     95: procedure find2222;
                     96: var
                     97:        subtotals: array[red..white] of integer;
                     98:        pair1, pair2, pair3, pair4: pair;
                     99: 
                    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;
                    116: end;
                    117: 
                    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;
                    125: end;
                    126: 
                    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;
                    140: end;
                    141: 
                    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;
                    166: end;
                    167: 
                    168: procedure rearrange;
                    169: var
                    170:        box: blockno;
                    171:        a, b: pair;
                    172: 
                    173: procedure put(a, b: pair);
                    174: var
                    175:        old1, new1, old2, new2: face;
                    176:        save1, save2: alfa;
                    177: 
                    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;
                    197: end;
                    198: procedure newpair(d: pair);
                    199: begin
                    200:        oldpair(b);
                    201:        new1 := old1;
                    202:        new2 := old2;
                    203: end;
                    204: 
                    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;
                    214: end;
                    215: 
                    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;
                    245: end;
                    246: 
                    247: procedure correct;
                    248: var
                    249:        list: array[1..8] of integer;
                    250:        done: Boolean;
                    251:        side: face;
                    252:        counter: integer;
                    253: 
                    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;
                    271: end;
                    272: 
                    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;
                    289: end;
                    290: 
                    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
                    311: end;
                    312: 
                    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;
                    331: end;
                    332: 
                    333: begin
                    334:        reset(input);
                    335:        readin;
                    336:        sumcolors;
                    337:        find2222;
                    338:        simultaneous;
                    339:        rearrange;
                    340:        correct;
                    341: 1:
                    342:        printout;
                    343: end.
                    344: {
                    345: wbggrb
                    346: wbrgrr
                    347: wbgwrg
                    348: wrgwbr
                    349: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.