Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Command: tr '-' ' ' </tmp/input | dc -fdc-p2.dc
- # read ranges section onto stack
- 1 ? # end start i
- [
- 3R d3R r:e # ends(i) = end; i start
- d3R r:s # starts(i) = start; i
- 1+ ? z1<L
- ] dsLx # length of range array left on stack
- [r] sr
- # Clear interval
- [ d _1r:s _2r:e q ] sC
- # Trim start or end
- [ d le1+ r:s rq ] sS
- [ d ls1- r:e rq ] sE
- # Trim: j i -> j i
- #
- # Registers:
- # a - b range(i)
- # c - d range(j)
- # s - e intersection
- [
- d lc ls- ld le- + 0=C # clear range(j) if contained
- s. rd_3R la ls- lb le- + 0=C # clear range(i) if contained
- s.
- # stack: j i
- r
- la ls =S
- lb le =E
- ] sT
- # minmax: a b -> min max
- [
- d3R d3R # a b b a
- <r
- ] sM
- 1- dsn # i=n (ranges stored as range(n) - range(n-1))
- [
- d1- # j=i-1 i
- [
- # calculate intersection:
- d;s dsc 3Rd;s dsa 3R # start(i) start(j) j i
- lMx s. # iStart=max(starts) j i
- ss # s=iStart; i j
- d;e dsb 3Rd;e dsd 3R # end(j) end(i) i j
- lMx rs. dse # e=iEnd=min(ends); iEnd i j
- ls # iStart iEnd j i
- !>T # Call trim if iStart <= iEnd; i j
- 1- d0<J
- ] dsJx +
- 1- d1<I
- ] dsIx
- 0* # stack: sum=0
- ln # i=n sum
- [
- d;s rd;e # end(i) i start(i) sum
- 3R-1+ # end(i)-start(i)+1 i sum
- 3R+ #
- r 1- d0<L
- ] dsLx +
- [Part 2: ]n p
Advertisement
Add Comment
Please, Sign In to add comment