From e24ebe2110511c8fe2a3dc3aac8cb06a3b44d7e1 Mon Sep 17 00:00:00 2001 From: Paul Kimpel Date: Sun, 24 Mar 2019 14:14:06 -0700 Subject: [PATCH] Commit new Sudoku solver program and RC documentation update. 1. Commit Sudoku solver program from Paul Cumberworth. 2. Replace RC reference document with version generated from CUBE13 library files --- RC-Ron-Brody/RC-Reference.txt | 2914 +++++++++-------- RC-Ron-Brody/README.txt | 6 +- Sudoku-Paul-Cumberworth/README.txt | 28 + .../Soduku-Solver-List.lst | 1236 +++++++ Sudoku-Paul-Cumberworth/Sudoku-Solver-SP.card | 402 +++ Sudoku-Paul-Cumberworth/Sudoku-Solver.card | 404 +++ 6 files changed, 3544 insertions(+), 1446 deletions(-) create mode 100644 Sudoku-Paul-Cumberworth/README.txt create mode 100644 Sudoku-Paul-Cumberworth/Soduku-Solver-List.lst create mode 100644 Sudoku-Paul-Cumberworth/Sudoku-Solver-SP.card create mode 100644 Sudoku-Paul-Cumberworth/Sudoku-Solver.card diff --git a/RC-Ron-Brody/RC-Reference.txt b/RC-Ron-Brody/RC-Reference.txt index 0a3370e..f7ab855 100644 --- a/RC-Ron-Brody/RC-Reference.txt +++ b/RC-Ron-Brody/RC-Reference.txt @@ -1,79 +1,97 @@ - - - - - - - - - - - - - - - - + LABEL 000000000LINE 00188158?EXECUTE XREF/JONES XREF /JONES + + + + + + XREF PROGRAM OF 3DC70 THIS LISTING PRODUCED 6 JUN 1988 TIME 7.59 + +$ DISK SIX DOCONLY DOCUMENT FINAL + + +CARD FILE IS CARD /0000000 + +SOURCE FILE IS TEACHER/0000094 + + + + + + + + + + + + + + + + + + + + + + R/C --- REFERENCE --------- MANUAL ------ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + BY - - + + RON BRODY - - + + 12/22/71 VERSION 94 - - - - - - + + + + + PAGE 1 - + INTRODUCTION ------------ - - + + R/C PERMITS A USER AT A REMOTE TELETYPEWRITER TO CREATE AND MAINTAIN SOURCE OR DATA FILES ON THE B5500 SYSTEM DISK. FILE TYPES CREATED AND MAINTAINED WITH R/C ARE: ALGOL, XALGOL, COBOL, FORTRAN, BASIC, AND DATA. THESE FILES REPRESENT NORMAL (80 CHARACTER-PER-CARD) PUNCHED CARD DECKS EXCEPT THAT THEY ARE STORED ON THE DISK. EACH RECORD CAN BE THOUGHT OF AS ONE CARD. - - + + R/C ALLOWS THE USER TO: - + * CREATE A VARIETY OF FILES * RESEQUENCE FILES * PRINT OR PUNCH FILES @@ -84,24 +102,24 @@ * REMOVE FILES * COMPILE FILES * PERFORM MANY OTHER FUNCTIONS - - + + THE TELETYPEWRITER (IN CONJUNCTION WITH THE PROGRAM R/C) CAN BE CONSIDERED A KEYPUNCH EXTENSION WHICH ELIMINATES PUNCHED CARDS. IT OFFERS GREAT FLEXIBILITY IN FILE HANDLING. - - + + R/C HAS TWO MAJOR RESTRICTIONS: - - + + WHILE THE SEQUENCE NUMBER 99999999 IS PERMITTED FOR CONVENIENCE, THE MAXIMUM SEQUENCE NUMBER IS 2097151 (2*21-1). - - + + THE MAXIMUM NUMBER OF RECORDS PERMITTED IN A FILE IS 8191. - - + + IN THE DISCUSSION OF CERTAIN R/C VERBS, SOME OF THE ELEMENTS OF THE SYNTAX ARE GIVEN AS , , , OR . IN EACH CASE, THESE ELEMENTS REPRESENT INTEGER VALUES WHICH MUST BE PROVIDED BY @@ -109,36 +127,36 @@ SEQUENCE NUMBER FOR OTHERS, OR AN INCREMENT AMOUNT. THE BRACKETED CONSTRUCT IS ONLY A FORM OF NOTATION USED TO REPRESENT AN INTEGER PARAMETER. - - - + + + PAGE 2 - + PROGRAM OPERATION AND RECORD SEQUENCING ------- --------- --- ------ ---------- - - + + DURING CREATION AND FILE MAINTENANCE, R/C AUTOMATICALLY ADVANCES (BY THE CURRENT VALUE OF THE "INCREMENT") THE SEQUENCE NUMBER OF EACH RECORD THAT IS INPUT. THE USER MAY SET THIS INCREMENT TO ANY DESIRED VALUE THROUGH USE OF THE "*INC" VERB (SEE BELOW). THE INCREMENT VALUE IS INITIALIZED TO 100 WHEN THE USER FIRST RUNS R/C. - - + + THE INITIAL SEQUENCE NUMBER IS SET TO THE INCREMENT WHEN A NEW FILE IS OPENED BY A USER. FOR EXAMPLE, IF THE CURRENT INCREMENT WERE 100, THE FIRST SEQUENCE NUMBER IN THE FILE WOULD BE "100:". THIS INITIAL SEQUENCE NUMBER MAY BE CHANGED BY THE USER THROUGH THE USE OF THE CONSTRUCT "*", (SEE BELOW). - - + + AFTER EACH RECORD IS TYPED INTO THE FILE, THE SEQUENCE NUMBER OF THE NEXT RECORD IN THE FILE IS SET TO THE LAST SEQUENCE NUMBER PLUS THE INCREMENT. THIS SEQUENCE NUMBER IS NEXT TYPED ON THE TELETYPEWRITER. - - + + IF THE FILE TYPE IS NOT "COBOL", THE SEQUENCE NUMBER IS FOLLOWED BY A COLON. IF A RECORD ALREADY EXISTS WITH THIS SEQUENCE NUMBER, LEADING ZEROS ARE TYPED AS A WARNING; OTHERWISE @@ -146,19 +164,19 @@ OUT, THE USER MAY THEN ENTER THE DESIRED CONTENTS FOR THAT SEQUENCE NUMBER OR MAY ENTER A VERB TO PERFORM SOME OTHER FUNCTION. - - + + ALTERNATIVELY, THE USER MAY SET THE SEQUENCE TO SOME OTHER VALUE THROUGH THE USE OF THE CONSTRUCT "*", WHERE IS THE DESIRED SEQUENCE NUMBER. NOTE THAT LEADING ZEROS ARE ACCEPTED BUT NOT NECESSARY WITH THIS CONSTRUCT. - - + + BY USE OF THE "*" CONSTRUCT AND THE "*INC" VERB TO SET THE SEQUENCE NUMBER INCREMENT, THE USER MAY SET UP HIS OWN NUMBERING SEQUENCE THROUGHOUT HIS FILE. - - + + THE EXAMPLES ILLUSTRATE THE SEQUENCE NUMBER OF THE RECORD TYPED ON THE LEFT SIDE OF THE PAGE AS IT APPEARS ON THE TELETYPEWRITER AND THE MANNER IN WHICH THESE RECORDS ARE @@ -166,59 +184,59 @@ ACTUALLY CARRY THE SEQUENCE NUMBER IN CHARACTER POSITIONS 73-80 OF THE RECORD, R/C TYPES THE NUMBER ON THE LEFT MARGIN OF THE TELETYPEWRITER. - - - - - - + + + + + + PAGE 3 - + PROGRAM EXECUTION ------- --------- - - + + INITIAL REMOTE TERMINAL OPERATIONS ------- ------ -------- ---------- - - - FOR LOGGING-IN TO A TELETYPEWRITER, PRESS THE "ORGI" BUTTON, + + + FOR LOGGING-IN TO A TELETYPEWRITER, PRESS THE "ORIG" BUTTON, WAIT FOR A DIAL TONE FROM THE SPEAKER, AND DIAL THE COMPUTER NUMBER. THE B5500 RESPONDS WITH THE MESSAGE: - - + + BURROUGHS B-5500: / --------- ------- --------- - - + + (THE STATION NUMBER IS / WHERE IS THE TERMINAL NUMBER AND IS THE BUFFER NUMBER.) - - + + YOU MAY TYPE: - - + + ? LI: /~ - --- -------------------------- ------ - - + + THIS LOG-IN MESSAGE MAY HAVE BEEN PRECEDED BY A "?BO~" MESSAGE WHICH WOULD HAVE BLACKED OUT THE LINE ON WHICH THE LOG-IN MESSAGE WAS TYPED. - - + + THE B5500 VALIDATES THE AND AND RESPONDS BY TYPING OUT THE STATION NUMBER AND THE TIME OF DAY OF THE LOG-IN. - - + + TO CONNECT A REMOTE TERMINAL TO R/C, ENTER: - - + + ?? RUN R/C;END.~ -- --- --------- - - + + THE B5500 RESPONDS BY EITHER TYPING OUT A "BOJ" (BEGINNING OF JOB) MESSAGE, A "SCHEDULED" MESSAGE, OR A "RUNNING" MESSAGE. A "BOJ" MESSAGE INDICATES THAT R/C WAS NOT PREVIOUSLY RUNNING BUT @@ -227,174 +245,174 @@ AND IS SCHEDULED. IN THIS CASE, R/C IS NOT BROUGHT INTO THE MIX UNTIL OTHER SYSTEM USERS COMPLETE THEIR WORK. THE "RUNNING" MESSAGE INDICATES R/C IS ALREADY IN THE MIX. - - - - - + + + + + PAGE 4 - - - + + + WITH R/C IN THE MIX, IT AUTOMATICALLY SEARCHES OUT AND LOCKS ONTO REMOTE TERMINALS WHICH HAVE REQUESTED CONNECTION (BY "RUN R/ C"). AS SOON AS YOUR TERMINAL IS LOCKED, R/C TYPES ONE OF THE FOLLOWING MESSAGE SEQUENCES, ACCORDING TO THE MANNER IN WHICH R/C ENDED DURING YOUR LAST R/C RUN (FIRST-TIME USERS ARE CONSIDERED TO HAVE CAUSED NORMAL LAST ENTRIES): - - + + INITIAL MESSAGE AFTER NORMAL TERMINATION OF LAST RUN: - - + + - HELLO : - - + + INITIAL MESSAGE AFTER "* END X" OR ABNORMAL LAST RUN TERMINATION: - + IF A FILE WAS OPEN - + HELLO+ : - + OR IF NO FILE IS OPEN - - VERSION NUMBER> + + HELLO+ : - - + + IF A MESSAGE HAS BEEN SENT FROM ANOTHER USER TO YOUR USERCODE (SEE THE MAIL VERB), "MAIL %" IS TYPED INSTEAD OF "HELLO". - - + + EXAMPLES: - - + + VERSION # - HELLO BLUM + HELLO BLUM : - - + + THIS IS THE NORMAL INITIAL SEQUENCE FROM R/C. - - - + + + VERSION # - - - - - + + + + + PAGE 5 - + HELLO+ WILNER : - - + + THIS SEQUENCE INDICATES THAT R/C REMEMBERS THE USERS - STATE FROM THE PREVIOUS RUN. THE STATE INDICATES THE + STATE FROM THE PREVIOUS RUN. THE STATE INCLUDES THE INCREMENT VALUE, TAB AMOUNT, SAVE FACTOR, PERCENT ON-OFF, AND VERB REPLACEMENTS. - - - + + + VERSION # FILE/NAME HELLO+ SHARPE 00050600: - - + + THIS SEQUENCE INDICATES THAT USER HAS THE FILE "FILE/ NAME" OPEN AND IS AT THE RECORD WITH SEQUENCE NUMBER 50600. THE LEADING ZEROS INDICATE THAT A RECORD ALREADY EXISTS WITH THAT NUMBER. - - + + FINAL REMOTE TERMINAL OPERATIONS ----- ------ -------- ---------- - - + + THE USER SHOULD TERMINATE HIS USE OF R/C WITH THE "* END" COMMAND (SEE BELOW). R/C WILL RESPOND WITH "GOOD BYE." - - + + AFTER HE HAS ENDED R/C, IF THE USER IS DONE WITH THE REMOTE TERMINAL HE SHOULD LOG-OUT BY ENTERING: "?LO~" - - + + R/C INPUT --- ----- - - + + INPUT TO R/C IS EITHER COMMANDS OR RECORDS. - - + + COMMANDS ARE INDICATED BY THE CHARACTER "*" IN THE FIRST INPUT POSITION. (IF THERE IS NO OPEN FILE, THE "*" IS OPTIONAL.) ALL OTHER INPUT IS CONSIDERED RECORDS TO BE PLACED IN THE OPEN FILE. THE FORMAT FOR A COMMAND IS THE "*" FOLLOWED BY AN R/C VERB AND, IF NEEDED, ITS PARAMETERS. THE VERB AND ITS PARAMETERS MUST BE SEPARATED BY A DELIMITER. - - + + A DELIMITER IS EITHER A SPACE OR ANY SPECIAL CHARACTER EXCEPT A ";", A """, A ".", A "(", OR A "[". MULTIPLE DELIMITERS ARE TREATED AS A SINGLE DELIMITER. - - - - - + + + + + PAGE 6 - - - + + + A COMMAND MAY BE FOLLOWED BY ANOTHER INPUT (EITHER A COMMAND OR A RECORD) IF IT IS TERMINATED BY A ";". AN ERROR IN A COMMAND OF A MULTIPLE INPUT INHIBITS THE PROCESSING OF THE REST OF THAT INPUT. - - + + EXAMPLES: - - + + 100:* INC 50~ - + THIS IS AN EXAMPLE OF ONE OF THE INPUT COMMANDS. - - + + 100:BEGIN~ - + THIS IS AN EXAMPLE OF PLACING A RECORD AT SEQUENCE NUMBER 100. - - + + 100:* INC 3;* RESEQ~ - + THIS IS AN EXAMPLE OF MULTIPLE COMMANDS. - - + + 100:*35; THIS RECORD GOES AT 35~ - + THIS IS AN EXAMPLE OF A COMMAND FOLLOWED BY A RECORD OF INPUT. - - + + 100:* OPEN A/B DATA;* PRINT FOR ME;*CLOSE~ - + THIS IS ANOTHER EXAMPLE OF MULTIPLE COMMANDS. NOTE THAT THE "*" MUST APPEAR IN THE NEXT CHARACTER POSITION FOLLOWING THE SEMICOLON OR THE REMAINDER OF THE RECORD IS TREATED AS DATA. - - + + AN INPUT LINE IS SENT TO THE COMPUTER BY TYPING THE CHARACTER "~". TYPING ERRORS CAN BE CORRECTED, BY BACKSPACING AND LINE ERASING, BEFORE A MESSAGE IS SENT. THE BACKSPACE @@ -402,33 +420,33 @@ CHARACTER IS THE UP-ARROW (SHIFT N). ALL THE FOLLOWING LINES OF INPUT ARE EQUIVALENT (NOTE THE UNDERLINED CHARACTERS REPRESENT USE OF THE SHIFT): - - + + 100:THIS IS IT~ - + 100:THIS IS NOT, BUTNTHIS IS IT~ - - - - - + + + + + PAGE 7 - + - - 100:THE7IS IT~ + 100:THE7IS IS IT~ - 100:THESE777IS IS IT~ --- - - + + IF, AFTER BACKSPACING AND LINE ERASING, THE INPUT LINE - CONTAINS MORE THEN 240 CHARACTERS, THE INPUT IS DISCARDED WITH AN + CONTAINS MORE THAN 240 CHARACTERS, THE INPUT IS DISCARDED WITH AN "INPUT OVERFLW" ERROR MESSAGE. DATA RECORDS ARE ALSO DISCARDED (WITH THE ERROR MESSAGE) IF THEY ARE TOO LARGE FOR THE FILE. (I. E. GTR 66 FOR COBOL FILES; GTR 80 FOR DATA FILES; AND GTR 72 FOR ALL OTHER FILES) - - + + THERE ARE TWO CLASSES OF REQUESTS TO R/C: LONG AND SHORT. LONG OPERATIONS ARE THOSE THAT USUALLY ARE SLOW TO EXECUTE AND ARE CHARACTERIZED BY THE "WAIT..." MESSAGE. ALL OTHER REQUESTS @@ -440,128 +458,128 @@ RECEIVE A FEW "RUBOUT" CHARACTERS OF REASSURANCE. R/C IGNORES ANY INPUT SENT BY USERS IN THE QUEUE OR BY THE USER WHOSE LONG OPERATION IS BEING PROCESSED. - - + + IF A USER PRODUCES NO INPUT FOR FIVE MINUTES, HE IS SENT THE MESSAGE "LOOK ALIVE". IF HE DOES NOT RESPOND WITHIN ANOTHER FIVE - MINUTE PERIOD, R/C PROCESSES A "*END DS" FOR THAT USER. - - + MINUTE PERIOD, R/C PROCESSES A "* END DS" FOR THAT USER. + + R/C OUTPUT --- ------ - - + + OUTPUT TO THE TELETYPEWRITER OF THE SPECIAL CHARACTERS ~, !, <, {, >, AND } IS REPLACED BY A "$" CHARACTER IN ORDER THAT THEY - DO NOT EVOKE TELETYPEWRITER CONTROL FUNCTIONS WITH WHICH THEY ARE + DO NOT EVOKE TELETYPWRITER CONTROL FUNCTIONS WITH WHICH THEY ARE ASSOCIATED. (THESE INCLUDE LINE-FEED, CARRIAGE-RETURN, MESSAGE- END, AND PAPER-TAPE-ON.) - - + + WHEN THE "BREAK" KEY IS DEPRESSED DURING OUTPUT, THE OUTPUT IS TERMINATED WITH THE MESSAGE "BREAK". - - - - - - + + + + + + PAGE 8 - + R/C FILES --- ----- - - + + ALL FILES CREATED BY R/C ARE PERMANENT DISK FILES. THE SAVE FACTOR IS NORMALLY 7 DAYS, BUT IT MAY BE CHANGED BY THE SAVE VERB (SEE BELOW). - - + + FILE TYPES ---- ----- - - + + R/C ENABLES THE USER TO CREATE AND MAINTAIN ALGOL, COBOL, FORTRAN, XALGOL, BASIC, AND DATA FILES. THESE FILES HAVE 80 CHARACTER-LONG RECORDS, (ONE CARD IMAGE). - - + + XALGOL, BASIC, ALGOL AND FORTRAN FILES CONTAIN EIGHT DIGIT SEQUENCE NUMBERS LOCATED IN THE POSITIONS 73-80 OF THE CARD IMAGE. - - + + COBOL FILES CONTAIN SIX-DIGIT SEQUENCE NUMBERS, PLACED IN POSITIONS 1-6 OF THE RECORD. - - + + DATA FILES ARE NOT PHYSICALLY SEQUENCED ALTHOUGH R/C MAINTAINS AN INTERNAL, EIGHT-DIGIT NUMBER FOR EACH RECORD. - - + + FILE NAMES ---- ----- - - + + FILE NAMES MUST BE SUPPLIED TO R/C. THE FORM OF A NAME IS / . THROUGHOUT THIS DOCUMENT, IS USED TO SPECIFY A FILE AND SHOULD BE IN THE FORM ABOVE. THE AND THE MAY EACH BE NO LONGER THAN SEVEN CHARACTERS. - - + + EXAMPLES: - - + + A/B - + GRIMY/GULCH - + ZAP/1 - + 16JAN/SUFFIX - + 0000000/DISK - - - - - + + + + + PAGE 9 - - - + + + RECORD REFERENCING ------ ----------- - - + + RECORDS IN THE OPEN FILE (SEE OPEN BELOW) ARE REFERRED TO BY THEIR SEQUENCE NUMBER. "DATA" FILES ARE IMPLICITLY SEQUENCED BY THE VALUE OF THE INCREMENT WHEN THEY ARE OPENED. - - + + AN ALTERNATE METHOD OF REFERENCING RECORDS IN THE OPEN FILE IS RELATIVE SEQUENCE NUMBERS. A RELATIVE SEQUENCE NUMBER IS AN INTEGER PRECEEDED BY A + OR - SIGN. IT MAY BE USED ANYPLACE A SEQUENCE NUMBER IS USED. IT IS TRANSLATED TO A SEQUENCE NUMBER BY MOVING FORWARD OR BACKWARD THE INDICATED NUMBER OF RECORDS AND USING THE SEQUENCE NUMBER OF THAT RECORD. - - + + RECORDS IN A NON-OPEN FILE (EXTERNAL FILE) ARE REFERRED TO BY THEIR RELATIVE POSITION WITHIN THE FILE. THE FIRST RECORD IS 1, THE SECOND 2, ETC. ANY SEQUENCING THAT MAY BE ON THE RECORDS IS IGNORED. - - - - - + + + + + PAGE 10 - + FILE-HANDLING VERBS ------------- ----- - - + + THIS SECTION DESCRIBES VERBS THAT HANDLE FILES AS A WHOLE, RATHER THAN RECORDS WITHIN A FILE. HOWEVER, A FEW VERBS HAVE OPTIONS IN R/C SYNTAX THAT PERMIT ACCESS TO RECORDS WITHIN THE @@ -570,30 +588,30 @@ ALWAYS BE THE FIRST CHARACTER IN THE INPUT STRING WHEN A COMMAND IS ENTERED. IF THIS IS NOT FOLLOWED, AN EXISTING RECORD MAY BE OVERWRITTEN BY THE COMMAND ITSELF. - - - - + + + + PAGE 11 - - - + + + FILE OPENING AND CREATION (OPEN) ---- ------- --- -------- ------ - - + + * OPEN NEW - ---- ----------- ----------- --- - - + + * OPEN OLD - ---- ----------- ----------- --- - - + + * OPEN - ---- ----------- ----------- - - + + THE "* OPEN " VERB ATTACHES THE USER TO THE DISK FILE . THE MUST BE EITHER "ALGOL", "COBOL", "FORTRAN", "XALGOL", "BASIC", OR "DATA". IF THE IS @@ -603,261 +621,261 @@ "NEW" NOR "OLD" THE DISK FILE IS OPENED AND IT IS READ TO DETERMINE ITS SEQUENCE NUMBERS. THIS LATTER FORM IS SLOWER THAN THE OPEN "OLD". - - + + EXAMPLES: - - + + :* OPEN PROGRAM/SOURCE ALGOL NEW~ 100: - + THIS CREATES A NEW DISK FILE CALLED PROGRAM/SOURCE. - - + + 63500:* OPEN ANOTHER/PROG DATA OLD~ 4500: - + THIS OPENS THE FILE ANOTHER/PROG SEQUENCING IT BY THE CURRENT INCREMENT VALUE. NOTE THAT THE FILE THAT WAS OPEN IS FIRST CLOSED BEFORE THE NEXT FILE IS OPENED. - - + + :* OPEN YET/ANOTHER COBOL~ WAIT... READ ONLY FILE. 7504 - + THIS OPENS THE FILE YET/ANOTHER USING THE SEQUENCE NUMBERS WITHIN THE FILE. THE MESSAGE "READ ONLY FILE" - - - - - + + + + + PAGE 12 - + INDICATES THAT THE USER IS FORBIDDEN (BY THE FILE SECURITY SYSTEM) TO MODIFY THE FILE. - - + + ERRORS: - - + + DUP FILE: - - + + A FILE, , ALREADY EXISTS AND THE USER IS TRYING TO CREATE A FILE WITH THAT NAME WITH AN "* OPEN ... NEW". - - + + NO FILE: - - + + THE USER IS TRYING TO OPEN A FILE, , AND IT DOES NOT EXIST ON DISK. - - + + BAD FILE: - - + + THE FILE WHICH THE USER IS TRYING TO OPEN IS NOT BLOCKED CORRECTLY. THE CORRECT BLOCKING IS 10-WORD - RECORDS WITH MULTIPLE OF 3 RECORDS PER BLOCK. - - + RECORDS WITH A MULTIPLE OF 3 RECORDS PER BLOCK. + + INV USER: - - + + THE USER IS TRYING TO OPEN A FILE TO WHICH HE HAS NO ACCESS. IF THE USER HAS EITHER SECONDARY OR TERTIARY ACCESS, THE MESSAGE: "READ ONLY FILE" IS TYPED. - - + + FILE TOO LONG - - - THE USER IS TRYING TO OPEN A FILE WITH MORE THEN 8191 + + + THE USER IS TRYING TO OPEN A FILE WITH MORE THAN 8191 RECORDS. - - + + SEQ OVERFLOW - - + + THE FILE THE USER IS OPENING CAUSES THE SEQUENCE COUNTER TO EXCEED 2,097,151. THE FILE IS OPENED, BUT THE USER SHOULD RESEQUENCE IT. - - - - - - - + + + + + + + PAGE 13 - + SEQ ERR- - - + + THE FILE CONTAINS A RECORD WHOSE SEQUENCE NUMBER IS LESS THAN THE SEQUENCE NUMBER OF THE PRECEEDING RECORD. THE FILE IS NOT OPENED. - - + + BAD FILE TYPE: - - + + IS NOT "ALGOL", "COBOL", "FORTRAN", "XALGOL", "BASIC", OR "DATA". - - - + + + PAGE 14 - - - + + + FILE CLOSING (CLOSE) ---- ------- ------- - - + + FILES ARE CLOSED BY USE OF THE FOLLOWING CONSTRUCT: - - + + * CLOSE - ----- - - + + THIS VERB DETATCHES THE OPEN FILE, FROM R/C. - - + + EXAMPLES: - - + + 5600:* CLOSE~ : - + THIS IS AN EXAMPLE OF CLOSING A FILE THAT IS IN THE CORRECT ORDER. - - + + 450:* RESEQ 100~ 9000:* CLOSE~ WAIT... : - + THIS IS AN EXAMPLE OF CLOSING A FILE THAT IS NOT IN ORDER. - - + + ERROR: - - + + NO FILE OPEN: CLOSE - - - THERE IS NO OPEN FILE TO CLOSE - - - - + + + THERE IS NO OPEN FILE TO CLOSE. + + + + PAGE 15 - - - + + + LISTINGS ON THE TELETYPEWRITER (LIST) -------- -- --- -------------- ------ - - + + TO LIST FILES OR ANY OF THEIR SEPARATE RECORDS, THE FOLLOWING CONSTRUCTS APPLY: - - + + * LIST - ---- - - + + * LIST - ---- ----------- - - + + * LIST NO - ---- ----------- -- - - + + * LIST - ---- ----------- --- - - + + * LIST - ---- ----------- --- --- - - + + * LIST - ---- --- - - + + * LIST - ---- --- --- - - + + THE "LIST" VERB CAUSES AN ENTIRE FILE OR PORTIONS OF A FILE TO BE LISTED ON THE TELETYPEWRITER. LISTING MAY BE DISCONTINUED BY PRESSING THE BREAK KEY ON THE TELETYPEWRITER. - - + + THE FIRST FORM LISTS THE OPEN FILE. - - + + THE SECOND FORM LISTS THE FILE . - - + + THE THIRD FORM LISTS THE FILE , WITHOUT THE RECORD NUMBERS. - - - - - - - + + + + + + + PAGE 16 - + THE FOURTH FORM LISTS FROM THE TH RECORD TO THE END. - - + + THE FIFTH FORM LISTS FROM THE TH TO THE TH RECORDS. - - + + THE SIXTH FORM LISTS SEQUENCE NUMBER OF THE OPEN FILE. - - + + THE LAST FORM LISTS SEQUENCE NUMBERS THROUGH OF THE OPEN FILE. - - + + EXAMPLES: - - + + 500:* LIST~ 100:BEGIN 200: INTEGER I, J, K ; 300: REAL X, Y, Z ; 400: ARRAY A [0 : 9] ; 500: - + 5500:* LIST 8900,+3~ 8950: I := I + 5 ; 9125: GO TO NEXT ; 9300: HELP: 9400: - + 300* LIST 60~ 000060 MOVE A TO B. 000070 - + :* LIST SOME/FILE~ 1:BEGIN 2: INTEGER I, J, K ; @@ -866,7 +884,7 @@ 5: A [I] := X ; 6:END. : - + 500:* LIST SOME/FILE NO~ BEGIN INTEGER I, J, K ; @@ -875,176 +893,176 @@ A [I] := X ; END. 500: - - - - - + + + + + PAGE 17 - + + :* LIST LIBRARY/FILE 2,4~ 2:PROCEDURE READDATA 567,653 3:PROCEDURE WRITEDATA 654,789 4:PROCEDURE DATA 790,808 : - + :* LIST SOME/FILE 5~ 5: A [I] := X ; 6:END. : - + :* LIST SOME/FILE 200,500~ USE RECORD #S. : - + THE LAST EXAMPLE ILLUSTRATES THE COMMON ERROR OF REFERENCING AN EXTERNAL FILE WITH SEQUENCE NUMBERS INSTEAD OF RECORD NUMBERS. - - - - + + + PAGE 18 - - - + + + COMPRESSED FILE LISTINGS (QUICK) ---------- ---- -------- ------- - - + + A COMPRESSED FILE LISTING MAY BE OBTAINED FROM R/C BY USE OF THE CONSTRUCTS: - - + + * QUICK - ----- - - + + * QUICK - ----- ----------- - - + + * QUICK NO - ----- ----------- -- - - - * QUICK - - ----- ----------- --- - - + + + * QUICK + - ----- ----------- --- + + * QUICK - ----- ----------- --- --- - - + + * QUICK - ----- --- - - + + * QUICK - ----- --- --- - - + + THE "* QUICK" VERB LISTS ON THE TELETYPEWRITER DELETING ALL CONTIGUOUS BLANKS EXCEPT THE FIRST. THE FILE IS NOT AFFECTED BY THE VERB. - - + + EXAMPLE: - - + + 4500:* LIST 4300,4400~ 4300: FOR I := A STEP -1 UNTIL 0 DO 4400: X [I] := SIN (Y) ; - 4500:*QUICK -2 + 1~ + 4500:* QUICK -2, + 1~ 4300: FOR I := A STEP -1 UNTIL 0 DO 4400: X [I] := SIN (Y) ; 4500: - - - - - + + + + + PAGE 19 - - - + + + FILE REMOVAL (REMOVE) ---- ------- -------- - - + + TO REMOVE A FILE USE THE FOLLOWING CONSTRUCT: - - + + * REMOVE - ------ ----------- - - + + THE REMOVE VERB REMOVES THE FILE FROM DISK. - - + + * REMOVE LISTING - ------ ------- - - + + REMOVES LINE/, THE LISTING FILE FROM THE LAST COMPILATION. - - + + EXAMPLES: - - + + 3200:* REMOVE A/B~ 3200: - + 546:* REMOVE ANOTHER/FILE~ NO FILE: ANOTHER/FILE - 546: - + 546: + :* OPEN EXAMPLE/X COBOL OLD~ 46500* REMOVE EXAMPLE/X~ : - - - + + + PAGE 20 - - - + + + LINE-PRINTER FILE REPRODUCTION (PRINT) ------------ ---- ------------ ------- - - + + THE PRINT VERB: - - + + *PRINT ------ --- --- - - + + PRINTS THE OPENED FILE ON THE LINE PRINTER (LABELED ). IF "" IS "DOUBLE" THEN DOUBLE SPACING IS USED. - - + + * PRINT - ----- --- --- --- - - + + AS ABOVE, STARTING WITH SEQUENCE NUMBER . - - + + * PRINT , - ----- --- --- ---- --- - - + + AS ABOVE, STOPPING WITH SEQUENCE NUMBER . - - + + EXAMPLES: - - - :* OPEN TEST/CASE DATA;*PRINT TC DOUBLE;* CLOSE~ + + + :* OPEN TEST/CASE DATA;* PRINT TC DOUBLE;* CLOSE~ : - + THIS EXAMPLE ILLUSTRATES AN INSTANCE WHERE A SEQUENCED FILE SHOULD BE TREATED AS DATA TO SHORTEN THE OPERATION. IF THE FILE WAS OPENED "ALGOL OLD" IT WOULD HAVE BEEN @@ -1053,97 +1071,97 @@ OPENED "ALGOL" IT WOULD HAVE BEEN READ TO DETERMINE ITS SEQUENCE NUMBERS. EITHER WAY WOULD HAVE MADE THE WHOLE OPERATION MUCH SLOWER THAN OPENING THE FILE "DATA". - + 8700:* PRINT FOR USER~ WAIT... 8700: - - - + + + PAGE 21 - - - + + + PUNCHED-CARD FILE REPRODUCTION (PUNCH) ------------ ---- ------------ ------- - - + + TO PUNCH A FILE: - - + + * PUNCH - ----- --- --- - - + + PUNCHES A CARD DECK (LABELED ) OF THE OPENED FILE. - - + + * PUNCH - ----- --- --- --- - - + + AS ABOVE, STARTING WITH SEQUENCE NUMBER . - - + + * PUNCH , - ----- --- --- ---- --- - - + + AS ABOVE, STOPPING WITH SEQUENCE NUMBER . - - + + EXAMPLE: - - + + 7600:* PUNCH A B 100,+10~ WAIT... 7600: - - - + + + PAGE 22 - - - + + + FILE COMPILATION (COMPILE) ---- ----------- --------- - - + + FILES MAY BE COMPILED TO THE B5500 LIBRARY BY THE FOLLOWING CONSTRUCT: - - + + * COMPILE - ------- ----------- - - + + THIS VERB INITIATES THE COMPILATION OF THE OPEN FILE TO LIBRARY USING THE COMPILER INDICATED IN THE OPEN STATEMENT. THE OBJECT CODE IS NAMED . THE LISTING OUTPUT OF THE COMPILATION IS EQUATED TO "LINE/" ON DISK. THE "* LISTING" VERB MAY BE USED TO LIST THE SYNTAX ERRORS. - - + + * COMPILE - ------- ----------- ---------- - - - COMPILES THE OPEN FILE USING SPECIFIED COMPILER. - - + + + COMPILES THE OPEN FILE USING THE SPECIFIED COMPILER. + + EXAMPLES: - - + + 5700:* COMPILE OBJECT/CODE~ WAIT... : - + 479:* COMPILE TEST/OBJECT EZTRAN~ QUEUED( 1).WAIT... : - - + + IN THE LAST EXAMPLE, THE "EZTRAN" COMPILER (EZTRAN/ DISK) WILL BE USED. IF THE FILE IS NOT IN ORDER, IT WILL BE REORDERED. SINCE THIS IS A LONG OPERATION THE USER GETS A @@ -1151,53 +1169,53 @@ USERS LONG OPERATION IS BEING PROCESSED AND THAT THIS LONG OPERATION IS QUEUED UNTIL THE OTHER IS DONE. THE "1" INDICATES THAT THIS IS THE FIRST REQUEST IN THE QUEUE. - - - - - + + + + + PAGE 23 - - - + + + OUTPUT OF THE COMPILATION (LISTING) ------ -- --- ----------- --------- - - + + THE LISTING FILE OF THE COMPILER IS EQUATED TO LINE/ ON DISK. THE FILE MAY BE ACCESSED BY THE USE OF THE LISTING VERB: - - + + * LISTING , , - ------- ----------- ---- ---- --- - - + + LISTS THE SEQUENCE NUMBERS RELATED TO SEGMENT FROM RELATIVE ADDRESS TO RELATIVE ADDRESS . IS ALGOL, XALGOL, BASIC, COBOL, OR FORTRAN AND INDICATES WHICH COMPILER CREATED THE LISTING FILE "LINE/". (THIS FILE IS AUTOMATICALLY GENERATED BY THE COMPILE VERB). - - + + * LISTING ERRORS - ------- ----------- ------ - - + + LISTS THE SYNTAX ERRORS OF YOUR LAST COMPILATION. - - + + * LISTING - ------- - - + + PRINTS THE LINE FILE OF YOUR LAST COMPILATION ON THE PRINTER. - - + + EXAMPLES: - - + + :* LISTING ALGOL 5, 25, 35~ WAIT... SEGMENT = 5: 4300: REL. ADDR. = 26. @@ -1206,163 +1224,163 @@ 9300: REL. ADDR. = 35. :* LISTING ALGOL ERRORS~ WAIT... - 7800:ERROR 100 I, + 7800:ERROR 100 I. : - + 8900:* LISTING~ 8900: - - - - - + + + + + PAGE 24 - - - + + + FILE ZIPPED AS AN "EXECUTE" DECK (ZIP) ---- ------ -- -- --------- ---- ----- - - + + TO IMPLEMENT THE B5500 ZIP FUNCTION THROUGH R/C, USE THE FOLLOWING CONSTRUCT: - - + + * ZIP - --- - - + + THIS CONSTRUCT ZIPS THE OPENED FILE AFTER IT LINKS ALL THE CONTROL CARDS AS INDICATED BY "?". SEE THE ALGOL REFERENCE MANUAL FOR A DESCRIPTION OF THE "ZIP WITH FILE-ID" STATEMENT. - - + + * ZIP - --- ----------- - - + + COPIES THE OPENED FILE CREATING AND ZIPS . NOTE THIS "ZIP" CONSTRUCT DOES NOT DESTROY THE - OPEN FILE AS DOES THE FIRST FORM. - - + OPEN FILE, AS DOES THE FIRST FORM. + + EXAMPLES: - - + + :COLUMN ON "@";COLUMN 73~ :OPEN MAKE/MANUAL DATA NEW;%%EXECUTE XREF/JONES.~ 200:%%FILE DISK = TEACHER/0000094.~ 300:%% DATA CARD.~ 400:$ DISK SIX DOCONLY DOCUMENT FINAL~ 500:@99999999~ - 600%% END.~ + 600:%% END.~ 700:* ZIP TEMP/NAME~ WAIT... 700: - + THIS EXAMPLE ILLUSTRATES HOW TO CREATE A CONTROL DECK AND INITIATE ITS EXECUTION. THE DECK WAS SAVED (UNDER THE NAME "MAKE/MANUAL") SINCE THE ZIP CONSTRUCT INCLUDED THE DUMMY FILE "TEMP/NAME". (NOTE THAT THE ABOVE DECK WILL CREATE AN R/C USERS MANUAL.) - - + + :* OPEN MAKE/MANUAL DATA;* ZIP T/N;* CLOSE~ WAIT... : - - - - - + + + + + PAGE 25 - - - - - - - - - - - + + + + + + + + + + + RECORD HANDLING VERBS ------ -------- ----- - - - - + + + + PAGE 26 - - - + + + RECORD COPYING (DITTO) ------ ------- ------- - - + + RECORDS MAY BE COPIED FROM ONE PLACE TO ANOTHER WITHIN A FILE BY THE CONSTRUCT: - - + + * DITTO - ----- --- - - + + COPIES CARD IMAGE AS THE NEXT RECORD. - - + + * DITTO , - ----- ---- --- - - + + COPIES THE CARD IMAGES TO AS THE NEXT RECORDS. - - + + * DITTO OVERITE ON - ----- ------- -- - - + + * DITTO OVERITE OFF - ----- ------- --- - - + + * DITTO OVERITE - ----- ------- - - + + IF THE DITTO OVERITE IS OFF AND AN EXISTING RECORD IS ABOUT TO BE OVERWRITTEN, THE DITTO TERMINATES WITH AN "OVERITE OFF" MESSAGE. (IT IS INITIALLY OFF.) THE ABOVE COMMANDS ARE USED TO SET THE OPTION AND TO PRINT ITS CURRENT SETTING. ITS SETTING MAY BE REVERSED FOR ONE COMMAND BY PREFIXING THE DITTO WITH A -. (E.G. *-DITTO 10,50.) - - + + * DITTO MOVE - ----- --- ---- - - + + * DITTO , MOVE - ----- ---- --- ---- - - + + THE MOVE OPTION, MOVES RECORDS THRU TO THE - - - - - + + + + + PAGE 27 - + CURRENT LOCATION. THIS OPTION IS VERY FAST, BUT OVERITING IS NOT ALLOWED. - - + + EXAMPLES: - - + + 500:* DITTO 200,300~ 700:* LIST~ 100:ONE @@ -1371,7 +1389,7 @@ 400:FOUR 500:TWO 600:THREE - 700:*DITTO 200,300 MOVE;*LIST~ + 700:* DITTO 200,300 MOVE;*LIST~ 100:ONE 400:FOUR 500:TWO @@ -1379,90 +1397,90 @@ 700:TWO 800:THREE 900: - - - - - + + + + + PAGE 28 - - - + + + COPYING EXTERNAL FILES (COPY) ------- -------- ----- ------ - - + + WHOLE OR PARTIAL EXTERNAL FILES MAY BE COPIED INTO THE CURRENTLY OPENED FILE BY THE CONSTRUCTS: - - + + * COPY - ---- ----------- - - + + * COPY - ---- ----------- --- - - + + * COPY , - ---- ----------- ---- --- - - + + * COPY MERGE - ---- ----------- ----- - - + + THE COPY VERB COPIES RECORDS FROM ANOTHER FILE (). - - + + THE FIRST FORM COPIES THE WHOLE FILE. THE SECOND FORM COPIES THE -TH RECORD (WHERE THE FIRST RECORD OF IS 1, THE SECOND RECORD IS 2, THE THIRD IS 3, ETC.). THE THIRD FORM COPIES THE -TH THROUGH THE -TH RECORDS. THE LAST FORM USES THE SEQUENCE NUMBERS OF THE RECORDS OF TO DETERMINE THEIR POSITION IN THE OPEN FILE. - - + + * COPY OVERITE ON - ---- ------- -- - - + + * COPY OVERITE OFF - ---- ------- --- - - + + * COPY OVERITE - ---- ------- - - + + IF THE COPY OVERITE IS OFF AND AN EXISTING RECORD IS ABOUT TO BE OVERWRITTEN, THE COPY TERMINATES WITH AN "OVERITE OFF" MESSAGE. (IT IS INITIALLY OFF.) THE ABOVE - - - - - + + + + + PAGE 29 - + COMMANDS ARE USED TO SET THE OPTION AND TO PRINT ITS CURRENT SETTING. ITS SETTING MAY BE REVERSED FOR ONE COMMAND BY PREFIXING THE COPY WITH A -. (E.G. *-COPY A/B 10,50.) - - + + EXAMPLES: - - + + :* OPEN SOURCE/MARK7 ALGOL NEW~ 100:* COPY SOURCE/MARK6~ WAIT... 8900: - + 500:* COPY LIBRARY/FILE 345, 368~ WAIT... 2800: - + :QUICK PATCH/FILE~ 1:A 00000050 2:B 00000150 @@ -1481,168 +1499,168 @@ 250:Z 300:3 400: - - - - - + + + + + PAGE 30 - - - + + + INTRA-RECORD EDITING (INLINE) ------------ ------- -------- - - + + RECORDS MAY BE EDITED BY USE OF THE "* INLINE" CONSTRUCTS DESCRIBED IN THE NEXT PARAGRAPHS. - - + + * INLINE - ------ --- - - + + * INLINE - ------ - - - * INLINE - - ------ --- ----- ----- - - - * INLINE - - ------ ----- ----- - - + + + * INLINE + - ------ --- ----- ---- + + + * INLINE + - ------ ----- ---- + + THIS SETS UP LINE FOR INLINE EDITING. IF THE SEQUENCE NUMBER IS NOT INCLUDED WITH THE COMMAND, THE PREVIOUS RECORD IS USED AND THE INITIAL PRINTING OF IT IS SUPPRESSED. - - + + * INLINE ECHO ON - ------ ---- -- - - + + * INLINE ECHO OFF - ------ ---- --- - - + + * INLINE ECHO - ------ ---- - - + + THE MODIFIED RECORD WILL BE TYPED ON THE TELETYPE IF THE INLINE ECHO IS ON. (IT IS INITIALLY ON.) THE ABOVE COMMANDS ARE USED TO SET THE OPTION AND TO PRINT ITS CURRENT SETTING. ITS SETTING MAY BE REVERSED FOR ONE COMMAND BY PREFIXING THE INLINE WITH A -. (E.G. * -INLINE +3.) - - + + TO MODIFY A PORTION OF A RECORD (CARD IMAGE) USE THE "* INLINE" VERB. R/C PRINTS THE RECORD NUMBER AND THE LINE, THEN GIVES A CARRIAGE RETURN AND LINE FEED. IT NEXT SPACES THE PRINT - - - - - + + + + + PAGE 31 - + BALL (ON THE NEW LINE) DIRECTLY BELOW THE FIRST CHARACTER POSITION OF THE OLD LINE, ABOVE. THE USER SPACES THE PRINT BALL TO THE PROPER POSITION AND ACCOMPLISHES THE FOLLOWING ACTIONS: - - + + TO INSERT A STRING, TYPE THE LETTER "I" FOLLOWED BY THE STRING AND A "~". - - + + TO DELETE A STRING, USE THE LETTER "D" FOLLOWED BY SPACES UNDER THE CHARACTERS TO BE DELETED AND THEN A "~". - - + + TO REPLACE A STRING, USE THE LETTER "R" FOLLOWED BY THE NEW STRING OF THE SAME LENGTH AND A "~". - - + + IF THE MODIFICATION IS TO BE DONE IN THE FIRST CHARACTER, THEN INCLUDE THE "I", "R", OR "D" WITH THE INLINE COMMAND. - - + + EXAMPLES: - - + + TO INSERT CHARACTERS INTO A RECORD: -- ------ ---------- ---- - ------- - - + + 300:*INLINE 30500~ 30500:ABCDEFGHIJK 00030500: I12345~ 30500:ABC12345DEFGHIJK - - + + TO DELETE CHARACTERS FROM A RECORD: -- ------ ---------- ---- - ------- - - + + 7700:*INLINE 67700~ 67700:ABCDEFGHIJKLMNOP 00067700: D ~ 67700:ABHIJKLMNOP - - + + TO REPLACE CHARACTERS IN A RECORD: -- ------- ---------- -- - ------- - - + + 600:* INLINE 551~ 551:ABCDEFGHIJKLMNOPQRST 00000551:R12345~ 551:A12345GHIJKLMNOPQRST - - - - - + + + + + PAGE 32 - - - + + + TO MODIFY A RECORD BEGINNING WITH ITS FIRST CHARACTER: -- ------ - ------ --------- ---- --- ----- ---------- - - + + 00006700:*INLINE 70800 D~ 70800:ABCDEFGHIJKLM 00070800: ~ 70800:DEFGHIJKLM 70900:* INLINE D; ~ 70800:EFGHIJKLM - - + + THE "R" AND "I" FORMS OF THIS LATTER CONSTRUCT OPERATE IN A SIMILAR FASHION. - - - - - - + + + + + + PAGE 33 - - - + + + STRINGS ------- - - + + R/C SCANS FOR THE OCCURRENCE OF A STRING BY USE OF THE "* SCAN" AND "* CHANGE" VERBS. IN THIS APPLICATION THE FOLLOWING DEFINITION OF "STRING" APPLIES: - - + + ::= ::= "/ ( / [ / . ::= "/ ) / ] / . @@ -1651,135 +1669,135 @@ TO THE CHARACTER USED.} ::= {EMPTY} / @ / @- - - + + IF THE STRING IS DELIMITED BY PERIODS, AN ADDED CHECK WILL BE MADE BEFORE DETERMINING A MATCHED STRING. THIS CHECK INSURES THAT THE MATCHED STRING WILL BE IMMEDIATELY PRECEEDED AND FOLLOWED BY A NON-ALPHANUMERIC CHARACTER. HENCE THIS FORM SHOULD BE USED FOR IDENTIFIERS. - - + + IF THE IS SPECIFIED, A MATCH WILL BE FOUND ONLY IF THE FIRST CHARACTER APPEARS WITHIN THE RANGE. - - + + EXAMPLES: - - + + "FD"@8 - + .LIST. - + "M := IMAGE [5] ;"@15-25 - + ( WORD [I] := "SCAN" ;) - + ["] - + "" - - - - - - + + + + + + PAGE 34 - - - + + + CHANGING THE OCCURRENCE OF A STRING (CHANGE) -------- --- ---------- -- - ------ -------- - - + + ENTIRE STRINGS MAY BE CHANGED IN A FILE BY USE OF THE "* CHANGE" VERB. - - - * CHANGE TO - - ------ -------- -- -------- - - + + + * CHANGE TO + - ------ -------- -- -------- + + SCANS THE CURRENT RECORD REPLACING EVERY OCCURRENCE OF THE FIRST STRING WITH THE SECOND. IF NO " TO " APPEARS THE PREVIOUSLY USED STRINGS WILL BE USED AGAIN. - - + + * CHANGE TO - ------ --- -------- -- -------- - - + + AS ABOVE, FOR THE RECORD WITH SEQUENCE NUMBER . - - + + * CHANGE , TO - ------ ---- --- -------- -- -------- - - + + AS ABOVE, FOR ALL RECORDS FROM SEQUENCE NUMBER TO . - - + + * CHANGE ECHO ON - ------ ---- -- - - + + * CHANGE ECHO OFF - ------ ---- --- - - + + * CHANGE ECHO - ------ ---- - - + + THE MODIFIED RECORDS WILL BE TYPED ON THE TELETYPE IF THE CHANGE ECHO IS ON. (IT IS INITIALLY OFF.) THE ABOVE COMMANDS ARE USED TO SET THE OPTION AND TO PRINT ITS CURRENT VALUE. ITS SETTING MAY BE REVERSED FOR A COMMAND BY PREFIXING THE CHANGE WITH A -. (E.G. *-CHANGE "X" TO "Z".) - - - - - - + + + + + + PAGE 35 - - + + EXAMPLES: - - + + 00004200:* CHANGE "REMOTE/CARD" TO "R/C";*CHANGE 5300~ 00005300: - + 8700:* -CHANGE -1 .TWX.@25-30 TO "TELETYPWRITER"~ - 8600: THE OUTPUT IS TYPED ON THE TELETYPWRITER IF + 8600: THE OUPUT IS TYPED ON THE TELETYPWRITER IF 00008600: - + 450:* CHANGE 232, 448 "IMAGE [I]" TO (Z [J])~ WAIT... 00000448: - + 47000:* CHANGE 2200+6 " "@1 " "~ 00002800:* CHANGE +1+3 " "@1 ""~ 00003200: - - - - + + + + PAGE 36 - - - + + + SCANNING FOR OCCURRENCE OF A STRING (SCAN) -------- --- ---------- -- - ------ ------ - - + + * SCAN - ---- -------- - - + + SCANS THE FILE FROM THE CURRENT SEQUENCE NUMBER TO THE END OF THE FILE OR UNTIL THE FIRST OCCURRENCE OF . IF THE STRING IS FOUND THE RECORD CONTAINING IT IS TYPED ON @@ -1789,58 +1807,58 @@ THE SAME AS IN THE LAST "* SCAN" OR "* CHANGE" COMMAND. IF THE SCAN VERB IS PREFIXED BY A -, THE SCAN WILL BE FOR RECORDS NOT CONTAINING THE . - - + + * SCAN - ---- --- -------- - - + + AS ABOVE, EXCEPT THAT THE SCAN BEGINS AT SEQUENCE NUMBER . - - + + * SCAN , - ---- ---- --- -------- - - + + AS ABOVE, EXCEPT THAT THE SCANNING STOPS AFTER SEQUENCE NUMBER . - - + + * SCAN - ---- ----------- -------- - - + + THE FILE IS SCANNED FOR . EVERY RECORD IN WHICH OCCURS IS TYPED ON THE TELETYPEWRITER. - - + + * SCAN - ---- ----------- --- -------- - - + + AS ABOVE, EXCEPT THE SCAN BEGINS AT RECORD NUMBER . - - - - - - - + + + + + + + PAGE 37 - + * SCAN , - ---- ----------- ---- --- -------- - - + + AS ABOVE, EXCEPT THAT THE SCAN STOPS AFTER THE -TH RECORD. - - + + EXAMPLES: - - + + :* SCAN LIBRARY/FILE "TABLE OF CONTENTS"@3~ WAIT... 1:% TABLE OF CONTENTS ... READDATA @@ -1850,7 +1868,7 @@ 274:% TABLE OF CONTNETS ... DATE 285:% TABLE OF CONTENTS ... DATE : - + 8700:* SCAN 1 .PRINTER. .LINE.~ WAIT... 100: FILE PRINTER 1 (2, 15) ; @@ -1861,262 +1879,262 @@ WAIT... EOF NO STRING 8700: - - - + + + PAGE 38 - - - - RECORD FORMATTING (EDIT) - ------ ---------- ------ - - - RECORDS MAY BE FORMATTED BY THE FOLLOWING CONSTRUCTS: - - + + + + RECORD FORMATING (EDIT) + ------ --------- ------ + + + RECORDS MAY BE FORMATED BY THE FOLLOWING CONSTRUCTS: + + * EDIT , : - ---- ---- ---- --- - - + + EDITS EACH RECORD FROM SEQUENCE NUMBER TO ACCORDING TO THE FORMAT RECORD WITH SEQUENCE NUMBER . - - + + THE RESULT OF THE EDIT IS THAT EACH RECORD BECOMES IDENTICAL WITH THE FORMAT RECORD EXCEPT WHERE THERE IS A "#" OR "@" CHARACTER IN FORMAT RECORD. EACH "@" IS REPLACED BY THE NEXT CHARACTER OF THE INPUT RECORD. EACH "#" SKIPS THE NEXT CHARACTER OF THE INPUT RECORD. - - + + * EDIT ECHO ON - ---- ---- -- - - + + * EDIT ECHO OFF - ---- ---- --- - - + + * EDIT ECHO - ---- ---- - - + + THE MODIFIED RECORDS WILL BE TYPED ON THE TELETYPE IF THE EDIT ECHO IS ON. (IT IS INITIALLY OFF.) THE ABOVE COMMANDS ARE USED TO SET THE ECHO AND TO PRINT ITS CURRENT SETTING. IT SETTING MAY BE REVERSED FOR A COMMAND BY - PREFIXING THE EDIT WITH A -. (E.G. *- EDIT 200,800:2) - - + PREFIXING THE EDIT WITH A -. (E.G. *- EDIT 200,800:2.) + + EXAMPLE: - - + + 100:1234567890~ 200:ABCDEFGHIJK~ 300: @@@...@@. THIS IS THE WAY THE LINE ENDS...@##@@@~ 400:* -EDIT 100, 200:300~ 100: 123...45. THIS IS THE WAY THE LINE ENDS...690 200: ABC...DE. THIS IS THE WAY THE LINE ENDS...FIJK - - - - - - + + + + + + PAGE 39 - - - + + + RESEQUENCING RECORD NUMBERS (RESEQ) ------------ ------ ------- ------- - - + + FILE SEQUENCE NUMBERS MAY BE MODIFIED BY THE FOLLOWING CONSTRUCTS: - - + + * RESEQ - ----- - - + + RESEQUENCES THE FILE BY THE CURRENT INCREMENT COUNTER. - - + + * RESEQ - ----- --- - - + + SETS THE INCREMENT COUNTER TO AND RESEQUENCES. - - + + * RESEQ , - ----- ---- --- - - + + RESEQUENCES THE SEQUENCE NUMBERS THRU BY THE CURRENT INCREMENT COUNTER. THE FIRST SEQUENCE NUMBER IS . - - + + * RESEQ , , - ----- ---- ---- --- - - + + AS ABOVE, EXCEPT THAT THE FIRST SEQUENCE NUMBER IS . - - + + * RESEQ , , , - ----- ---- ---- ---- --- - - + + AS ABOVE, EXCEPT THE INCREMENT IS SET TO FIRST. - - + + EXAMPLES: - - + + 895:* RESEQ~ 323:* RESEQ 100~ 32300: - - - - - - + + + + + + PAGE 40 - - - + + + DELETION OF RECORDS (DELETE) -------- -- ------- -------- - - + + RECORDS MAY BE DELETED FROM A FILE BY THE FOLLOWING CONSTRUCTS: - - + + * DELETE - ------ --- - - + + DELETES CARD IMAGE . - - + + * DELETE , - ------ ---- --- - - + + DELETES CARD IMAGES THROUGH . - - + + * DELETE - ------ - - + + DELETES THE CURRENT CARD. - - + + EXAMPLES: - - + + 3400:* DELETE 3300~ 3300: - + 2100:* DELETE 1500, + 3;* LIST 1400,2000~ 1400: BEGIN 1900: GO TO ERROR ; 2000: END ; 2100: - + 2100:* 2000~ 2000: END ; 00002000:*DELETE~ 2000: - - - - - + + + + + PAGE 41 - - - - - - - - - - - + + + + + + + + + + + OPERATIONAL COMMANDS ----------- -------- - - - - + + + + PAGE 42 - - - + + + SET THE INCREMENT COUNTER (INC) --- --- --------- ------- ----- - - + + THE INCREMENT COUNTER MAY BE SET BY THE CONSTRUCT "* INC". - - + + * INC - --- --- - - + + THIS CONSTRUCT SETS THE INCREMENT COUNTER TO . - - + + * INC - --- - - + + THIS CONSTRUCT PRINTS THE CURRENT VALUE. - - + + EXAMPLES: - - + + 100:BEGIN~ 200: INTEGER I, J, K ;~ 300:* INC 3~ 300: BOOLEAN B ;~ 303: REAL X, Y, Z ;~ 306: - - + + PAGE 43 - - - + + + NON-TELETYPEWRITER CHARACTERS (PERCENT) ------------------ ---------- --------- - - + + SPECIAL CHARACTERS ON THE B5500 BUT NOT AVAILABLE ON THE TELETYPEWRITER KEYBOARD (INCLUDING THE QUESTION MARK "?") MAY BE INSERTED INTO R/C MAINTAINED FILES BY THE "* PERCENT" CONSTRUCT. - - + + * PERCENT ON - ------- -- - - + + * PERCENT OFF - ------- --- - - + + * PERCENT - ------- - - + + THE "* PERCENT" CONSTRUCTS ALLOW A USER TO INPUT THE SPECIAL RESERVED CHARACTERS (I.E. LEFT-ARROW, NEQ, LSS, GEQ, GTR, LEQ, AND ?). THE ABOVE COMMANDS ARE USED TO SET @@ -2124,8 +2142,8 @@ PERCENT OPTION IS ON, INPUT FROM THE TELETYPEWRITER IS SCANNED FOR SPECIAL CHARACTER PAIRS. IF A PAIR IS FOUND IT IS REPLACED BY THE SINGLE CHARACTER AS FOLLOWS: - - + + CHARACTER PAIR INTERNAL CHARACTER -------------- ------------------ %- ~ (LEFT ARROW) @@ -2136,24 +2154,24 @@ %] } (GEQ) %% ? (QUESTION MARK) %* * (STAR) (1ST CHR ONLY) - - + + A "%" FOLLOWED BY ANY OTHER CHARACTER REMAINS AS IS. WHEN THE PERCENT OPTION IS ON, THE TRANSLATION TAKES PLACE IMMEDIATELY. HENCE ONLY ONE BACKSPACE (SHIFT 7) IS NEEDED. - - + + EXAMPLES: - - + + 100:* PERCENT OFF~ - - - - - + + + + + PAGE 44 - + 100:%% COMPILE ... %= %( %A~ 200:* PERCENT ON~ 200:%% COMPILE ... %= %( %A~ @@ -2161,359 +2179,359 @@ 100:%% COMPILE ... %= %( %A 200:? COMPILE ... ! < %A 300: - - + + NOTE THAT ON THE TELETYPWRITER THE CHARACTERS "!" AND "<" WOULD HAVE BEEN TYPED AS A "$". - - - - - + + + + + PAGE 45 - - - + + + R/C VERB RENAMING (REPLACE) --- ---- -------- --------- - - + + R/C VERBS MAY BE REPLACED BY OTHER WORDS THROUGH THE CONSTRUCT "* REPLACE". - - + + * REPLACE : - ------- ------- - - + + THE REPLACE VERB RENAMES THE VERB WITH THE WORD . - - + + EXAMPLES: - - + + :* REPLACE LIST:TYPE~ :* REPLACE INLINE:IN~ :* REPLACE REPLACE:R~ :* R CHANGE:C~ : - - - + + + PAGE 46 - - - + + + AUTOMATIC FIRST CHARACTER PLACEMENT (TAB) --------- ----- --------- --------- ----- - - + + R/C USERS MAY INITIALLY (AUTOMATICALLY) PRE-POSITION THE PRINT BALL AT ANY COLUMN BY USE OF THE "* TAB" CONSTRUCT. - - + + * TAB - --- --- - - + + SETS UP AUTOMATIC INDENTING TO POSITION , WHERE 1 LEQ LEQ 54. - - + + * TAB + - --- ---- - - + + * TAB - - --- ---- - - + + ADJUSTS THE TAB AMOUNT BY THE VALUE OF . - - + + * TAB ON - --- -- - - + + * TAB OFF - --- --- - - - *TAB - ---- - - + + + * TAB + - --- + + THE TAB OPTION PERMITS THE USER (BY SETTING THE OPTION OFF) TO SURPRESS THE TAB SPACING ON THE TELETYPEWRITER. THE AUTOMATIC INDENTING STILL APPLIES TO THE RECORDS CREATED. THE LAST CONSTRUCT PRINTS BOTH THE SETTING OF THE OPTION AND THE TAB VALUE. - - + + EXAMPLE: - - - 4500:* TAB~ + + + 4500:* TAB 5~ 4500: BEGIN~ - - - - - + + + + + PAGE 47 - + 4600: * TAB+2~ 4600: K := K + DELTAK ;~ 4700: * TAB - 2;END ;~ 4800: * TAB 1~ 4800: - - - - - + + + + + PAGE 48 - - - + + + SETTING THE SAVE FACTOR (SAVE) ------- --- ---- ------ ------ - - + + THE SAVE FACTOR OF A DISK FILE IS THE NUMBER OF DAYS AFTER ITS LAST ACCESS BEFORE IT WILL BE CONSIDERED EXPIRED. THE SAVE FACTOR FOR A NEW USER IS SET AT 7 DAYS. IT MAY BE CHANGED BY: - - + + * SAVE - ---- --- - - + + SETS THE SAVE FACTOR AT DAYS. - - + + * SAVE - ---- - - + + PRINTS THE CURRENT VALUE OF THE SAVE FACTOR. - - + + EXAMPLE: - - + + :* SAVE 10~ : - - - - + + + + PAGE 49 - - - + + + TABULATING (COLUMN) ---------- -------- - - + + * COLUMN - ------ --------- ------- - - + + * COLUMN ON - ------ -- --------- ------- - - + + * COLUMN OFF - ------ --- --------- ------- - - + + * COLUMN - ------ ------ ------ ------ ------ ----- ------- - - + + THE COLUMN VERB IS USED TO SET UP COLUMN POSITIONS AND INDICATE WHAT CHARACTER IS THE COLUMN CHARACTER. THE FIRST FORM PRINTS THE CURRENT SETTINGS. THE SECOND AND THIRD FORMS ARE USED TO TURN THE OPTION ON OR OFF. THE FOURTH FORM SETS UP FROM 1 TO 4 COLUMN POSITIONS. ANY FORM MAY SET THE COLUMN CHARACTER. - - + + WHEN THE OPTION IS ON, EACH OCCURENCE OF THE COLUMN CHARACTER IN AN INPUT RECORD CAUSES BLANKS TO BE INSERTED TO THE NEXT HIGHER COLUMN POSITION. - - + + EXAMPLE: - - + + :COLUMN ON "#";* COLUMN 10 20 25;COLUMN~ - COLUMN ON # 10 20 25 + COLUMN ON # 10 20 25 :OPEN COLUMN/SHOW ALGOL NEW~ 100:ABC#123#XYZ#IJK#789~ 200:* LIST~ 100:ABC 123 XYZ IJK#789 200:123456789012345678901234567890~ 300: - - - - - - + + + + + + PAGE 50 - - - - - - - - - - - + + + + + + + + + + + AUXILIARY COMMANDS --------- -------- - - - - + + + + PAGE 51 - - - + + + MESSAGES TO OTHERS (MAIL) -------- -- ------ ------ - - + + MESSAGES MAY BE RECEIVED FROM, AND SENT TO, OTHER USERS OF R/C BY THE "* MAIL" VERB DESCRIBED BELOW. - - + + * MAIL - ---- - - + + THIS LISTS THE MAIL SENT TO YOU, AND REMOVES IT FROM YOUR "MAIL-BOX". - - + + * MAIL TO : MESSAGE - ---- -- ----------- ------- - - + + THIS ADDS YOUR MESSAGE TO THE -S MAIL. - - + + EXAMPLES: - - + + :* MAIL~ PLEASE SEE ME WHEN YOU GET A CHANCE-BALDWIN THERE WILL NOT BE ANY REMOTE TIME 10/24/70-SYSTEM - :* MAIL TO BALDWIN:MY OFFICE - 10AM- FRIDAY~ - - + :* MAIL TO BALDWIN:MY OFFICE- 10AM- FRIDAY~ + + PAGE 52 - - - + + + HOW TO DETACH YOURSELF FROM R/C (END) --- -- ------ -------- ---- --- ----- - - + + THREE METHODS ARE AVAILABLE TO THE USER WHEN HE WISHES TO MAKE AN EXIT FROM R/C: - - + + * END - --- - - + + * END - --- --- - - + + * END DS - --- -- - - + + THE FIRST CONSTRUCT DETACHES THE USER FROM R/C. - - + + THE SECOND CONSTRUCT CAUSES R/C TO REMEMBER, FROM ONE RUN TO THE NEXT, THE VALUES OF THE OPTIONS AND THE EFFECTS OF THE "* REPLACE" VERB. THE "* END" CONSTRUCT DOES NOT GENERATE THIS LASTING EFFECT. DENOTES ANY ALPHANUMERIC CHARACTER STRING. - - + + THE THIRD CONSTRUCT ALLOWS A USER TO END WITHOUT CLOSING THE OPEN FILE. R/C REMEMBERS THE FILE STRUCTURE FOR THE NEXT TIME. HOWEVER THE FILE SHOULD NOT BE ACCESSED BY ANY OTHER PROGRAM UNTIL IT IS CLOSED USING R/C. THIS FORM CAN BE USED WHEN THE FILE EDITING IS SPLIT OVER MORE THAN ONE RUNNING OF R/C. - - + + EXAMPLES: - - + + :* END~ GOOD BYE - + 634:* END X~ WAIT... GOOD BYE - + 892:* END DS~ GOOD BYE - - - - - - + + + + + + PAGE 53 - - - - LEARNING ABOUT R/C ON THE TELETYPEWRITER (TEACH) - -------- ----- --- -- --- -------------- ------- - - - THE TEACH VERB ALLOWS A USER AT THE TELETYPEWRITER TO LEARN + + + + LEARNING ABOUT R/C ON THE TELETYPWRITER (TEACH) + -------- ----- --- -- --- ------------- ------- + + + THE TEACH VERB ALLOWS A USER AT THE TELETYPWRITER TO LEARN ABOUT THE R/C VERBS AND SPECIFICALLY WHAT VERBS HE MAY USE. - - + + * TEACH - ----- - - + + THIS LISTS THE VERBS THAT YOU ARE PERMITTED TO USE. THE LIST REFLECTS THE USE OF REPLACE ON ANY OF THE VERBS. - - + + * TEACH - ----- ------ - - + + THIS LISTS THE SYNTAX AND SEMANTICS OF THE RESERVED WORD . - - + + EXAMPLES: - - + + :* TEACH SAVE~ * SAVE $N$ SETS THE SAVE FACTOR AT $N$ DAYS. * SAVE PRINTS THE CURRENT VALUE OF THE SAVE FACTOR. : - + 121970:* TEACH~ THE VALID REQUESTS ARE: EXECUTE DITTO COPY IN ZIP C EDIT @@ -2523,46 +2541,46 @@ FOR SYNTAX OF A VERB (E.G. TAB), INPUT: * TEACH VERB. (E.G. * TEACH TAB) 121970: - - + + NOTE THAT THE USE OF THE REPLACE VERB (FOR INLINE AND CHANGE) IS REFLECTED BY THE TEACH VERB. - - - + + + PAGE 54 - - - - - - - - - - - + + + + + + + + + + + MACRO VERB ----- ---- - - - - + + + + PAGE 55 - - - + + + MACRO (EXECUTE) ----- --------- - - - THE EXECUTE VERB GIVES R/C A SIMPLE MACRO CAPABILITY. - - + + + THE EXECUTE VERB GIVES R/C USERS A SIMPLE MACRO CAPABILITY. + + * EXECUTE - ------- -------- --------- --------- ----- - - + + RECORDS ARE READ FROM THE AND TREATED AS IF THEY CAME FROM THE TELETYPE. HENCE, THEY MAY CONTAIN COMMANDS. THE , IF PRESENT, @@ -2574,58 +2592,58 @@ THE REPEAT FACTOR IS AN INTEGER FROM 0 TO 999 AND INDICATES THE NUMBER OF TIMES TO PERFORM THE EXECUTE. IF IT IS NOT SPECIFIED, IT IS ASSUMED TO BE 1. - - + + * EXECUTE ECHO ON - ------- ---- -- - - + + * EXECUTE ECHO OFF - ------- ---- --- - - + + * EXECUTE ECHO - ------- ---- - - + + IF THE EXECUTE ECHO IS ON, EACH RECORD WILL BE TYPED ON THE TELETYPE BEFORE IT IS EXECUTED. IT IS INITIALLY OFF. IT MAY BE REVERSED FOR ONE COMMAND BY PREFIXING THE COMMAND BY A -. - - + + * EXECUTE LIBRARY = - ------- ------- - ------ - - + + * EXECUTE LIBRARY - ------- ------- - - + + THE EXECUTE LIBRARY FACILITY ALLOWS THE USER TO - - - - - + + + + + PAGE 56 - + ABBREVIATE: - + * EXECUTE / (P1,P2,P3,P4) - + WITH: - + * P1,P2,P3,P4 - - + + THE IS "MACRO" AND ANY OTHER NAME - DESIGNATED THRU THE - - + DESIGNATED THRU THE * EXECUTE LIBRARY = COMMAND. + + EXAMPLES: - - + + :* OPEN CREATE/MACRO DATA NEW~ 100:%* OPEN #1/#2 #3 NEW~ 200:* CLOSE~ @@ -2633,7 +2651,7 @@ 100:%* DITTO #1,#2 MOVE~ 200:*CLOSE~ : - + 5700:* TEACH CC~ 1:* SCAN + 1 "$$"@1 2:* DELETE -1 @@ -2645,139 +2663,139 @@ 2200:$$ JOB 2900:$$ IBJOB 2840: - - - - - + + + + + A- 1 - - - - - - - - - - - + + + + + + + + + + + APPENDIX A -------- - R/C SOURCE TAPE --- ------ ---- - - - - - - - - - - + + + + + + + + + + R/C RESIDES ON A SYSTEM DUMP TAPE CONTAINING THE FILES - - + + 1. RCSY94/RON 2. TEACHER/0000094 3. XREF/JONES - - + + THE FILES SHOULD BE LOADED USING THE CONTROL DECK: - - - ? LOAD FROM RC RCSYS94/RON,TEACHER/0000094,XREF/JONES. + + + ? LOAD FROM RC RCSY94/RON,TEACHER/0000094,XREF/JONES. ? END. - - + + RCSY94/RON IS THE SOURCE FILE FOR THE PROGRAM R/C. IT SHOULD BE COMPILED WITH: - - + + ? COMPILE R/C WITH ALGOL FOR LIBRARY. ? ALGOL FILE TAPE = RCSY94/RON SERIAL. ? STACK = 256. ? CORE = 2800. = 2500 + 100 | MAXUSERS. ? PRIORITY = 1. ? DATA + $ TAPE 99999999 ? END. - - - - - - - + + + + + + A- 2 - + + WHEN PATCHES ARE ISSUED THEY SHOULD BE PLACED AFTER THE "$ TAPE" CARD AND R/C SHOULD BE RECOMPILED. - - + + THE MAXIMUM NUMBER OF USERS HANDLED BY R/C IS DEFINED TO BE 3 IN RCSY94/RON. TO INCREASE THE NUMBER, A PATCH CARD MUST BE ADDED. AS AN EXAMPLE, THE FOLLOWING CARD SHOULD BE ADDED TO INCREASE THE MAXIMUM NUMBER OF USERS TO 5. - DEFINE MAXUSERS = 5#, MAXUSER =4# ; 00002500 - - + DEFINE MAXUSERS = 5#, MAXUSER =4# ; 00002500 + + THE OUTPUT BUFFERS ARE DEFINED TO BE 56 CHARACTERS IN RCSY94/RON. THEY MAY BE SET AT 28 CHARACTERS USING THE FOLLOWING PATCH CARDS: - DEFINE CHRSPERBUFFER = 28#, % OR 56 00002600 - WORDSPERBUFFER = 5#, % OR 8 00002700 - WRDSPERBUFFER = 4# ; % OR 7 00002800 - - + DEFINE CHRSPERBUFFER = 28#, % OR 56 00002600 + WORDSPERBUFFER = 5#, % OR 8 00002700 + WRDSPERBUFFER = 4# ; % OR 7 00002800 + + TEACHER/0000094 IS AN AUXILIARY FILE USED BY R/C. IT IS ALSO THE USERS REFERENCE MANUAL. THE PROGRAM XREF/JONES IS PROVIDED FOR GENERATING THE REFERENCE MANUAL AND FOR UPDATING THE TEACHER FILE. (NOTE, ONLY THE OBJECT CODE FOR XREF/JONES IS INCLUDED. THE SOURCE CAN BE OBTAINED THROUGH THE CUBE LIBRARY ON REQUEST.) - - + + THE FOLLOWING DECK WILL PRODUCE A USERS REFERENCE MANUAL. - - + + ? EXECUTE XREF/JONES. ? FILE DISK = TEACHER/0000094. ? DATA CARD. $ DISK SIX DOCONLY DOCUMENT FINAL 99999999 ? END. - - + + PATCHES TO R/C AND THE TEACHER FILE WILL BE ISSUED THRU CUBE. - RATHER THAN PATCH DECKS, NEW SYMBOL FILES WILL BE INCLUDED ON THE - CUBE TAPE. THE SEQUENCE NUMBERS WILL REMAIN THE SAME EXCEPT IN - THE PATCHED AREA. - - - - + RATHER THAN PATCH DECKS, NEW SYMBOLIC FILES WILL BE INCLUDED ON + THE CUBE TAPE. THE SEQUENCE NUMBERS WILL REMAIN THE SAME EXCEPT + IN THE PATCHED AREA. + + + B- 1 - - - - - - - - - - - + + + + + + + + + + + APPENDIX B -------- - R / C USER-S GUIDE - - - ------ ----- - - + + B- 2 - + * CHANGE TO * CHANGE TO * CHANGE TO @@ -2791,7 +2809,7 @@ * COLUMN * COLUMN ON * COLUMN OFF - * COLUMN + * COLUMN * COMPILE * COMPILE * COPY @@ -2831,13 +2849,13 @@ * EXECUTE ECHO OFF * EXECUTE ECHO * EXECUTE LIBRARY = - - - - - + + + + + B- 3 - + * EXECUTE LIBRARY * INC * INC @@ -2891,18 +2909,18 @@ * QUICK * QUICK NO * QUICK - - - - - + + + + + B- 4 - + * QUICK * QUICK * QUICK * REMOVE - * REPLACE : + * REPLACE : * RESEQ * RESEQ * RESEQ @@ -2934,7 +2952,7 @@ *-SCAN *-SCAN *-SCAN - * TAB + * TAB * TAB + * TAB - * TAB ON @@ -2944,16 +2962,16 @@ * TEACH * ZIP * ZIP - - - - - - - - + + + + + + + + TABLE OF CONTENTS - + INTRODUCTION. . . . . . . . . . . . . . . . . . . . . . . . . . PAGE 1 PROGRAM OPERATION AND RECORD SEQUENCING . . . . . . . . . . . . PAGE 2 PROGRAM EXECUTION . . . . . . . . . . . . . . . . . . . . . . . PAGE 3 @@ -2983,7 +3001,7 @@ RECORD HANDLING VERBS . . . . . . . . . . . . . . . . . . . . . PAGE 25 STRINGS. . . . . . . . . . . . . . . . . . . . . . . . . . PAGE 33 CHANGING THE OCCURRENCE OF A STRING (CHANGE) . . . . . . . PAGE 34 SCANNING FOR OCCURRENCE OF A STRING (SCAN) . . . . . . . . PAGE 36 - RECORD FORMATTING (EDIT) . . . . . . . . . . . . . . . . . PAGE 38 + RECORD FORMATING (EDIT). . . . . . . . . . . . . . . . . . PAGE 38 RESEQUENCING RECORD NUMBERS (RESEQ). . . . . . . . . . . . PAGE 39 DELETION OF RECORDS (DELETE) . . . . . . . . . . . . . . . PAGE 40 OPERATIONAL COMMANDS. . . . . . . . . . . . . . . . . . . . . . PAGE 41 @@ -2996,10 +3014,18 @@ OPERATIONAL COMMANDS. . . . . . . . . . . . . . . . . . . . . . PAGE 41 AUXILIARY COMMANDS. . . . . . . . . . . . . . . . . . . . . . . PAGE 50 MESSAGES TO OTHERS (MAIL). . . . . . . . . . . . . . . . . PAGE 51 HOW TO DETACH YOURSELF FROM R/C (END). . . . . . . . . . . PAGE 52 - LEARNING ABOUT R/C ON THE TELETYPEWRITER (TEACH) . . . . . PAGE 53 + LEARNING ABOUT R/C ON THE TELETYPWRITER (TEACH). . . . . . PAGE 53 MACRO VERB. . . . . . . . . . . . . . . . . . . . . . . . . . . PAGE 54 MACRO (EXECUTE). . . . . . . . . . . . . . . . . . . . . . PAGE 55 APPENDIX A. . . . . . . . . . . . . . . . . . . . . . . . . . . A- 1 R/C SOURCE TAPE . . . . . . . . . . . . . . . . . . . . . . . . A- 1 APPENDIX B. . . . . . . . . . . . . . . . . . . . . . . . . . . B- 1 R / C USER-S GUIDE. . . . . . . . . . . . . . . . . . . . . . . B- 1 + + + + + + + + LABEL 000000000LINE 00188158?EXECUTE XREF/JONES XREF /JONES diff --git a/RC-Ron-Brody/README.txt b/RC-Ron-Brody/README.txt index 3b56876..e7b6482 100644 --- a/RC-Ron-Brody/README.txt +++ b/RC-Ron-Brody/README.txt @@ -34,7 +34,10 @@ of the source was done by Paul Kimpel. The transcriptions have now been renamed and moved under the respective files extracted from the CUBEB13 tape so that they will appear in the -versioned history of those files. +versioned history of those files: + + RCSY94.RON.alg_m to CUBE-Library-13/Files/RCSY94.Z100006.alg + TEACHER.0000094.txt_m to CUBE-Library-13/Files/TEACHER-0000094.dat RC-Compile.card @@ -89,4 +92,3 @@ __________ text file. 2018-05-26 Paul Kimpel Rename and move transcribed files under /CUBE-Library-13. - diff --git a/Sudoku-Paul-Cumberworth/README.txt b/Sudoku-Paul-Cumberworth/README.txt new file mode 100644 index 0000000..8a3e0b3 --- /dev/null +++ b/Sudoku-Paul-Cumberworth/README.txt @@ -0,0 +1,28 @@ +Sudoku Solver: Paul Cumberworth + +B5500 programs to solve Sudoku puzzles by Paul Cumberworth. He says this +about them: + + "It is still a little ragged around the edges - it is a port of the + one from Michael Mahon's website. I've also just got it running on + the Elliott 803 emulator from Tom Sawyer, and I have passed it on to + Peter Onion to try on the his emulator and maybe the Bletchley Park + Elliott 803." + +There are two programs, one in Extended Algol that uses a stream +procedure to count the bits in a word, and one in XALGOL (Compatible +Algol) that uses bit-wise Boolean logic. Otherwise, the two programs are +currently identical. + +Soduku-Solver-List.lst + Text file listing of the XALGOL version of the program + +Sudoku-Solver.card + Source compile deck for the XALGOL version of the program. + +Proofing-Tools/PDF-Listing-Column-Ruler-ISO-A4.pdf + Source compile deck for the Extended Algol/stream procedure version + of the program. + +March 2019 + diff --git a/Sudoku-Paul-Cumberworth/Soduku-Solver-List.lst b/Sudoku-Paul-Cumberworth/Soduku-Solver-List.lst new file mode 100644 index 0000000..5cc6ed9 --- /dev/null +++ b/Sudoku-Paul-Cumberworth/Soduku-Solver-List.lst @@ -0,0 +1,1236 @@ + + + + + + + LABEL 0LINE 0SUDOKU 00188237?COMPILE SUDOKU/TEST WITH XALGOL GO XALGOL /SUDOKU + + + + + + BURROUGHS B-5700 XALGOL COMPILER MARK XIII.0 WEDNESDAY, 08/24/88, 5:49 AM. + + + + + + %CARD STACK SEG PRT LIST SINGLE DEBUGN 0000 + + % SUDOKU SOLVER 0000 + + % ORIGINALLY WRITTEN IN C BY SCOTT HEMPHILL AND PLACED IN 0000 + + % THE PUBLIC DOMAIN 5 SEPTEMBER 2005 0000 + + % CONVERTED TO B5500 BY PAUL C JULY 2018 0000 + + % MAKE SURE STACK SET TO AT LEAST 5000 WORDS TO COPE WITH RECURSION 0000 + + BEGIN 0000 + + START OF SEGMENT ********** 2 + + BOOLEAN 0000 + + FINDMULTIPLE; % FIND MULTIPLE SOLUTIONS (SET COMMON = 1 IN CC) 0000 + + INTEGER 0000 + + NUM, % COUNT OF NUMBER OF SOLUTIONS FOUND 0000 + + CURDEPTH, % CURRENT RECURSION DEPTH 0000 + + MAXDEPTH, % MAXIMUM RECURSION DEPTH 0000 + + STARTET; % TIME(1) OF WHEN WE STARTED 0000 + + INTEGER ARRAY 0000 + + BITNO[0:11], % ALLOW FOR 12 BITS, ONLY USE 9 THOUGH 0000 + + GRID [0:80], % THE PUZZLE GRID: 1 THRU 9, OR 0 IF NO NUMBER YET 0002 + + BITS [0:80], % BITMAP OF EACH SQUARE: BIT SET => NOT POSSIBLE 0003 + + % I.E. 3"001" => !1, 3"002" => !2, 3"004" => !3, 0005 + + % 3"010" => !4, ... 3"400" => !9. 0005 + + COUNT [0:511], % BIT COUNT FOR EACH NUMBER 0005 + + OTHERSARY [0:80, 0:19]; 0007 + + DEFINE OTHERS(X,Y) = 0009 + + OTHERSARY[X,Y] #; % MAKE IT EASIER TO OPTIMISE LATER 0009 + + % FOR EACH SQUARE, AN ARRAY OF 20 "OTHER" 0009 + + % LOCATIONS AFFECT BY THIS SQUARE. FOR 0009 + + % EXAMPLE, IF THERE IS A "6" IN SQUARE 0, 0009 + + % THERE ARE 20 OTHER SQUARES WE KNOW 0009 + + % CANT CONTAIN A SIX: 0009 + + % 1,2,3,4,5,6,7,8 (HORIZONTAL ROW) 0009 + + % 9,18,27,36,45,54,63,72 (VERTCAL COLUMN) 0009 + + % 1,2,9,10,11,18,19,20 (3X3 SQUARE) 0009 + + % THATS A TOTAL OF 24 SQUARE NUMBERS, 0009 + + % BUT 4 OF THEM ARE DUPLICATES. THE 0009 + + % "OTHERS" ARRAY IS BIG ENOUGH TO HOLD 0009 + + % 24 NUMBERS WHILE IT IS BEING BUILT, BUT 0009 + + % WILL ONLY 20 NUMBERS WILL BE USED WHEN 0009 + + % IT IS COMPLETE. 0009 + + 0009 + + FILE CARD (2,10,150); 0009 + + FILE SPO 11 (1,10); 0012 + + FILE LINE 15 (1,15); % 15, 17 IS PRINTER BACKUP DISK 0016 + + 0019 + + INTEGER PROCEDURE ONES32(I); % FROM HACKERS DELIGHT 0019 + + %--------------------------- 0019 + + VALUE I; INTEGER I; 0019 + + BEGIN 0019 + + I:= I - REAL(BOOLEAN(I.[31:31]) AND BOOLEAN(3"12525252525")); 0019 + + I:= REAL(BOOLEAN(I.[31:30]) AND BOOLEAN(3"6314631463")) + 0022 + + REAL(BOOLEAN(I) AND BOOLEAN(3"6314631463")); 0023 + + I:= REAL(BOOLEAN(I.[31:28] + I) AND BOOLEAN(3"1703607417")); 0025 + + I:= I + I.[31:24]; 0027 + + I:= I + I.[31:16]; 0029 + + ONES32:= REAL(BOOLEAN(I) AND BOOLEAN(3"77")); 0030 + + END; 0032 + + 0037 + + PROCEDURE SETBOX(N, X, BIT); 0037 + + %--------------------------- 0037 + + VALUE N, X, BIT; INTEGER N, X, BIT; 0037 + + % "SETBOX" IS USED TO PLACE A NUMBER IN THE GRID, WHETHER IT IS KNOWN, 0037 + + % OR A GUESS. IT ALSO UPDATES ALL THE BITMASKS FOR ALL THE ASSOCIATED 0037 + + % SQUARES TO INDICATE THAT THEY CANT CONTAIN THIS NUMBER. 0037 + + BEGIN 0037 + + INTEGER I; 0037 + + START OF SEGMENT ********** 3 + + 0000 + + GRID[N]:= X; 0000 + + FOR I:= 0 STEP 1 UNTIL 19 DO 0001 + + BITS[OTHERS(N,I)]:= REAL(BOOLEAN(BITS[OTHERS(N,I)]) OR 0002 + + BOOLEAN(BIT)); 0005 + + END; 0008 + + 3 IS 11 LONG, NEXT SEG 2 + + 0037 + + PROCEDURE READGRID; 0037 + + %------------------ 0037 + + % READ IN INITIAL DATA 0037 + + % THE INITIAL BITMASK IS CALCULATED AT THE SAME TIME BY CALLING SETBOX 0037 + + BEGIN 0037 + + INTEGER I, J; 0037 + + START OF SEGMENT ********** 4 + + ALPHA ARRAY AIN[0:2]; 0000 + + POINTER P; 0001 + + 0001 + + FOR I:= 0 STEP 1 UNTIL 8 DO % 9 ROWS OF 9 NUMBERS 0001 + + BEGIN 0003 + + READ(CARD, 3, AIN[*]); 0003 + + P:= POINTER(AIN[0]); 0007 + + FOR J:= 0 STEP 1 UNTIL 8 DO 0010 + + BEGIN 0011 + + SETBOX(9 | I + J, INTEGER(P,1), 0011 + + BITNO[INTEGER(P,1)]); % SET BITNO, LSB=BIT0 0013 + + P:= P + 1; 0015 + + END; 0017 + + END; 0020 + + 0022 + + %WRITE OUT WHAT WE GOT! 0022 + + WRITE(LINE, <"WE STORED IN GRID:">); 0022 + + 5 IS 6 LONG, NEXT SEG 4 + + FOR I:= 0 STEP 1 UNTIL 8 DO 0025 + + WRITE(LINE, <9I1>, FOR J:= 0 STEP 1 UNTIL 8 DO GRID[9|I+J]); 0026 + + 6 IS 4 LONG, NEXT SEG 4 + + 0040 + + %CHECK FOR CONSISTENCY 0040 + + FOR I:= 0 STEP 1 UNTIL 80 DO 0040 + + IF GRID[I] > 0 THEN 0042 + + IF REAL(BOOLEAN(BITS[I]) AND BOOLEAN(BITNO[GRID[I]])) > 0 THEN 0043 + + BEGIN 0045 + + WRITE(LINE, <"INCONSISTENT DATA IN ",I1,",",I1>, 0046 + + 7 IS 10 LONG, NEXT SEG 4 + + (I DIV 9)+1, (I MOD 9) + 1); 0048 + + J:= 1/0; 0058 + + END; 0059 + + END; 0061 + + 4 IS 66 LONG, NEXT SEG 2 + + 0037 + + PROCEDURE PRINTSOLUTION; 0037 + + %----------------------- 0037 + + BEGIN 0037 + + INTEGER I, J; 0037 + + START OF SEGMENT ********** 8 + + 0000 + + NUM:= NUM + 1; 0000 + + IF NUM > 1 THEN 0001 + + WRITE(LINE, <" ">); % BLANK 0002 + + 9 IS 4 LONG, NEXT SEG 8 + + 0005 + + WRITE(LINE,<"SOLUTION ",I3,":">, NUM); 0005 + + 10 IS 7 LONG, NEXT SEG 8 + + FOR I:= 0 STEP 1 UNTIL 8 DO 0013 + + WRITE(LINE, <9I1>, FOR J:= 0 STEP 1 UNTIL 8 DO GRID[9|I+J]); 0014 + + 11 IS 4 LONG, NEXT SEG 8 + + 0028 + + END; 0028 + + 8 IS 31 LONG, NEXT SEG 2 + + 0037 + + PROCEDURE SELECTBOX; 0037 + + %------------------- 0037 + + % "SELECTBOX" IS THE HEART OF THE ALGORITHM. IT WORKS THIS WAY: 0037 + + % FIRST, THE GRID IS SEARCHED FOR AN EMPTY SQUARE. IF THERE ISNT ONE, 0037 + + % THEN THE GRID CONTAINS A SOLUTION, SO IT IS PRINTED. IF AN EMPTY 0037 + + % SQUARE IS FOUND, THEN IT IS COMPARED WITH ALL OTHER EMPTY SQUARES TO 0037 + + % SEE WHICH ONE OF THEM HAS THE MAXIMUM NUMBER OF 1-BITS IN ITS BITMASK. 0037 + + % THAT SQUARE IS THE ONE SELECTED, AND EACH OF THE POSSIBLE VALUES ARE 0037 + + % TRIED IN RETURN, CALLING "SELECTBOX" RECURSIVELY TO SEARCH FOR A 0037 + + % SOLUTION. NOTE THAT IF A SQUARE HAS 9 1-BITS IN ITS BITMASK, THEN 0037 + + % THERE ARE NO POSSIBLE VALUES, AND "SELECTBOX" WILL RETURN WITHOUT ANY 0037 + + % FURTHER RECURSION. OTHERWISE, IF A SQUARE HAS 8 1-BITS IN ITS BITMASK , 0037 + + % THEN IT HAS A FORCED CHOICE, AND ONLY THAT CHOICE WILL BE TAKEN AT THI S 0037 + + % LEVEL IN THE RECURSION. 0037 + + BEGIN 0037 + + INTEGER ARRAY 0037 + + START OF SEGMENT ********** 12 + + BITSAVE[0:80]; % SAVED ON EVERY RECURSION, MAX DEPTH 81|81 = 4131 WO RDS? 0000 + + INTEGER 0001 + + I, 0001 + + J, 0001 + + BEST, 0001 + + BESTCOUNT; 0001 + + BOOLEAN 0001 + + FINISHED; 0001 + + LABEL XIT; 0001 + + 0001 + + CURDEPTH:= CURDEPTH + 1; 0001 + + MAXDEPTH:= MAX(MAXDEPTH, CURDEPTH); 0003 + + 0006 + + % IF NUM = 0 THEN % RECURSE ONLY IF NO SOLUTIONS SO FAR 0006 + + BEGIN 0006 + + % FIND EMPTY SQUARE 0006 + + BEST:= 0; 0006 + + WHILE NOT FINISHED DO % PREFER TO HAVE CONDITIONAL AND :) 0006 + + IF NOT FINISHED:= GRID[BEST] = 0 THEN 0007 + + FINISHED:= (BEST:= BEST + 1) GTR 80; 0009 + + 0012 + + IF BEST = 81 THEN % 81 INDICATES NO EMPTY SQUARES 0012 + + BEGIN 0013 + + PRINTSOLUTION; 0014 + + GO TO XIT; 0014 + + END; 0015 + + 0015 + + BESTCOUNT:= COUNT[BITS[BEST]]; % BITS IN THE SQUARE WE FOUND 0015 + + FOR I:= BEST+1 STEP 1 WHILE I LSS 81 DO 0016 + + BEGIN % FIND THE BIGGEST COUNT OVER ALL SQUARES 0020 + + IF GRID[I] = 0 THEN % ONLY CONSIDER EMPTY SQUARES 0020 + + BEGIN 0021 + + J:= COUNT[BITS[I]]; 0022 + + IF J > BESTCOUNT THEN 0023 + + BEGIN 0024 + + BEST:= I; 0024 + + BESTCOUNT:= J; 0025 + + END; 0026 + + END; 0026 + + END; 0026 + + 0026 + + % TRY ALL NUMBERS FOR THIS SQUARE 0026 + + FOR I:= 1 STEP 1 WHILE I LEQ 9 DO 0026 + + BEGIN 0030 + + IF REAL(BOOLEAN(BITS[BEST]) AND BOOLEAN(BITNO[I])) = 0 THEN 0030 + + BEGIN % IF THE NUMBER IS POSSIBLE, RECURSE 0032 + + % SAVE STATE ON STACK 0033 + + REPLACE POINTER(BITSAVE) BY POINTER(BITS) FOR 81 WORDS; 0033 + + SETBOX(BEST, I, BITNO[I]); % SET NUMBER AND FIX BITMASK 0037 + + SELECTBOX; % RECURSE 0038 + + GRID[BEST]:= 0; % UNPLACE NUMBER IN SQUARE 0039 + + % RESTORE 0040 + + REPLACE POINTER(BITS) BY POINTER(BITSAVE) FOR 81 WORDS; 0040 + + END; 0044 + + END; 0044 + + END; 0045 + + 0045 + + XIT: 0045 + + CURDEPTH:= CURDEPTH - 1; 0046 + + END; 0047 + + 12 IS 52 LONG, NEXT SEG 2 + + 0037 + + PROCEDURE INITIALIZE; 0037 + + %--------------------- 0037 + + % FILL THE COUNT AND OTHERS ARRAYS 0037 + + BEGIN 0037 + + DEFINE FO(I) = FILL OTHERSARY[I, *] WITH #; % MAKE IT EASIER TO WRITE ! 0037 + + START OF SEGMENT ********** 13 + + INTEGER CNT; 0000 + + 0000 + + % PREFILLED COUNT ARRAY: PT= 0.833 IO= 9.267 ET= 3.483 0000 + + % CALCULATED COUNT ARRAY: PT= 1.150 IO= 8.850 ET= 3.517 0000 + + FOR CNT:= 0 STEP 1 UNTIL 511 DO 0000 + + COUNT[CNT]:= ONES32(CNT); 0001 + + 0005 + + % BE NICE TO REDUCE PBITTING SOMEHOW, AND MAYBE MAKE FASTER ACCESS, 0005 + + % WHICH IS BETTER INDEXED DESCRIPTOR OR MULTIPLY TO DETERMINE VALUE? 0005 + + % CURRENT IMPLEMENTATION SLOWS THE COMPILER AS WELL! 0005 + + % AS FILL CAN ONLY DO 1024 NUMBERS, CANNOT USE SINGLE DIMENSION ARRAY 0005 + + % 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0005 + + FO( 0) 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,27,36,45,54,63,72; % 0 0005 + + START OF SEGMENT ********** 14 + + 14 IS 20 LONG, NEXT SEG 13 + + FO( 1) 0, 2, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,28,37,46,55,64,73; % 1 0007 + + START OF SEGMENT ********** 15 + + 15 IS 20 LONG, NEXT SEG 13 + + FO( 2) 0, 1, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,29,38,47,56,65,74; % 2 0009 + + START OF SEGMENT ********** 16 + + 16 IS 20 LONG, NEXT SEG 13 + + FO( 3) 0, 1, 2, 4, 5, 6, 7, 8,12,13,14,21,22,23,30,39,48,57,66,75; % 3 0011 + + START OF SEGMENT ********** 17 + + 17 IS 20 LONG, NEXT SEG 13 + + FO( 4) 0, 1, 2, 3, 5, 6, 7, 8,12,13,14,21,22,23,31,40,49,58,67,76; % 4 0013 + + START OF SEGMENT ********** 18 + + 18 IS 20 LONG, NEXT SEG 13 + + FO( 5) 0, 1, 2, 3, 4, 6, 7, 8,12,13,14,21,22,23,32,41,50,59,68,77; % 5 0015 + + START OF SEGMENT ********** 19 + + 19 IS 20 LONG, NEXT SEG 13 + + FO( 6) 0, 1, 2, 3, 4, 5, 7, 8,15,16,17,24,25,26,33,42,51,60,69,78; % 6 0017 + + START OF SEGMENT ********** 20 + + 20 IS 20 LONG, NEXT SEG 13 + + FO( 7) 0, 1, 2, 3, 4, 5, 6, 8,15,16,17,24,25,26,34,43,52,61,70,79; % 7 0019 + + START OF SEGMENT ********** 21 + + 21 IS 20 LONG, NEXT SEG 13 + + FO( 8) 0, 1, 2, 3, 4, 5, 6, 7,15,16,17,24,25,26,35,44,53,62,71,80; % 8 0021 + + START OF SEGMENT ********** 22 + + 22 IS 20 LONG, NEXT SEG 13 + + FO( 9) 0, 1, 2,10,11,12,13,14,15,16,17,18,19,20,27,36,45,54,63,72; % 9 0023 + + START OF SEGMENT ********** 23 + + 23 IS 20 LONG, NEXT SEG 13 + + FO(10) 0, 1, 2, 9,11,12,13,14,15,16,17,18,19,20,28,37,46,55,64,73; % 10 0025 + + START OF SEGMENT ********** 24 + + 24 IS 20 LONG, NEXT SEG 13 + + FO(11) 0, 1, 2, 9,10,12,13,14,15,16,17,18,19,20,29,38,47,56,65,74; % 11 0027 + + START OF SEGMENT ********** 25 + + 25 IS 20 LONG, NEXT SEG 13 + + FO(12) 3, 4, 5, 9,10,11,13,14,15,16,17,21,22,23,30,39,48,57,66,75; % 12 0029 + + START OF SEGMENT ********** 26 + + 26 IS 20 LONG, NEXT SEG 13 + + FO(13) 3, 4, 5, 9,10,11,12,14,15,16,17,21,22,23,31,40,49,58,67,76; % 13 0031 + + START OF SEGMENT ********** 27 + + 27 IS 20 LONG, NEXT SEG 13 + + FO(14) 3, 4, 5, 9,10,11,12,13,15,16,17,21,22,23,32,41,50,59,68,77; % 14 0033 + + START OF SEGMENT ********** 28 + + 28 IS 20 LONG, NEXT SEG 13 + + FO(15) 6, 7, 8, 9,10,11,12,13,14,16,17,24,25,26,33,42,51,60,69,78; % 15 0035 + + START OF SEGMENT ********** 29 + + 29 IS 20 LONG, NEXT SEG 13 + + FO(16) 6, 7, 8, 9,10,11,12,13,14,15,17,24,25,26,34,43,52,61,70,79; % 16 0037 + + START OF SEGMENT ********** 30 + + 30 IS 20 LONG, NEXT SEG 13 + + FO(17) 6, 7, 8, 9,10,11,12,13,14,15,16,24,25,26,35,44,53,62,71,80; % 17 0039 + + START OF SEGMENT ********** 31 + + 31 IS 20 LONG, NEXT SEG 13 + + FO(18) 0, 1, 2, 9,10,11,19,20,21,22,23,24,25,26,27,36,45,54,63,72; % 18 0041 + + START OF SEGMENT ********** 32 + + 32 IS 20 LONG, NEXT SEG 13 + + FO(19) 0, 1, 2, 9,10,11,18,20,21,22,23,24,25,26,28,37,46,55,64,73; % 19 0043 + + START OF SEGMENT ********** 33 + + 33 IS 20 LONG, NEXT SEG 13 + + FO(20) 0, 1, 2, 9,10,11,18,19,21,22,23,24,25,26,29,38,47,56,65,74; % 20 0045 + + START OF SEGMENT ********** 34 + + 34 IS 20 LONG, NEXT SEG 13 + + FO(21) 3, 4, 5,12,13,14,18,19,20,22,23,24,25,26,30,39,48,57,66,75; % 21 0047 + + START OF SEGMENT ********** 35 + + 35 IS 20 LONG, NEXT SEG 13 + + FO(22) 3, 4, 5,12,13,14,18,19,20,21,23,24,25,26,31,40,49,58,67,76; % 22 0049 + + START OF SEGMENT ********** 36 + + 36 IS 20 LONG, NEXT SEG 13 + + FO(23) 3, 4, 5,12,13,14,18,19,20,21,22,24,25,26,32,41,50,59,68,77; % 23 0051 + + START OF SEGMENT ********** 37 + + 37 IS 20 LONG, NEXT SEG 13 + + FO(24) 6, 7, 8,15,16,17,18,19,20,21,22,23,25,26,33,42,51,60,69,78; % 24 0053 + + START OF SEGMENT ********** 38 + + 38 IS 20 LONG, NEXT SEG 13 + + FO(25) 6, 7, 8,15,16,17,18,19,20,21,22,23,24,26,34,43,52,61,70,79; % 25 0055 + + START OF SEGMENT ********** 39 + + 39 IS 20 LONG, NEXT SEG 13 + + FO(26) 6, 7, 8,15,16,17,18,19,20,21,22,23,24,25,35,44,53,62,71,80; % 26 0057 + + START OF SEGMENT ********** 40 + + 40 IS 20 LONG, NEXT SEG 13 + + FO(27) 0, 9,18,28,29,30,31,32,33,34,35,36,37,38,45,46,47,54,63,72; % 27 0059 + + START OF SEGMENT ********** 41 + + 41 IS 20 LONG, NEXT SEG 13 + + FO(28) 1,10,19,27,29,30,31,32,33,34,35,36,37,38,45,46,47,55,64,73; % 28 0061 + + START OF SEGMENT ********** 42 + + 42 IS 20 LONG, NEXT SEG 13 + + FO(29) 2,11,20,27,28,30,31,32,33,34,35,36,37,38,45,46,47,56,65,74; % 29 0063 + + START OF SEGMENT ********** 43 + + 43 IS 20 LONG, NEXT SEG 13 + + FO(30) 3,12,21,27,28,29,31,32,33,34,35,39,40,41,48,49,50,57,66,75; % 30 0065 + + START OF SEGMENT ********** 44 + + 44 IS 20 LONG, NEXT SEG 13 + + FO(31) 4,13,22,27,28,29,30,32,33,34,35,39,40,41,48,49,50,58,67,76; % 31 0067 + + START OF SEGMENT ********** 45 + + 45 IS 20 LONG, NEXT SEG 13 + + FO(32) 5,14,23,27,28,29,30,31,33,34,35,39,40,41,48,49,50,59,68,77; % 32 0069 + + START OF SEGMENT ********** 46 + + 46 IS 20 LONG, NEXT SEG 13 + + FO(33) 6,15,24,27,28,29,30,31,32,34,35,42,43,44,51,52,53,60,69,78; % 33 0071 + + START OF SEGMENT ********** 47 + + 47 IS 20 LONG, NEXT SEG 13 + + FO(34) 7,16,25,27,28,29,30,31,32,33,35,42,43,44,51,52,53,61,70,79; % 34 0073 + + START OF SEGMENT ********** 48 + + 48 IS 20 LONG, NEXT SEG 13 + + FO(35) 8,17,26,27,28,29,30,31,32,33,34,42,43,44,51,52,53,62,71,80; % 35 0075 + + START OF SEGMENT ********** 49 + + 49 IS 20 LONG, NEXT SEG 13 + + FO(36) 0, 9,18,27,28,29,37,38,39,40,41,42,43,44,45,46,47,54,63,72; % 36 0077 + + START OF SEGMENT ********** 50 + + 50 IS 20 LONG, NEXT SEG 13 + + FO(37) 1,10,19,27,28,29,36,38,39,40,41,42,43,44,45,46,47,55,64,73; % 37 0079 + + START OF SEGMENT ********** 51 + + 51 IS 20 LONG, NEXT SEG 13 + + FO(38) 2,11,20,27,28,29,36,37,39,40,41,42,43,44,45,46,47,56,65,74; % 38 0081 + + START OF SEGMENT ********** 52 + + 52 IS 20 LONG, NEXT SEG 13 + + FO(39) 3,12,21,30,31,32,36,37,38,40,41,42,43,44,48,49,50,57,66,75; % 39 0083 + + START OF SEGMENT ********** 53 + + 53 IS 20 LONG, NEXT SEG 13 + + FO(40) 4,13,22,30,31,32,36,37,38,39,41,42,43,44,48,49,50,58,67,76; % 40 0085 + + START OF SEGMENT ********** 54 + + 54 IS 20 LONG, NEXT SEG 13 + + FO(41) 5,14,23,30,31,32,36,37,38,39,40,42,43,44,48,49,50,59,68,77; % 41 0087 + + START OF SEGMENT ********** 55 + + 55 IS 20 LONG, NEXT SEG 13 + + FO(42) 6,15,24,33,34,35,36,37,38,39,40,41,43,44,51,52,53,60,69,78; % 42 0089 + + START OF SEGMENT ********** 56 + + 56 IS 20 LONG, NEXT SEG 13 + + FO(43) 7,16,25,33,34,35,36,37,38,39,40,41,42,44,51,52,53,61,70,79; % 43 0091 + + START OF SEGMENT ********** 57 + + 57 IS 20 LONG, NEXT SEG 13 + + FO(44) 8,17,26,33,34,35,36,37,38,39,40,41,42,43,51,52,53,62,71,80; % 44 0093 + + START OF SEGMENT ********** 58 + + 58 IS 20 LONG, NEXT SEG 13 + + FO(45) 0, 9,18,27,28,29,36,37,38,46,47,48,49,50,51,52,53,54,63,72; % 45 0095 + + START OF SEGMENT ********** 59 + + 59 IS 20 LONG, NEXT SEG 13 + + FO(46) 1,10,19,27,28,29,36,37,38,45,47,48,49,50,51,52,53,55,64,73; % 46 0097 + + START OF SEGMENT ********** 60 + + 60 IS 20 LONG, NEXT SEG 13 + + FO(47) 2,11,20,27,28,29,36,37,38,45,46,48,49,50,51,52,53,56,65,74; % 47 0099 + + START OF SEGMENT ********** 61 + + 61 IS 20 LONG, NEXT SEG 13 + + FO(48) 3,12,21,30,31,32,39,40,41,45,46,47,49,50,51,52,53,57,66,75; % 48 0101 + + START OF SEGMENT ********** 62 + + 62 IS 20 LONG, NEXT SEG 13 + + FO(49) 4,13,22,30,31,32,39,40,41,45,46,47,48,50,51,52,53,58,67,76; % 49 0103 + + START OF SEGMENT ********** 63 + + 63 IS 20 LONG, NEXT SEG 13 + + FO(50) 5,14,23,30,31,32,39,40,41,45,46,47,48,49,51,52,53,59,68,77; % 50 0105 + + START OF SEGMENT ********** 64 + + 64 IS 20 LONG, NEXT SEG 13 + + FO(51) 6,15,24,33,34,35,42,43,44,45,46,47,48,49,50,52,53,60,69,78; % 51 0107 + + START OF SEGMENT ********** 65 + + 65 IS 20 LONG, NEXT SEG 13 + + FO(52) 7,16,25,33,34,35,42,43,44,45,46,47,48,49,50,51,53,61,70,79; % 52 0109 + + START OF SEGMENT ********** 66 + + 66 IS 20 LONG, NEXT SEG 13 + + FO(53) 8,17,26,33,34,35,42,43,44,45,46,47,48,49,50,51,52,62,71,80; % 53 0111 + + START OF SEGMENT ********** 67 + + 67 IS 20 LONG, NEXT SEG 13 + + FO(54) 0, 9,18,27,36,45,55,56,57,58,59,60,61,62,63,64,65,72,73,74; % 54 0113 + + START OF SEGMENT ********** 68 + + 68 IS 20 LONG, NEXT SEG 13 + + FO(55) 1,10,19,28,37,46,54,56,57,58,59,60,61,62,63,64,65,72,73,74; % 55 0115 + + START OF SEGMENT ********** 69 + + 69 IS 20 LONG, NEXT SEG 13 + + FO(56) 2,11,20,29,38,47,54,55,57,58,59,60,61,62,63,64,65,72,73,74; % 56 0117 + + START OF SEGMENT ********** 70 + + 70 IS 20 LONG, NEXT SEG 13 + + FO(57) 3,12,21,30,39,48,54,55,56,58,59,60,61,62,66,67,68,75,76,77; % 57 0119 + + START OF SEGMENT ********** 71 + + 71 IS 20 LONG, NEXT SEG 13 + + FO(58) 4,13,22,31,40,49,54,55,56,57,59,60,61,62,66,67,68,75,76,77; % 58 0121 + + START OF SEGMENT ********** 72 + + 72 IS 20 LONG, NEXT SEG 13 + + FO(59) 5,14,23,32,41,50,54,55,56,57,58,60,61,62,66,67,68,75,76,77; % 59 0123 + + START OF SEGMENT ********** 73 + + 73 IS 20 LONG, NEXT SEG 13 + + FO(60) 6,15,24,33,42,51,54,55,56,57,58,59,61,62,69,70,71,78,79,80; % 60 0125 + + START OF SEGMENT ********** 74 + + 74 IS 20 LONG, NEXT SEG 13 + + FO(61) 7,16,25,34,43,52,54,55,56,57,58,59,60,62,69,70,71,78,79,80; % 61 0127 + + START OF SEGMENT ********** 75 + + 75 IS 20 LONG, NEXT SEG 13 + + FO(62) 8,17,26,35,44,53,54,55,56,57,58,59,60,61,69,70,71,78,79,80; % 62 0129 + + START OF SEGMENT ********** 76 + + 76 IS 20 LONG, NEXT SEG 13 + + FO(63) 0, 9,18,27,36,45,54,55,56,64,65,66,67,68,69,70,71,72,73,74; % 63 0131 + + START OF SEGMENT ********** 77 + + 77 IS 20 LONG, NEXT SEG 13 + + FO(64) 1,10,19,28,37,46,54,55,56,63,65,66,67,68,69,70,71,72,73,74; % 64 0133 + + START OF SEGMENT ********** 78 + + 78 IS 20 LONG, NEXT SEG 13 + + FO(65) 2,11,20,29,38,47,54,55,56,63,64,66,67,68,69,70,71,72,73,74; % 65 0135 + + START OF SEGMENT ********** 79 + + 79 IS 20 LONG, NEXT SEG 13 + + FO(66) 3,12,21,30,39,48,57,58,59,63,64,65,67,68,69,70,71,75,76,77; % 66 0137 + + START OF SEGMENT ********** 80 + + 80 IS 20 LONG, NEXT SEG 13 + + FO(67) 4,13,22,31,40,49,57,58,59,63,64,65,66,68,69,70,71,75,76,77; % 67 0139 + + START OF SEGMENT ********** 81 + + 81 IS 20 LONG, NEXT SEG 13 + + FO(68) 5,14,23,32,41,50,57,58,59,63,64,65,66,67,69,70,71,75,76,77; % 68 0141 + + START OF SEGMENT ********** 82 + + 82 IS 20 LONG, NEXT SEG 13 + + FO(69) 6,15,24,33,42,51,60,61,62,63,64,65,66,67,68,70,71,78,79,80; % 69 0143 + + START OF SEGMENT ********** 83 + + 83 IS 20 LONG, NEXT SEG 13 + + FO(70) 7,16,25,34,43,52,60,61,62,63,64,65,66,67,68,69,71,78,79,80; % 70 0145 + + START OF SEGMENT ********** 84 + + 84 IS 20 LONG, NEXT SEG 13 + + FO(71) 8,17,26,35,44,53,60,61,62,63,64,65,66,67,68,69,70,78,79,80; % 71 0147 + + START OF SEGMENT ********** 85 + + 85 IS 20 LONG, NEXT SEG 13 + + FO(72) 0, 9,18,27,36,45,54,55,56,63,64,65,73,74,75,76,77,78,79,80; % 72 0149 + + START OF SEGMENT ********** 86 + + 86 IS 20 LONG, NEXT SEG 13 + + FO(73) 1,10,19,28,37,46,54,55,56,63,64,65,72,74,75,76,77,78,79,80; % 73 0151 + + START OF SEGMENT ********** 87 + + 87 IS 20 LONG, NEXT SEG 13 + + FO(74) 2,11,20,29,38,47,54,55,56,63,64,65,72,73,75,76,77,78,79,80; % 74 0153 + + START OF SEGMENT ********** 88 + + 88 IS 20 LONG, NEXT SEG 13 + + FO(75) 3,12,21,30,39,48,57,58,59,66,67,68,72,73,74,76,77,78,79,80; % 75 0155 + + START OF SEGMENT ********** 89 + + 89 IS 20 LONG, NEXT SEG 13 + + FO(76) 4,13,22,31,40,49,57,58,59,66,67,68,72,73,74,75,77,78,79,80; % 76 0157 + + START OF SEGMENT ********** 90 + + 90 IS 20 LONG, NEXT SEG 13 + + FO(77) 5,14,23,32,41,50,57,58,59,66,67,68,72,73,74,75,76,78,79,80; % 77 0159 + + START OF SEGMENT ********** 91 + + 91 IS 20 LONG, NEXT SEG 13 + + FO(78) 6,15,24,33,42,51,60,61,62,69,70,71,72,73,74,75,76,77,79,80; % 78 0161 + + START OF SEGMENT ********** 92 + + 92 IS 20 LONG, NEXT SEG 13 + + FO(79) 7,16,25,34,43,52,60,61,62,69,70,71,72,73,74,75,76,77,78,80; % 79 0163 + + START OF SEGMENT ********** 93 + + 93 IS 20 LONG, NEXT SEG 13 + + FO(80) 8,17,26,35,44,53,60,61,62,69,70,71,72,73,74,75,76,77,78,79; % 80 0165 + + START OF SEGMENT ********** 94 + + 94 IS 20 LONG, NEXT SEG 13 + + 0167 + + FILL BITNO[*] WITH 0, 1, 2, 4, % NOTE ZERO BASED!!! 0167 + + START OF SEGMENT ********** 95 + + 8, 16, 32, 64, 0168 + + 128, 256, 512, 1024; 0168 + + 95 IS 12 LONG, NEXT SEG 13 + + 0168 + + WRITE(LINE, <"INITIALIZATION TIME: ", 0168 + + "PT=",F8.3," IO=",F8.3," ET=", F10.3>, 0170 + + 96 IS 13 LONG, NEXT SEG 13 + + TIME(2)/60, TIME(3)/60, (TIME(1)-STARTET)/60); 0171 + + END; 0185 + + 13 IS 188 LONG, NEXT SEG 2 + + 0037 + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0037 + + % SOME TESTED DATA VALUES, 0037 + + %071698035 0037 + + %600030700 0037 + + %090400100 0037 + + %000009002 0037 + + %300000009 0037 + + %500200000 0037 + + %004006070 0037 + + %006080001 0037 + + %820314950 0037 + + 0037 + + %000000008 0037 + + %010000040 0037 + + %000645910 0037 + + %591300000 0037 + + %062401790 0037 + + %000008165 0037 + + %024173000 0037 + + %080000020 0037 + + %900000000 0037 + + 0037 + + %000000000 - 272 SOLUTIONS 0037 + + %010000040 0037 + + %000605910 0037 + + %591300000 0037 + + %062401790 0037 + + %000008105 0037 + + %024173000 0037 + + %080000020 0037 + + %000000000 0037 + + 0037 + + %600900050 - VERY HARD - PT = 30SEC+ 0037 + + %009000003 0037 + + %050040007 0037 + + %013502790 0037 + + %000000000 0037 + + %092603540 0037 + + %900050020 0037 + + %100000600 0037 + + %020004005 0037 + + 0037 + + %000000008 - 12 SOLUTIONS 0037 + + %010000040 0037 + + %000645910 0037 + + %591300000 0037 + + %000000007 0037 + + %000008165 0037 + + %024173000 0037 + + %080000020 0037 + + %900000000 0037 + + 0037 + + %000000008 - 118 SOLUTIONS 0037 + + %010000040 0037 + + %000645910 0037 + + %591300000 0037 + + %000000000 0037 + + %000008165 0037 + + %024173000 0037 + + %080000020 0037 + + %900000000 0037 + + 0037 + + STARTET:= TIME(1); 0037 + + 0039 + + INITIALIZE; 0039 + + READGRID; 0039 + + 0040 + + SELECTBOX; 0040 + + 0040 + + % WARN THE OPERATOR 0040 + + IF NUM > 1 THEN 0040 + + WRITE(SPO, <"FOUND ", I5, " SOLUTIONS">, NUM); 0041 + + 97 IS 7 LONG, NEXT SEG 2 + + 0049 + + WRITE(LINE, <" ">); 0049 + + 98 IS 4 LONG, NEXT SEG 2 + + WRITE(LINE, !1, 3"002" => !2, 3"004" => !3, + % 3"010" => !4, ... 3"400" => !9. + COUNT [0:511], % BIT COUNT FOR EACH NUMBER + OTHERSARY [0:80, 0:19]; + DEFINE OTHERS(X,Y) = + OTHERSARY[X,Y] #; % MAKE IT EASIER TO OPTIMISE LATER + % FOR EACH SQUARE, AN ARRAY OF 20 "OTHER" + % LOCATIONS AFFECT BY THIS SQUARE. FOR + % EXAMPLE, IF THERE IS A "6" IN SQUARE 0, + % THERE ARE 20 OTHER SQUARES WE KNOW + % CANT CONTAIN A SIX: + % 1,2,3,4,5,6,7,8 (HORIZONTAL ROW) + % 9,18,27,36,45,54,63,72 (VERTCAL COLUMN) + % 1,2,9,10,11,18,19,20 (3X3 SQUARE) + % THATS A TOTAL OF 24 SQUARE NUMBERS, + % BUT 4 OF THEM ARE DUPLICATES. THE + % "OTHERS" ARRAY IS BIG ENOUGH TO HOLD + % 24 NUMBERS WHILE IT IS BEING BUILT, BUT + % WILL ONLY 20 NUMBERS WILL BE USED WHEN + % IT IS COMPLETE. + +FILE CARD (2,10,150); +FILE SPO 11 (1,10); +FILE LINE 15 (1,15); % 15, 17 IS PRINTER BACKUP DISK + +INTEGER STREAM PROCEDURE ONES32(I); +%--------------------------- +VALUE I; +BEGIN + SI:= LOC I; + SI:= SI+2; + SKIP 4 SB; + 32(IF SB THEN TALLY:= TALLY+1; SKIP SB); + ONES32:= TALLY; +END; + +PROCEDURE SETBOX(N, X, BIT); +%--------------------------- +VALUE N, X, BIT; INTEGER N, X, BIT; +% "SETBOX" IS USED TO PLACE A NUMBER IN THE GRID, WHETHER IT IS KNOWN, +% OR A GUESS. IT ALSO UPDATES ALL THE BITMASKS FOR ALL THE ASSOCIATED +% SQUARES TO INDICATE THAT THEY CANT CONTAIN THIS NUMBER. +BEGIN + INTEGER I; + + GRID[N]:= X; + FOR I:= 0 STEP 1 UNTIL 19 DO + BITS[OTHERS(N,I)]:= REAL(BOOLEAN(BITS[OTHERS(N,I)]) OR + BOOLEAN(BIT)); +END; + +PROCEDURE READGRID; +%------------------ +% READ IN INITIAL DATA +% THE INITIAL BITMASK IS CALCULATED AT THE SAME TIME BY CALLING SETBOX +BEGIN + INTEGER I, J; + ALPHA ARRAY AIN[0:2]; + POINTER P; + + FOR I:= 0 STEP 1 UNTIL 8 DO % 9 ROWS OF 9 NUMBERS + BEGIN + READ(CARD, 3, AIN[*]); + P:= POINTER(AIN[0]); + FOR J:= 0 STEP 1 UNTIL 8 DO + BEGIN + SETBOX(9 | I + J, INTEGER(P,1), + BITNO[INTEGER(P,1)]); % SET BITNO, LSB=BIT0 + P:= P + 1; + END; + END; + + %WRITE OUT WHAT WE GOT! + WRITE(LINE, <"WE STORED IN GRID:">); + FOR I:= 0 STEP 1 UNTIL 8 DO + WRITE(LINE, <9I1>, FOR J:= 0 STEP 1 UNTIL 8 DO GRID[9|I+J]); + + %CHECK FOR CONSISTENCY + FOR I:= 0 STEP 1 UNTIL 80 DO + IF GRID[I] > 0 THEN + IF REAL(BOOLEAN(BITS[I]) AND BOOLEAN(BITNO[GRID[I]])) > 0 THEN + BEGIN + WRITE(LINE, <"INCONSISTENT DATA IN ",I1,",",I1>, + (I DIV 9)+1, (I MOD 9) + 1); + J:= 1/0; + END; +END; + +PROCEDURE PRINTSOLUTION; +%----------------------- +BEGIN + INTEGER I, J; + + NUM:= NUM + 1; + IF NUM > 1 THEN + WRITE(LINE, <" ">); % BLANK + + WRITE(LINE,<"SOLUTION ",I3,":">, NUM); + FOR I:= 0 STEP 1 UNTIL 8 DO + WRITE(LINE, <9I1>, FOR J:= 0 STEP 1 UNTIL 8 DO GRID[9|I+J]); + +END; + +PROCEDURE SELECTBOX; +%------------------- +% "SELECTBOX" IS THE HEART OF THE ALGORITHM. IT WORKS THIS WAY: +% FIRST, THE GRID IS SEARCHED FOR AN EMPTY SQUARE. IF THERE ISNT ONE, +% THEN THE GRID CONTAINS A SOLUTION, SO IT IS PRINTED. IF AN EMPTY +% SQUARE IS FOUND, THEN IT IS COMPARED WITH ALL OTHER EMPTY SQUARES TO +% SEE WHICH ONE OF THEM HAS THE MAXIMUM NUMBER OF 1-BITS IN ITS BITMASK. +% THAT SQUARE IS THE ONE SELECTED, AND EACH OF THE POSSIBLE VALUES ARE +% TRIED IN RETURN, CALLING "SELECTBOX" RECURSIVELY TO SEARCH FOR A +% SOLUTION. NOTE THAT IF A SQUARE HAS 9 1-BITS IN ITS BITMASK, THEN +% THERE ARE NO POSSIBLE VALUES, AND "SELECTBOX" WILL RETURN WITHOUT ANY +% FURTHER RECURSION. OTHERWISE, IF A SQUARE HAS 8 1-BITS IN ITS BITMASK, +% THEN IT HAS A FORCED CHOICE, AND ONLY THAT CHOICE WILL BE TAKEN AT THIS +% LEVEL IN THE RECURSION. +BEGIN + INTEGER ARRAY + BITSAVE[0:80]; % SAVED ON EVERY RECURSION, MAX DEPTH 81|81 = 4131 WORDS? + INTEGER + I, + J, + BEST, + BESTCOUNT; + BOOLEAN + FINISHED; + LABEL XIT; + + CURDEPTH:= CURDEPTH + 1; + MAXDEPTH:= MAX(MAXDEPTH, CURDEPTH); + +% IF NUM = 0 THEN % RECURSE ONLY IF NO SOLUTIONS SO FAR + BEGIN + % FIND EMPTY SQUARE + BEST:= 0; + WHILE NOT FINISHED DO % PREFER TO HAVE CONDITIONAL AND :) + IF NOT FINISHED:= GRID[BEST] = 0 THEN + FINISHED:= (BEST:= BEST + 1) GTR 80; + + IF BEST = 81 THEN % 81 INDICATES NO EMPTY SQUARES + BEGIN + PRINTSOLUTION; + GO TO XIT; + END; + + BESTCOUNT:= COUNT[BITS[BEST]]; % BITS IN THE SQUARE WE FOUND + FOR I:= BEST+1 STEP 1 WHILE I LSS 81 DO + BEGIN % FIND THE BIGGEST COUNT OVER ALL SQUARES + IF GRID[I] = 0 THEN % ONLY CONSIDER EMPTY SQUARES + BEGIN + J:= COUNT[BITS[I]]; + IF J > BESTCOUNT THEN + BEGIN + BEST:= I; + BESTCOUNT:= J; + END; + END; + END; + + % TRY ALL NUMBERS FOR THIS SQUARE + FOR I:= 1 STEP 1 WHILE I LEQ 9 DO + BEGIN + IF REAL(BOOLEAN(BITS[BEST]) AND BOOLEAN(BITNO[I])) = 0 THEN + BEGIN % IF THE NUMBER IS POSSIBLE, RECURSE + % SAVE STATE ON STACK + REPLACE POINTER(BITSAVE) BY POINTER(BITS) FOR 81 WORDS; + SETBOX(BEST, I, BITNO[I]); % SET NUMBER AND FIX BITMASK + SELECTBOX; % RECURSE + GRID[BEST]:= 0; % UNPLACE NUMBER IN SQUARE + % RESTORE + REPLACE POINTER(BITS) BY POINTER(BITSAVE) FOR 81 WORDS; + END; + END; + END; + +XIT: + CURDEPTH:= CURDEPTH - 1; +END; + +PROCEDURE INITIALIZE; +%--------------------- +% FILL THE COUNT AND OTHERS ARRAYS +BEGIN + DEFINE FO(I) = FILL OTHERSARY[I, *] WITH #; % MAKE IT EASIER TO WRITE! + INTEGER CNT; + + % PREFILLED COUNT ARRAY: PT= 0.833 IO= 9.267 ET= 3.483 + % CALCULATED COUNT ARRAY: PT= 1.150 IO= 8.850 ET= 3.517 + FOR CNT:= 0 STEP 1 UNTIL 511 DO + COUNT[CNT]:= ONES32(CNT); + + % BE NICE TO REDUCE PBITTING SOMEHOW, AND MAYBE MAKE FASTER ACCESS, + % WHICH IS BETTER INDEXED DESCRIPTOR OR MULTIPLY TO DETERMINE VALUE? + % CURRENT IMPLEMENTATION SLOWS THE COMPILER AS WELL! + % AS FILL CAN ONLY DO 1024 NUMBERS, CANNOT USE SINGLE DIMENSION ARRAY + % 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 +FO( 0) 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,27,36,45,54,63,72; % 0 +FO( 1) 0, 2, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,28,37,46,55,64,73; % 1 +FO( 2) 0, 1, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,29,38,47,56,65,74; % 2 +FO( 3) 0, 1, 2, 4, 5, 6, 7, 8,12,13,14,21,22,23,30,39,48,57,66,75; % 3 +FO( 4) 0, 1, 2, 3, 5, 6, 7, 8,12,13,14,21,22,23,31,40,49,58,67,76; % 4 +FO( 5) 0, 1, 2, 3, 4, 6, 7, 8,12,13,14,21,22,23,32,41,50,59,68,77; % 5 +FO( 6) 0, 1, 2, 3, 4, 5, 7, 8,15,16,17,24,25,26,33,42,51,60,69,78; % 6 +FO( 7) 0, 1, 2, 3, 4, 5, 6, 8,15,16,17,24,25,26,34,43,52,61,70,79; % 7 +FO( 8) 0, 1, 2, 3, 4, 5, 6, 7,15,16,17,24,25,26,35,44,53,62,71,80; % 8 +FO( 9) 0, 1, 2,10,11,12,13,14,15,16,17,18,19,20,27,36,45,54,63,72; % 9 +FO(10) 0, 1, 2, 9,11,12,13,14,15,16,17,18,19,20,28,37,46,55,64,73; % 10 +FO(11) 0, 1, 2, 9,10,12,13,14,15,16,17,18,19,20,29,38,47,56,65,74; % 11 +FO(12) 3, 4, 5, 9,10,11,13,14,15,16,17,21,22,23,30,39,48,57,66,75; % 12 +FO(13) 3, 4, 5, 9,10,11,12,14,15,16,17,21,22,23,31,40,49,58,67,76; % 13 +FO(14) 3, 4, 5, 9,10,11,12,13,15,16,17,21,22,23,32,41,50,59,68,77; % 14 +FO(15) 6, 7, 8, 9,10,11,12,13,14,16,17,24,25,26,33,42,51,60,69,78; % 15 +FO(16) 6, 7, 8, 9,10,11,12,13,14,15,17,24,25,26,34,43,52,61,70,79; % 16 +FO(17) 6, 7, 8, 9,10,11,12,13,14,15,16,24,25,26,35,44,53,62,71,80; % 17 +FO(18) 0, 1, 2, 9,10,11,19,20,21,22,23,24,25,26,27,36,45,54,63,72; % 18 +FO(19) 0, 1, 2, 9,10,11,18,20,21,22,23,24,25,26,28,37,46,55,64,73; % 19 +FO(20) 0, 1, 2, 9,10,11,18,19,21,22,23,24,25,26,29,38,47,56,65,74; % 20 +FO(21) 3, 4, 5,12,13,14,18,19,20,22,23,24,25,26,30,39,48,57,66,75; % 21 +FO(22) 3, 4, 5,12,13,14,18,19,20,21,23,24,25,26,31,40,49,58,67,76; % 22 +FO(23) 3, 4, 5,12,13,14,18,19,20,21,22,24,25,26,32,41,50,59,68,77; % 23 +FO(24) 6, 7, 8,15,16,17,18,19,20,21,22,23,25,26,33,42,51,60,69,78; % 24 +FO(25) 6, 7, 8,15,16,17,18,19,20,21,22,23,24,26,34,43,52,61,70,79; % 25 +FO(26) 6, 7, 8,15,16,17,18,19,20,21,22,23,24,25,35,44,53,62,71,80; % 26 +FO(27) 0, 9,18,28,29,30,31,32,33,34,35,36,37,38,45,46,47,54,63,72; % 27 +FO(28) 1,10,19,27,29,30,31,32,33,34,35,36,37,38,45,46,47,55,64,73; % 28 +FO(29) 2,11,20,27,28,30,31,32,33,34,35,36,37,38,45,46,47,56,65,74; % 29 +FO(30) 3,12,21,27,28,29,31,32,33,34,35,39,40,41,48,49,50,57,66,75; % 30 +FO(31) 4,13,22,27,28,29,30,32,33,34,35,39,40,41,48,49,50,58,67,76; % 31 +FO(32) 5,14,23,27,28,29,30,31,33,34,35,39,40,41,48,49,50,59,68,77; % 32 +FO(33) 6,15,24,27,28,29,30,31,32,34,35,42,43,44,51,52,53,60,69,78; % 33 +FO(34) 7,16,25,27,28,29,30,31,32,33,35,42,43,44,51,52,53,61,70,79; % 34 +FO(35) 8,17,26,27,28,29,30,31,32,33,34,42,43,44,51,52,53,62,71,80; % 35 +FO(36) 0, 9,18,27,28,29,37,38,39,40,41,42,43,44,45,46,47,54,63,72; % 36 +FO(37) 1,10,19,27,28,29,36,38,39,40,41,42,43,44,45,46,47,55,64,73; % 37 +FO(38) 2,11,20,27,28,29,36,37,39,40,41,42,43,44,45,46,47,56,65,74; % 38 +FO(39) 3,12,21,30,31,32,36,37,38,40,41,42,43,44,48,49,50,57,66,75; % 39 +FO(40) 4,13,22,30,31,32,36,37,38,39,41,42,43,44,48,49,50,58,67,76; % 40 +FO(41) 5,14,23,30,31,32,36,37,38,39,40,42,43,44,48,49,50,59,68,77; % 41 +FO(42) 6,15,24,33,34,35,36,37,38,39,40,41,43,44,51,52,53,60,69,78; % 42 +FO(43) 7,16,25,33,34,35,36,37,38,39,40,41,42,44,51,52,53,61,70,79; % 43 +FO(44) 8,17,26,33,34,35,36,37,38,39,40,41,42,43,51,52,53,62,71,80; % 44 +FO(45) 0, 9,18,27,28,29,36,37,38,46,47,48,49,50,51,52,53,54,63,72; % 45 +FO(46) 1,10,19,27,28,29,36,37,38,45,47,48,49,50,51,52,53,55,64,73; % 46 +FO(47) 2,11,20,27,28,29,36,37,38,45,46,48,49,50,51,52,53,56,65,74; % 47 +FO(48) 3,12,21,30,31,32,39,40,41,45,46,47,49,50,51,52,53,57,66,75; % 48 +FO(49) 4,13,22,30,31,32,39,40,41,45,46,47,48,50,51,52,53,58,67,76; % 49 +FO(50) 5,14,23,30,31,32,39,40,41,45,46,47,48,49,51,52,53,59,68,77; % 50 +FO(51) 6,15,24,33,34,35,42,43,44,45,46,47,48,49,50,52,53,60,69,78; % 51 +FO(52) 7,16,25,33,34,35,42,43,44,45,46,47,48,49,50,51,53,61,70,79; % 52 +FO(53) 8,17,26,33,34,35,42,43,44,45,46,47,48,49,50,51,52,62,71,80; % 53 +FO(54) 0, 9,18,27,36,45,55,56,57,58,59,60,61,62,63,64,65,72,73,74; % 54 +FO(55) 1,10,19,28,37,46,54,56,57,58,59,60,61,62,63,64,65,72,73,74; % 55 +FO(56) 2,11,20,29,38,47,54,55,57,58,59,60,61,62,63,64,65,72,73,74; % 56 +FO(57) 3,12,21,30,39,48,54,55,56,58,59,60,61,62,66,67,68,75,76,77; % 57 +FO(58) 4,13,22,31,40,49,54,55,56,57,59,60,61,62,66,67,68,75,76,77; % 58 +FO(59) 5,14,23,32,41,50,54,55,56,57,58,60,61,62,66,67,68,75,76,77; % 59 +FO(60) 6,15,24,33,42,51,54,55,56,57,58,59,61,62,69,70,71,78,79,80; % 60 +FO(61) 7,16,25,34,43,52,54,55,56,57,58,59,60,62,69,70,71,78,79,80; % 61 +FO(62) 8,17,26,35,44,53,54,55,56,57,58,59,60,61,69,70,71,78,79,80; % 62 +FO(63) 0, 9,18,27,36,45,54,55,56,64,65,66,67,68,69,70,71,72,73,74; % 63 +FO(64) 1,10,19,28,37,46,54,55,56,63,65,66,67,68,69,70,71,72,73,74; % 64 +FO(65) 2,11,20,29,38,47,54,55,56,63,64,66,67,68,69,70,71,72,73,74; % 65 +FO(66) 3,12,21,30,39,48,57,58,59,63,64,65,67,68,69,70,71,75,76,77; % 66 +FO(67) 4,13,22,31,40,49,57,58,59,63,64,65,66,68,69,70,71,75,76,77; % 67 +FO(68) 5,14,23,32,41,50,57,58,59,63,64,65,66,67,69,70,71,75,76,77; % 68 +FO(69) 6,15,24,33,42,51,60,61,62,63,64,65,66,67,68,70,71,78,79,80; % 69 +FO(70) 7,16,25,34,43,52,60,61,62,63,64,65,66,67,68,69,71,78,79,80; % 70 +FO(71) 8,17,26,35,44,53,60,61,62,63,64,65,66,67,68,69,70,78,79,80; % 71 +FO(72) 0, 9,18,27,36,45,54,55,56,63,64,65,73,74,75,76,77,78,79,80; % 72 +FO(73) 1,10,19,28,37,46,54,55,56,63,64,65,72,74,75,76,77,78,79,80; % 73 +FO(74) 2,11,20,29,38,47,54,55,56,63,64,65,72,73,75,76,77,78,79,80; % 74 +FO(75) 3,12,21,30,39,48,57,58,59,66,67,68,72,73,74,76,77,78,79,80; % 75 +FO(76) 4,13,22,31,40,49,57,58,59,66,67,68,72,73,74,75,77,78,79,80; % 76 +FO(77) 5,14,23,32,41,50,57,58,59,66,67,68,72,73,74,75,76,78,79,80; % 77 +FO(78) 6,15,24,33,42,51,60,61,62,69,70,71,72,73,74,75,76,77,79,80; % 78 +FO(79) 7,16,25,34,43,52,60,61,62,69,70,71,72,73,74,75,76,77,78,80; % 79 +FO(80) 8,17,26,35,44,53,60,61,62,69,70,71,72,73,74,75,76,77,78,79; % 80 + + FILL BITNO[*] WITH 0, 1, 2, 4, % NOTE ZERO BASED!!! + 8, 16, 32, 64, + 128, 256, 512, 1024; + + WRITE(LINE, <"INITIALIZATION TIME: ", + "PT=",F8.3," IO=",F8.3," ET=", F10.3>, + TIME(2)/60, TIME(3)/60, (TIME(1)-STARTET)/60); +END; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% SOME TESTED DATA VALUES, +%071698035 +%600030700 +%090400100 +%000009002 +%300000009 +%500200000 +%004006070 +%006080001 +%820314950 + +%000000008 +%010000040 +%000645910 +%591300000 +%062401790 +%000008165 +%024173000 +%080000020 +%900000000 + +%000000000 - 272 SOLUTIONS +%010000040 +%000605910 +%591300000 +%062401790 +%000008105 +%024173000 +%080000020 +%000000000 + +%600900050 - VERY HARD - PT = 30SEC+ +%009000003 +%050040007 +%013502790 +%000000000 +%092603540 +%900050020 +%100000600 +%020004005 + +%000000008 - 12 SOLUTIONS +%010000040 +%000645910 +%591300000 +%000000007 +%000008165 +%024173000 +%080000020 +%900000000 + +%000000008 - 118 SOLUTIONS +%010000040 +%000645910 +%591300000 +%000000000 +%000008165 +%024173000 +%080000020 +%900000000 + + STARTET:= TIME(1); + + INITIALIZE; + READGRID; + + SELECTBOX; + + % WARN THE OPERATOR + IF NUM > 1 THEN + WRITE(SPO, <"FOUND ", I5, " SOLUTIONS">, NUM); + + WRITE(LINE, <" ">); + WRITE(LINE, !1, 3"002" => !2, 3"004" => !3, + % 3"010" => !4, ... 3"400" => !9. + COUNT [0:511], % BIT COUNT FOR EACH NUMBER + OTHERSARY [0:80, 0:19]; + DEFINE OTHERS(X,Y) = + OTHERSARY[X,Y] #; % MAKE IT EASIER TO OPTIMISE LATER + % FOR EACH SQUARE, AN ARRAY OF 20 "OTHER" + % LOCATIONS AFFECT BY THIS SQUARE. FOR + % EXAMPLE, IF THERE IS A "6" IN SQUARE 0, + % THERE ARE 20 OTHER SQUARES WE KNOW + % CANT CONTAIN A SIX: + % 1,2,3,4,5,6,7,8 (HORIZONTAL ROW) + % 9,18,27,36,45,54,63,72 (VERTCAL COLUMN) + % 1,2,9,10,11,18,19,20 (3X3 SQUARE) + % THATS A TOTAL OF 24 SQUARE NUMBERS, + % BUT 4 OF THEM ARE DUPLICATES. THE + % "OTHERS" ARRAY IS BIG ENOUGH TO HOLD + % 24 NUMBERS WHILE IT IS BEING BUILT, BUT + % WILL ONLY 20 NUMBERS WILL BE USED WHEN + % IT IS COMPLETE. + +FILE CARD (2,10,150); +FILE SPO 11 (1,10); +FILE LINE 15 (1,15); % 15, 17 IS PRINTER BACKUP DISK + +INTEGER PROCEDURE ONES32(I); % FROM HACKERS DELIGHT +%--------------------------- +VALUE I; INTEGER I; +BEGIN + I:= I - REAL(BOOLEAN(I.[31:31]) AND BOOLEAN(3"12525252525")); + I:= REAL(BOOLEAN(I.[31:30]) AND BOOLEAN(3"6314631463")) + + REAL(BOOLEAN(I) AND BOOLEAN(3"6314631463")); + I:= REAL(BOOLEAN(I.[31:28] + I) AND BOOLEAN(3"1703607417")); + I:= I + I.[31:24]; + I:= I + I.[31:16]; + ONES32:= REAL(BOOLEAN(I) AND BOOLEAN(3"77")); +END; + +PROCEDURE SETBOX(N, X, BIT); +%--------------------------- +VALUE N, X, BIT; INTEGER N, X, BIT; +% "SETBOX" IS USED TO PLACE A NUMBER IN THE GRID, WHETHER IT IS KNOWN, +% OR A GUESS. IT ALSO UPDATES ALL THE BITMASKS FOR ALL THE ASSOCIATED +% SQUARES TO INDICATE THAT THEY CANT CONTAIN THIS NUMBER. +BEGIN + INTEGER I; + + GRID[N]:= X; + FOR I:= 0 STEP 1 UNTIL 19 DO + BITS[OTHERS(N,I)]:= REAL(BOOLEAN(BITS[OTHERS(N,I)]) OR + BOOLEAN(BIT)); +END; + +PROCEDURE READGRID; +%------------------ +% READ IN INITIAL DATA +% THE INITIAL BITMASK IS CALCULATED AT THE SAME TIME BY CALLING SETBOX +BEGIN + INTEGER I, J; + ALPHA ARRAY AIN[0:2]; + POINTER P; + + FOR I:= 0 STEP 1 UNTIL 8 DO % 9 ROWS OF 9 NUMBERS + BEGIN + READ(CARD, 3, AIN[*]); + P:= POINTER(AIN[0]); + FOR J:= 0 STEP 1 UNTIL 8 DO + BEGIN + SETBOX(9 | I + J, INTEGER(P,1), + BITNO[INTEGER(P,1)]); % SET BITNO, LSB=BIT0 + P:= P + 1; + END; + END; + + %WRITE OUT WHAT WE GOT! + WRITE(LINE, <"WE STORED IN GRID:">); + FOR I:= 0 STEP 1 UNTIL 8 DO + WRITE(LINE, <9I1>, FOR J:= 0 STEP 1 UNTIL 8 DO GRID[9|I+J]); + + %CHECK FOR CONSISTENCY + FOR I:= 0 STEP 1 UNTIL 80 DO + IF GRID[I] > 0 THEN + IF REAL(BOOLEAN(BITS[I]) AND BOOLEAN(BITNO[GRID[I]])) > 0 THEN + BEGIN + WRITE(LINE, <"INCONSISTENT DATA IN ",I1,",",I1>, + (I DIV 9)+1, (I MOD 9) + 1); + J:= 1/0; + END; +END; + +PROCEDURE PRINTSOLUTION; +%----------------------- +BEGIN + INTEGER I, J; + + NUM:= NUM + 1; + IF NUM > 1 THEN + WRITE(LINE, <" ">); % BLANK + + WRITE(LINE,<"SOLUTION ",I3,":">, NUM); + FOR I:= 0 STEP 1 UNTIL 8 DO + WRITE(LINE, <9I1>, FOR J:= 0 STEP 1 UNTIL 8 DO GRID[9|I+J]); + +END; + +PROCEDURE SELECTBOX; +%------------------- +% "SELECTBOX" IS THE HEART OF THE ALGORITHM. IT WORKS THIS WAY: +% FIRST, THE GRID IS SEARCHED FOR AN EMPTY SQUARE. IF THERE ISNT ONE, +% THEN THE GRID CONTAINS A SOLUTION, SO IT IS PRINTED. IF AN EMPTY +% SQUARE IS FOUND, THEN IT IS COMPARED WITH ALL OTHER EMPTY SQUARES TO +% SEE WHICH ONE OF THEM HAS THE MAXIMUM NUMBER OF 1-BITS IN ITS BITMASK. +% THAT SQUARE IS THE ONE SELECTED, AND EACH OF THE POSSIBLE VALUES ARE +% TRIED IN RETURN, CALLING "SELECTBOX" RECURSIVELY TO SEARCH FOR A +% SOLUTION. NOTE THAT IF A SQUARE HAS 9 1-BITS IN ITS BITMASK, THEN +% THERE ARE NO POSSIBLE VALUES, AND "SELECTBOX" WILL RETURN WITHOUT ANY +% FURTHER RECURSION. OTHERWISE, IF A SQUARE HAS 8 1-BITS IN ITS BITMASK, +% THEN IT HAS A FORCED CHOICE, AND ONLY THAT CHOICE WILL BE TAKEN AT THIS +% LEVEL IN THE RECURSION. +BEGIN + INTEGER ARRAY + BITSAVE[0:80]; % SAVED ON EVERY RECURSION, MAX DEPTH 81|81 = 4131 WORDS? + INTEGER + I, + J, + BEST, + BESTCOUNT; + BOOLEAN + FINISHED; + LABEL XIT; + + CURDEPTH:= CURDEPTH + 1; + MAXDEPTH:= MAX(MAXDEPTH, CURDEPTH); + +% IF NUM = 0 THEN % RECURSE ONLY IF NO SOLUTIONS SO FAR + BEGIN + % FIND EMPTY SQUARE + BEST:= 0; + WHILE NOT FINISHED DO % PREFER TO HAVE CONDITIONAL AND :) + IF NOT FINISHED:= GRID[BEST] = 0 THEN + FINISHED:= (BEST:= BEST + 1) GTR 80; + + IF BEST = 81 THEN % 81 INDICATES NO EMPTY SQUARES + BEGIN + PRINTSOLUTION; + GO TO XIT; + END; + + BESTCOUNT:= COUNT[BITS[BEST]]; % BITS IN THE SQUARE WE FOUND + FOR I:= BEST+1 STEP 1 WHILE I LSS 81 DO + BEGIN % FIND THE BIGGEST COUNT OVER ALL SQUARES + IF GRID[I] = 0 THEN % ONLY CONSIDER EMPTY SQUARES + BEGIN + J:= COUNT[BITS[I]]; + IF J > BESTCOUNT THEN + BEGIN + BEST:= I; + BESTCOUNT:= J; + END; + END; + END; + + % TRY ALL NUMBERS FOR THIS SQUARE + FOR I:= 1 STEP 1 WHILE I LEQ 9 DO + BEGIN + IF REAL(BOOLEAN(BITS[BEST]) AND BOOLEAN(BITNO[I])) = 0 THEN + BEGIN % IF THE NUMBER IS POSSIBLE, RECURSE + % SAVE STATE ON STACK + REPLACE POINTER(BITSAVE) BY POINTER(BITS) FOR 81 WORDS; + SETBOX(BEST, I, BITNO[I]); % SET NUMBER AND FIX BITMASK + SELECTBOX; % RECURSE + GRID[BEST]:= 0; % UNPLACE NUMBER IN SQUARE + % RESTORE + REPLACE POINTER(BITS) BY POINTER(BITSAVE) FOR 81 WORDS; + END; + END; + END; + +XIT: + CURDEPTH:= CURDEPTH - 1; +END; + +PROCEDURE INITIALIZE; +%--------------------- +% FILL THE COUNT AND OTHERS ARRAYS +BEGIN + DEFINE FO(I) = FILL OTHERSARY[I, *] WITH #; % MAKE IT EASIER TO WRITE! + INTEGER CNT; + + % PREFILLED COUNT ARRAY: PT= 0.833 IO= 9.267 ET= 3.483 + % CALCULATED COUNT ARRAY: PT= 1.150 IO= 8.850 ET= 3.517 + FOR CNT:= 0 STEP 1 UNTIL 511 DO + COUNT[CNT]:= ONES32(CNT); + + % BE NICE TO REDUCE PBITTING SOMEHOW, AND MAYBE MAKE FASTER ACCESS, + % WHICH IS BETTER INDEXED DESCRIPTOR OR MULTIPLY TO DETERMINE VALUE? + % CURRENT IMPLEMENTATION SLOWS THE COMPILER AS WELL! + % AS FILL CAN ONLY DO 1024 NUMBERS, CANNOT USE SINGLE DIMENSION ARRAY + % 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 +FO( 0) 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,27,36,45,54,63,72; % 0 +FO( 1) 0, 2, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,28,37,46,55,64,73; % 1 +FO( 2) 0, 1, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,29,38,47,56,65,74; % 2 +FO( 3) 0, 1, 2, 4, 5, 6, 7, 8,12,13,14,21,22,23,30,39,48,57,66,75; % 3 +FO( 4) 0, 1, 2, 3, 5, 6, 7, 8,12,13,14,21,22,23,31,40,49,58,67,76; % 4 +FO( 5) 0, 1, 2, 3, 4, 6, 7, 8,12,13,14,21,22,23,32,41,50,59,68,77; % 5 +FO( 6) 0, 1, 2, 3, 4, 5, 7, 8,15,16,17,24,25,26,33,42,51,60,69,78; % 6 +FO( 7) 0, 1, 2, 3, 4, 5, 6, 8,15,16,17,24,25,26,34,43,52,61,70,79; % 7 +FO( 8) 0, 1, 2, 3, 4, 5, 6, 7,15,16,17,24,25,26,35,44,53,62,71,80; % 8 +FO( 9) 0, 1, 2,10,11,12,13,14,15,16,17,18,19,20,27,36,45,54,63,72; % 9 +FO(10) 0, 1, 2, 9,11,12,13,14,15,16,17,18,19,20,28,37,46,55,64,73; % 10 +FO(11) 0, 1, 2, 9,10,12,13,14,15,16,17,18,19,20,29,38,47,56,65,74; % 11 +FO(12) 3, 4, 5, 9,10,11,13,14,15,16,17,21,22,23,30,39,48,57,66,75; % 12 +FO(13) 3, 4, 5, 9,10,11,12,14,15,16,17,21,22,23,31,40,49,58,67,76; % 13 +FO(14) 3, 4, 5, 9,10,11,12,13,15,16,17,21,22,23,32,41,50,59,68,77; % 14 +FO(15) 6, 7, 8, 9,10,11,12,13,14,16,17,24,25,26,33,42,51,60,69,78; % 15 +FO(16) 6, 7, 8, 9,10,11,12,13,14,15,17,24,25,26,34,43,52,61,70,79; % 16 +FO(17) 6, 7, 8, 9,10,11,12,13,14,15,16,24,25,26,35,44,53,62,71,80; % 17 +FO(18) 0, 1, 2, 9,10,11,19,20,21,22,23,24,25,26,27,36,45,54,63,72; % 18 +FO(19) 0, 1, 2, 9,10,11,18,20,21,22,23,24,25,26,28,37,46,55,64,73; % 19 +FO(20) 0, 1, 2, 9,10,11,18,19,21,22,23,24,25,26,29,38,47,56,65,74; % 20 +FO(21) 3, 4, 5,12,13,14,18,19,20,22,23,24,25,26,30,39,48,57,66,75; % 21 +FO(22) 3, 4, 5,12,13,14,18,19,20,21,23,24,25,26,31,40,49,58,67,76; % 22 +FO(23) 3, 4, 5,12,13,14,18,19,20,21,22,24,25,26,32,41,50,59,68,77; % 23 +FO(24) 6, 7, 8,15,16,17,18,19,20,21,22,23,25,26,33,42,51,60,69,78; % 24 +FO(25) 6, 7, 8,15,16,17,18,19,20,21,22,23,24,26,34,43,52,61,70,79; % 25 +FO(26) 6, 7, 8,15,16,17,18,19,20,21,22,23,24,25,35,44,53,62,71,80; % 26 +FO(27) 0, 9,18,28,29,30,31,32,33,34,35,36,37,38,45,46,47,54,63,72; % 27 +FO(28) 1,10,19,27,29,30,31,32,33,34,35,36,37,38,45,46,47,55,64,73; % 28 +FO(29) 2,11,20,27,28,30,31,32,33,34,35,36,37,38,45,46,47,56,65,74; % 29 +FO(30) 3,12,21,27,28,29,31,32,33,34,35,39,40,41,48,49,50,57,66,75; % 30 +FO(31) 4,13,22,27,28,29,30,32,33,34,35,39,40,41,48,49,50,58,67,76; % 31 +FO(32) 5,14,23,27,28,29,30,31,33,34,35,39,40,41,48,49,50,59,68,77; % 32 +FO(33) 6,15,24,27,28,29,30,31,32,34,35,42,43,44,51,52,53,60,69,78; % 33 +FO(34) 7,16,25,27,28,29,30,31,32,33,35,42,43,44,51,52,53,61,70,79; % 34 +FO(35) 8,17,26,27,28,29,30,31,32,33,34,42,43,44,51,52,53,62,71,80; % 35 +FO(36) 0, 9,18,27,28,29,37,38,39,40,41,42,43,44,45,46,47,54,63,72; % 36 +FO(37) 1,10,19,27,28,29,36,38,39,40,41,42,43,44,45,46,47,55,64,73; % 37 +FO(38) 2,11,20,27,28,29,36,37,39,40,41,42,43,44,45,46,47,56,65,74; % 38 +FO(39) 3,12,21,30,31,32,36,37,38,40,41,42,43,44,48,49,50,57,66,75; % 39 +FO(40) 4,13,22,30,31,32,36,37,38,39,41,42,43,44,48,49,50,58,67,76; % 40 +FO(41) 5,14,23,30,31,32,36,37,38,39,40,42,43,44,48,49,50,59,68,77; % 41 +FO(42) 6,15,24,33,34,35,36,37,38,39,40,41,43,44,51,52,53,60,69,78; % 42 +FO(43) 7,16,25,33,34,35,36,37,38,39,40,41,42,44,51,52,53,61,70,79; % 43 +FO(44) 8,17,26,33,34,35,36,37,38,39,40,41,42,43,51,52,53,62,71,80; % 44 +FO(45) 0, 9,18,27,28,29,36,37,38,46,47,48,49,50,51,52,53,54,63,72; % 45 +FO(46) 1,10,19,27,28,29,36,37,38,45,47,48,49,50,51,52,53,55,64,73; % 46 +FO(47) 2,11,20,27,28,29,36,37,38,45,46,48,49,50,51,52,53,56,65,74; % 47 +FO(48) 3,12,21,30,31,32,39,40,41,45,46,47,49,50,51,52,53,57,66,75; % 48 +FO(49) 4,13,22,30,31,32,39,40,41,45,46,47,48,50,51,52,53,58,67,76; % 49 +FO(50) 5,14,23,30,31,32,39,40,41,45,46,47,48,49,51,52,53,59,68,77; % 50 +FO(51) 6,15,24,33,34,35,42,43,44,45,46,47,48,49,50,52,53,60,69,78; % 51 +FO(52) 7,16,25,33,34,35,42,43,44,45,46,47,48,49,50,51,53,61,70,79; % 52 +FO(53) 8,17,26,33,34,35,42,43,44,45,46,47,48,49,50,51,52,62,71,80; % 53 +FO(54) 0, 9,18,27,36,45,55,56,57,58,59,60,61,62,63,64,65,72,73,74; % 54 +FO(55) 1,10,19,28,37,46,54,56,57,58,59,60,61,62,63,64,65,72,73,74; % 55 +FO(56) 2,11,20,29,38,47,54,55,57,58,59,60,61,62,63,64,65,72,73,74; % 56 +FO(57) 3,12,21,30,39,48,54,55,56,58,59,60,61,62,66,67,68,75,76,77; % 57 +FO(58) 4,13,22,31,40,49,54,55,56,57,59,60,61,62,66,67,68,75,76,77; % 58 +FO(59) 5,14,23,32,41,50,54,55,56,57,58,60,61,62,66,67,68,75,76,77; % 59 +FO(60) 6,15,24,33,42,51,54,55,56,57,58,59,61,62,69,70,71,78,79,80; % 60 +FO(61) 7,16,25,34,43,52,54,55,56,57,58,59,60,62,69,70,71,78,79,80; % 61 +FO(62) 8,17,26,35,44,53,54,55,56,57,58,59,60,61,69,70,71,78,79,80; % 62 +FO(63) 0, 9,18,27,36,45,54,55,56,64,65,66,67,68,69,70,71,72,73,74; % 63 +FO(64) 1,10,19,28,37,46,54,55,56,63,65,66,67,68,69,70,71,72,73,74; % 64 +FO(65) 2,11,20,29,38,47,54,55,56,63,64,66,67,68,69,70,71,72,73,74; % 65 +FO(66) 3,12,21,30,39,48,57,58,59,63,64,65,67,68,69,70,71,75,76,77; % 66 +FO(67) 4,13,22,31,40,49,57,58,59,63,64,65,66,68,69,70,71,75,76,77; % 67 +FO(68) 5,14,23,32,41,50,57,58,59,63,64,65,66,67,69,70,71,75,76,77; % 68 +FO(69) 6,15,24,33,42,51,60,61,62,63,64,65,66,67,68,70,71,78,79,80; % 69 +FO(70) 7,16,25,34,43,52,60,61,62,63,64,65,66,67,68,69,71,78,79,80; % 70 +FO(71) 8,17,26,35,44,53,60,61,62,63,64,65,66,67,68,69,70,78,79,80; % 71 +FO(72) 0, 9,18,27,36,45,54,55,56,63,64,65,73,74,75,76,77,78,79,80; % 72 +FO(73) 1,10,19,28,37,46,54,55,56,63,64,65,72,74,75,76,77,78,79,80; % 73 +FO(74) 2,11,20,29,38,47,54,55,56,63,64,65,72,73,75,76,77,78,79,80; % 74 +FO(75) 3,12,21,30,39,48,57,58,59,66,67,68,72,73,74,76,77,78,79,80; % 75 +FO(76) 4,13,22,31,40,49,57,58,59,66,67,68,72,73,74,75,77,78,79,80; % 76 +FO(77) 5,14,23,32,41,50,57,58,59,66,67,68,72,73,74,75,76,78,79,80; % 77 +FO(78) 6,15,24,33,42,51,60,61,62,69,70,71,72,73,74,75,76,77,79,80; % 78 +FO(79) 7,16,25,34,43,52,60,61,62,69,70,71,72,73,74,75,76,77,78,80; % 79 +FO(80) 8,17,26,35,44,53,60,61,62,69,70,71,72,73,74,75,76,77,78,79; % 80 + + FILL BITNO[*] WITH 0, 1, 2, 4, % NOTE ZERO BASED!!! + 8, 16, 32, 64, + 128, 256, 512, 1024; + + WRITE(LINE, <"INITIALIZATION TIME: ", + "PT=",F8.3," IO=",F8.3," ET=", F10.3>, + TIME(2)/60, TIME(3)/60, (TIME(1)-STARTET)/60); +END; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% SOME TESTED DATA VALUES, +%071698035 +%600030700 +%090400100 +%000009002 +%300000009 +%500200000 +%004006070 +%006080001 +%820314950 + +%000000008 +%010000040 +%000645910 +%591300000 +%062401790 +%000008165 +%024173000 +%080000020 +%900000000 + +%000000000 - 272 SOLUTIONS +%010000040 +%000605910 +%591300000 +%062401790 +%000008105 +%024173000 +%080000020 +%000000000 + +%600900050 - VERY HARD - PT = 30SEC+ +%009000003 +%050040007 +%013502790 +%000000000 +%092603540 +%900050020 +%100000600 +%020004005 + +%000000008 - 12 SOLUTIONS +%010000040 +%000645910 +%591300000 +%000000007 +%000008165 +%024173000 +%080000020 +%900000000 + +%000000008 - 118 SOLUTIONS +%010000040 +%000645910 +%591300000 +%000000000 +%000008165 +%024173000 +%080000020 +%900000000 + + STARTET:= TIME(1); + + INITIALIZE; + READGRID; + + SELECTBOX; + + % WARN THE OPERATOR + IF NUM > 1 THEN + WRITE(SPO, <"FOUND ", I5, " SOLUTIONS">, NUM); + + WRITE(LINE, <" ">); + WRITE(LINE,