Advertisement
Guest User

AOC2020Day17Part2inGWBASIC

a guest
Dec 17th, 2020
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 10 OPEN "I",1,"data17.txt": GOSUB 2000: GOSUB 2500: O=7
  2. 20 WHILE NOT EOF(1): LINE INPUT#1, S$: FOR X=0 TO LEN(S$)-1
  3. 30 IF MID$(S$,X+1,1)="#" THEN GOSUB 400: GOSUB 2020
  4. 40 NEXT X: Y=Y+1: WEND: GOSUB 2050: FOR S=1 TO 6: PRINT S-1;":";V
  5. 50 FOR OW=-S TO S:FOR OZ=-S TO S: FOR OY=-S TO LEN(S$)+S: FOR OX=-S TO LEN(S$)+S
  6. 60 N=0: FOR NW=OW-1 TO OW+1: FOR NZ=OZ-1 TO OZ+1: FOR NY=OY-1 TO OY+1: FOR NX=OX-1 TO OX+1
  7. 70 W=NW: X=NX: Y=NY: Z=NZ: GOSUB 400: GOSUB 2040: IF V THEN N=N+1
  8. 80 NEXT: NEXT: NEXT: NEXT: X=OX: Y=OY: Z=OZ: W=OW: GOSUB 400: GOSUB 2040
  9. 90 IF N=3 OR (N=4 AND V) THEN GOSUB 2520
  10. 100 NEXT:NEXT: NEXT: NEXT: GOSUB 2550: GOSUB 2600: NEXT: PRINT "Part 1:";V: END
  11. 400 K=(W+O)*(2^15)+(Z+O)*(2^10)+(Y+O)*(2^5)+(X+O): RETURN
  12. 900 END
  13. 1995 ' ************************************************************************
  14. 1996 ' Simple Set. Stores up to 4000 values. key K
  15. 1998 ' ************************************************************************
  16. 2000 DIM S1(3999): FOR I=0 TO 3999: S1(I)=-1: NEXT: RETURN
  17. 2010 H%=K-INT(K/4000)*4000: WHILE S1(H%)<>-1 AND S1(H%)<>K: H%=(H%+1) MOD 4000: WEND: RETURN
  18. 2020 GOSUB 2010: S1(H%)=K: RETURN
  19. 2030 GOSUB 2010: IF S1(H%)=K THEN S1(H%)=-1: RETURN ELSE RETURN
  20. 2040 GOSUB 2010: V = (S1(H%) = K): RETURN
  21. 2050 V=0: FOR I=0 TO 3999: IF S1(I)<>-1 THEN V=V+1
  22. 2051 NEXT I: RETURN
  23. 2498 ' ************************************************************************
  24. 2499 ' We need two sets!
  25. 2500 DIM S2(3999): FOR I=0 TO 3999: S2(I)=-1: NEXT: RETURN
  26. 2510 H%=K-INT(K/4000)*4000: WHILE S2(H%)<>-1 AND S2(H%)<>K: H%=(H%+1) MOD 4000: WEND: RETURN
  27. 2520 GOSUB 2510: S2(H%)=K: RETURN
  28. 2530 GOSUB 2510: IF S2(H%)=K THEN S2(H%)=-1: RETURN ELSE RETURN
  29. 2540 GOSUB 2510: V = (S2(H%) = K): RETURN
  30. 2550 V=0: FOR I=0 TO 3999: IF S2(I)<>-1 THEN V=V+1
  31. 2551 NEXT I: RETURN
  32. 2599 REM ' Copy S2 to S1 and wipe S2
  33. 2600 FOR I=0 TO 3999: S1(I)=S2(I): S2(I)=-1: NEXT: RETURN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement