musifter

AoC 2025, day 5 part 2 (dc)

Dec 7th, 2025
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 1.62 KB | Source Code | 0 0
  1. # Command: tr '-' ' ' </tmp/input | dc -fdc-p2.dc
  2.  
  3. # read ranges section onto stack
  4. 1 ?                 # end start i
  5. [
  6.     3R d3R r:e      # ends(i) = end;     i start
  7.        d3R r:s      # starts(i) = start; i
  8.     1+ ? z1<L
  9. ] dsLx              # length of range array left on stack
  10.  
  11. [r] sr
  12.  
  13. # Clear interval
  14. [ d _1r:s _2r:e q ] sC
  15.  
  16. # Trim start or end
  17. [ d le1+ r:s rq ] sS
  18. [ d ls1- r:e rq ] sE
  19.  
  20. # Trim: j i -> j i
  21. #
  22. # Registers:
  23. #   a - b       range(i)
  24. #   c - d       range(j)
  25. #   s - e       intersection
  26. [
  27.     d lc ls- ld le- + 0=C           # clear range(j) if contained
  28.     s. rd_3R la ls- lb le- + 0=C    # clear range(i) if contained
  29.     s.
  30.  
  31.     # stack: j i
  32.     r
  33.     la ls =S
  34.     lb le =E
  35. ] sT
  36.  
  37. # minmax: a b -> min max
  38. [
  39.     d3R d3R             # a b b a
  40.     <r
  41. ] sM
  42.  
  43. 1- dsn                  # i=n  (ranges stored as range(n) - range(n-1))
  44. [
  45.     d1-                 # j=i-1 i
  46.     [
  47.         # calculate intersection:
  48.         d;s dsc 3Rd;s dsa 3R    # start(i) start(j) j i
  49.         lMx s.                  # iStart=max(starts) j i
  50.         ss                      # s=iStart; i j
  51.  
  52.         d;e dsb 3Rd;e dsd 3R    # end(j) end(i) i j
  53.         lMx rs. dse             # e=iEnd=min(ends); iEnd i j
  54.         ls                      # iStart iEnd j i
  55.         !>T                     # Call trim if iStart <= iEnd; i j
  56.  
  57.         1- d0<J
  58.     ] dsJx +
  59.  
  60.     1- d1<I
  61. ] dsIx
  62.  
  63. 0*                  # stack: sum=0
  64. ln                  # i=n sum
  65. [
  66.     d;s rd;e        # end(i) i start(i) sum
  67.     3R-1+           # end(i)-start(i)+1 i sum
  68.     3R+             #
  69.     r 1- d0<L
  70. ] dsLx +
  71.  
  72. [Part 2: ]n p
Advertisement
Add Comment
Please, Sign In to add comment