( advent of code 2025, day 2, first star ) %dbg { #010e DEO } |00 @Buffers/num $20 &endnum $1 @Buffers/end $20 &endend $1 $1 @Buffers/in $20 &endin $1 @Buffers/sum $1f &endsum $1 |100 @on-reset ( -> ) banner first-star BRK @banner ( -- ) ;/str !puts @banner/str "advent 20 "of 20 "code 20 "2025, 20 "day 20 "2, 20 "first 20 "star 0a 00 ( first star ) @first-star ( -- ) [ LIT "0 ] ;Buffers/endsum STA Input/read ;Buffers/sum findstr puts endl JMP2r @first-star/on-input ( b -- ) ( DUP #18 DEO ) DUP [ LIT "- ] NEQ ?{ POP !/dash } DUP [ LIT ", ] NEQ ?{ POP !/comma } DUP #0a NEQ ?{ POP !/comma } !Buffers/putin @first-star/dash ( -- ) [ LIT2 -Buffers/endnum -Buffers/num ] clearmem .Buffers/endnum Buffers/cpyin Buffers/reset JMP2r @first-star/comma ( -- ) [ LIT2 -Buffers/endend -Buffers/end ] clearmem .Buffers/endend Buffers/cpyin Buffers/reset &loop Buffers/maybeinc ;Buffers/endnum incs ;Buffers/endnum ;Buffers/endend strrcmp ?/loop Buffers/maybeinc JMP2r ( stdlib ) @endl ( n -- ) #0a18 DEO JMP2r @puts ( str* -- ) LDAk #18 DEO INC2 LDAk ?puts POP2 JMP2r @putdec2 ( n* -- ) [ LITr 00 ] &loop #000a DIV2k STH2k MUL2 SUB2 [ LIT "0 ] ADD NIP STH2r ROT STH ORAk ?/loop POP2 &loop2 STHr #18 DEO STHrk ?/loop2 POPr JMP2r @incs ( n* -- ) LDAk ?{ [ LIT "1 ] ROT ROT STA JMP2r } LDAk [ LIT "9 ] NEQ ?{ DUP2 [ LIT "0 ] ROT ROT STA &subone #0001 SUB2 !incs } LDAk INC ROT ROT STA JMP2r @sumstrs ( a* b* -- ) ( takes pointers to the last digits of each number ) LDAk STH SWP2 LDAk STHr ( b* a* ac bc ) DUP ?{ POP2 POP2 POP2 JMP2r } ( we've reached the end of b ) OVR ?{ NIP [ LIT "0 ] } ( if we're at the end of a, pad with 0s ) [ LIT2 "00 ] SUB2 ADD ( b* a* a+b ) DUP #0a LTH ?{ ( overflow ) #0a SUB STH DUP2 incs/subone ( carry ) STHr } [ LIT "0 ] ADD ( convert back to ascii ) ROTk ROT STA POP ( save digit ) #0001 SUB2 SWP2 #0001 SUB2 !sumstrs ( loop! ) @findend ( p* -- p* ) INC2 LDAk ?findend JMP2r @findstr ( p* -- p* ) INC2 LDAk #00 EQU ?findstr JMP2r @strlen ( p* -- len* ) DUP2 findend SWP2 SUB2 JMP2r @strrcmp ( a* b* -- neq? ) INC2 STH2 INC2 &loop [ LIT2r 0001 ] SUB2r #0001 SUB2 LDAk LDArk STHr EQUk ?{ POP2r POP2 POP2 #01 JMP2r } ORA ?/loop POP2r POP2 #00 JMP2r @clearmem ( end start -- ) #00 OVR STZ INC GTHk ?clearmem POP2 JMP2r ( object lib ) @Input/filename "02.input 00 @Input/read ( -- ) #01ab DEO ;/filename #a8 DEO2 &loop ;/byte #ac DEO2 #a3 DEI #00 EQU ?/endloop ( EOF ) [ LIT &byte $1 ] first-star/on-input !/loop &endloop POP2 JMP2r ( problem code ) @Buffers/putin ( b -- ) [ LIT2 00 &ptr -Buffers/in ] STZ2k INC ,/ptr STR POP2 JMP2r @Buffers/reset ( -- ) ;Buffers/in STZk ,/ptr STR POP JMP2r @Buffers/cpyin ( dst -- ) [ LIT2 ff _/ptr ] LDR ADD SWP &cpyloop ( src dst ) OVR LDZ OVR STZ #0101 SUB2 OVR LDZ ?/cpyloop SWP LDZ SWP STZ ( save the NUL ) JMP2r @Buffers/maybeinc ( -- ) ;/num findstr checkstr ?{ ;/endsum ;/endnum sumstrs } JMP2r @checkstr ( s* -- ok? ) DUP2 strlen DUP #01 AND #01 NEQ ?{ ( odd length, ok by default ) POP2 POP2 #01 JMP2r } #01 SFT2 ADD2k NIP2 STH2 ( s* `s+1/2* ) &loop LDArk LDAk STHr EQU ?{ POP2r POP2 #01 JMP2r ( OK ) } INC2 INC2r LDArk STHr ?/loop POP2r POP2 #00 JMP2r ( FAIL )