Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 10 DIM TOKEN$(600), CHILD$(600)
- 17 REM *****************************************
- 18 REM HELPER PARSING AND TOKENISATION FUNCTIONS
- 19 REM *****************************************
- 20 DEF FNSKIPT(P) = INSTR(INSTR(P, S$, " ")+1, S$, " ")
- 25 DEF FNTOAA$(N) = CHR$(65+INT(N/26))+CHR$(65+N-26*INT(N/26))
- 26 DEF FNFROMAA(S$) = (ASC(MID$(S$, 1, 1))-65)*26 + (ASC(MID$(S$, 2, 1))-65)
- 27 REM **************************************
- 28 REM 1ST PASS: CREATE LIST OF ALL BAG TYPES
- 29 REM **************************************
- 30 PRINT "Finding bag types...";
- 40 OPEN "I", 1, "data07.txt"
- 50 FOR I = 0 TO 600
- 60 IF EOF(1) GOTO 100
- 70 LINE INPUT #1, S$
- 80 TOKEN$(I) = MID$(S$, 1, FNSKIPT(1)-1)
- 90 NEXT I
- 94 TOKENS = I
- 100 CLOSE(1)
- 110 TOKENS = I
- 115 PRINT TOKENS;"bag types found"
- 117 REM *************************************
- 118 REM 2ND PASS: PARSE AND TOKENISE CHILDREN
- 119 REM *************************************
- 130 PRINT: PRINT "Parsing children..."
- 140 OPEN "I", 1, "data07.txt"
- 150 FOR I = 0 TO TOKENS-1
- 160 IF EOF(1) GOTO 250
- 170 LINE INPUT #1, S$
- 175 TOSTR$ = ""
- 180 IF INSTR(S$, "no other") GOTO 240
- 190 P = FNSKIPT(1)+14
- 200 N% = VAL(MID$(S$, P, 1))
- 210 PP = FNSKIPT(P+2): T$ = MID$(S$, P+2, PP-P-2)
- 214 GOSUB 3000
- 215 TOSTR$ = TOSTR$ + STR$(N%) + FNTOAA$(TI%)
- 220 P = INSTR(P, S$, ", ")+2
- 230 IF P>2 GOTO 200
- 240 PRINT I,":",TOSTR$
- 241 CHILD$(I) = TOSTR$
- 245 NEXT I
- 250 CLOSE(1)
- 260 PRINT "Done"
- 297 REM ******************************************
- 298 REM PART 1: COUNT BAGS CONTAINING 'SHINY GOLD'
- 299 REM ******************************************
- 300 PRINT: PRINT: PRINT "Part 1: Find bags containing 'shiny gold'"
- 500 DIM STATUS(600), BL%(100), JL%(100): BP% = 0
- 510 T$ = "shiny gold": GOSUB 3000: STATUS(TI%) = 1
- 520 FOR I = 0 TO TOKENS - 1
- 530 BP% = 0: BL%(BP%) = I
- 540 GOSUB 1000
- 550 NEXT I
- 560 PRINT "Found status of all bags."
- 570 SUM = 0
- 580 FOR I = 0 TO TOKENS - 1
- 590 IF STATUS(I) = 1 THEN SUM = SUM + 1
- 600 NEXT I
- 610 PRINT "Number of bags that contain 'shiny gold': "; SUM - 1
- 697 REM *******************************888****
- 698 REM PART 2: FIND #BAGS INSIDE 'SHINY GOLD'
- 699 REM **************************************
- 700 PRINT: PRINT: PRINT "Part 2: Find the number of bags inside a 'shiny gold'"
- 800 FOR I = 0 TO 600: STATUS(I) = -1: NEXT I
- 810 BP% = 0: BL%(BP%) = TI%: GOSUB 2000
- 820 PRINT "Contents of 'shiny gold' bag: "; STATUS(TI%)
- 830 END
- 997 REM ******************************************
- 998 REM RECURSION FOR PART 1. BL%(BP%) -> STATUS()
- 999 REM ******************************************
- 1000 B% = BL%(BP%)
- 1010 IF STATUS(B%) > 0 THEN GOTO 1170
- 1020 J = 3
- 1030 IF J > LEN(CHILD$(B%)) GOTO 1100
- 1040 CI% = FNFROMAA(MID$(CHILD$(B%), J, 2))
- 1050 JL%(BP%) = J: BP% = BP% + 1
- 1060 BL%(BP%) = CI%: GOSUB 1000:
- 1070 B% = BL%(BP%): J = JL%(BP%)
- 1080 J = J + 4
- 1090 GOTO 1030
- 1100 STATUS(B%) = 2
- 1110 FOR J = 3 TO LEN(CHILD$(B%)) STEP 4
- 1120 CI% = FNFROMAA(MID$(CHILD$(B%), J, 2))
- 1130 IF STATUS(CI%) = 1 THEN STATUS(B%) = 1: GOTO 1170
- 1140 NEXT J
- 1170 BP% = BP% - 1
- 1180 RETURN
- 1197 REM ******************************************
- 1198 REM RECURSION FOR PART 2. BL%(BP%) -> STATUS()
- 1199 REM ******************************************
- 2000 B% = BL%(BP%)
- 2010 IF STATUS(B%) > 0 THEN GOTO 2170
- 2020 J = 3
- 2030 IF J > LEN(CHILD$(B%)) GOTO 2100
- 2040 CI% = FNFROMAA(MID$(CHILD$(B%), J, 2))
- 2050 JL%(BP%) = J: BP% = BP% + 1
- 2060 BL%(BP%) = CI%: GOSUB 2000
- 2070 B% = BL%(BP%): J = JL%(BP%)
- 2080 J = J + 4
- 2090 GOTO 2030
- 2100 SUM = 0
- 2110 FOR J = 3 TO LEN(CHILD$(B%)) STEP 4
- 2120 CI% = FNFROMAA(MID$(CHILD$(B%), J, 2))
- 2130 SUM = SUM + (1 + STATUS(CI%)) * VAL(MID$(CHILD$(B%), J - 1, 1))
- 2140 NEXT J
- 2150 STATUS(B%) = SUM
- 2170 BP% = BP% - 1
- 2180 RETURN
- 2997 REM ****************************
- 2998 REM FINDS THE INDEX OF T$ -> TI%
- 2999 REM ****************************
- 3000 FOR J = 0 TO TOKENS-1
- 3010 IF TOKEN$(J) = T$ THEN TI% = J: RETURN
- 3020 NEXT J
- 3030 PRINT "ERROR: bag type not found:";T$: RETURN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement