Advertisement
Guest User

AOC2020Day7inGWBASIC

a guest
Dec 8th, 2020 (edited)
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 10 DIM TOKEN$(600), CHILD$(600)
  2. 17 REM *****************************************
  3. 18 REM HELPER PARSING AND TOKENISATION FUNCTIONS
  4. 19 REM *****************************************
  5. 20 DEF FNSKIPT(P) = INSTR(INSTR(P, S$, " ")+1, S$, " ")
  6. 25 DEF FNTOAA$(N) = CHR$(65+INT(N/26))+CHR$(65+N-26*INT(N/26))
  7. 26 DEF FNFROMAA(S$) = (ASC(MID$(S$, 1, 1))-65)*26 + (ASC(MID$(S$, 2, 1))-65)
  8. 27 REM **************************************
  9. 28 REM 1ST PASS: CREATE LIST OF ALL BAG TYPES
  10. 29 REM **************************************
  11. 30 PRINT "Finding bag types...";
  12. 40 OPEN "I", 1, "data07.txt"
  13. 50 FOR I = 0 TO 600
  14. 60 IF EOF(1) GOTO 100
  15. 70 LINE INPUT #1, S$
  16. 80 TOKEN$(I) = MID$(S$, 1, FNSKIPT(1)-1)
  17. 90 NEXT I
  18. 94 TOKENS = I
  19. 100 CLOSE(1)
  20. 110 TOKENS = I
  21. 115 PRINT TOKENS;"bag types found"
  22. 117 REM *************************************
  23. 118 REM 2ND PASS: PARSE AND TOKENISE CHILDREN
  24. 119 REM *************************************
  25. 130 PRINT: PRINT "Parsing children..."
  26. 140 OPEN "I", 1, "data07.txt"
  27. 150 FOR I = 0 TO TOKENS-1
  28. 160 IF EOF(1) GOTO 250
  29. 170 LINE INPUT #1, S$
  30. 175 TOSTR$ = ""
  31. 180 IF INSTR(S$, "no other") GOTO 240
  32. 190 P = FNSKIPT(1)+14
  33. 200 N% = VAL(MID$(S$, P, 1))
  34. 210 PP = FNSKIPT(P+2): T$ = MID$(S$, P+2, PP-P-2)
  35. 214 GOSUB 3000
  36. 215 TOSTR$ = TOSTR$ + STR$(N%) + FNTOAA$(TI%)
  37. 220 P = INSTR(P, S$, ", ")+2
  38. 230 IF P>2 GOTO 200
  39. 240 PRINT I,":",TOSTR$
  40. 241 CHILD$(I) = TOSTR$
  41. 245 NEXT I
  42. 250 CLOSE(1)
  43. 260 PRINT "Done"
  44. 297 REM ******************************************
  45. 298 REM PART 1: COUNT BAGS CONTAINING 'SHINY GOLD'
  46. 299 REM ******************************************
  47. 300 PRINT: PRINT: PRINT "Part 1: Find bags containing 'shiny gold'"
  48. 500 DIM STATUS(600), BL%(100), JL%(100): BP% = 0
  49. 510 T$ = "shiny gold": GOSUB 3000: STATUS(TI%) = 1
  50. 520 FOR I = 0 TO TOKENS - 1
  51. 530 BP% = 0: BL%(BP%) = I
  52. 540 GOSUB 1000
  53. 550 NEXT I
  54. 560 PRINT "Found status of all bags."
  55. 570 SUM = 0
  56. 580 FOR I = 0 TO TOKENS - 1
  57. 590 IF STATUS(I) = 1 THEN SUM = SUM + 1
  58. 600 NEXT I
  59. 610 PRINT "Number of bags that contain 'shiny gold': "; SUM - 1
  60. 697 REM *******************************888****
  61. 698 REM PART 2: FIND #BAGS INSIDE 'SHINY GOLD'
  62. 699 REM **************************************
  63. 700 PRINT: PRINT: PRINT "Part 2: Find the number of bags inside a 'shiny gold'"
  64. 800 FOR I = 0 TO 600: STATUS(I) = -1: NEXT I
  65. 810 BP% = 0: BL%(BP%) = TI%: GOSUB 2000
  66. 820 PRINT "Contents of 'shiny gold' bag: "; STATUS(TI%)
  67. 830 END
  68. 997 REM ******************************************
  69. 998 REM RECURSION FOR PART 1. BL%(BP%) -> STATUS()
  70. 999 REM ******************************************
  71. 1000 B% = BL%(BP%)
  72. 1010 IF STATUS(B%) > 0 THEN GOTO 1170
  73. 1020 J = 3
  74. 1030 IF J > LEN(CHILD$(B%)) GOTO 1100
  75. 1040 CI% = FNFROMAA(MID$(CHILD$(B%), J, 2))
  76. 1050 JL%(BP%) = J: BP% = BP% + 1
  77. 1060 BL%(BP%) = CI%: GOSUB 1000:
  78. 1070 B% = BL%(BP%): J = JL%(BP%)
  79. 1080 J = J + 4
  80. 1090 GOTO 1030
  81. 1100 STATUS(B%) = 2
  82. 1110 FOR J = 3 TO LEN(CHILD$(B%)) STEP 4
  83. 1120 CI% = FNFROMAA(MID$(CHILD$(B%), J, 2))
  84. 1130 IF STATUS(CI%) = 1 THEN STATUS(B%) = 1: GOTO 1170
  85. 1140 NEXT J
  86. 1170 BP% = BP% - 1
  87. 1180 RETURN
  88. 1197 REM ******************************************
  89. 1198 REM RECURSION FOR PART 2. BL%(BP%) -> STATUS()
  90. 1199 REM ******************************************
  91. 2000 B% = BL%(BP%)
  92. 2010 IF STATUS(B%) > 0 THEN GOTO 2170
  93. 2020 J = 3
  94. 2030 IF J > LEN(CHILD$(B%)) GOTO 2100
  95. 2040 CI% = FNFROMAA(MID$(CHILD$(B%), J, 2))
  96. 2050 JL%(BP%) = J: BP% = BP% + 1
  97. 2060 BL%(BP%) = CI%: GOSUB 2000
  98. 2070 B% = BL%(BP%): J = JL%(BP%)
  99. 2080 J = J + 4
  100. 2090 GOTO 2030
  101. 2100 SUM = 0
  102. 2110 FOR J = 3 TO LEN(CHILD$(B%)) STEP 4
  103. 2120 CI% = FNFROMAA(MID$(CHILD$(B%), J, 2))
  104. 2130 SUM = SUM + (1 + STATUS(CI%)) * VAL(MID$(CHILD$(B%), J - 1, 1))
  105. 2140 NEXT J
  106. 2150 STATUS(B%) = SUM
  107. 2170 BP% = BP% - 1
  108. 2180 RETURN
  109. 2997 REM ****************************
  110. 2998 REM FINDS THE INDEX OF T$ -> TI%
  111. 2999 REM ****************************
  112. 3000 FOR J = 0 TO TOKENS-1
  113. 3010 IF TOKEN$(J) = T$ THEN TI% = J: RETURN
  114. 3020 NEXT J
  115. 3030 PRINT "ERROR: bag type not found:";T$: RETURN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement