( advent of code 2025, day 1, second star )
%dbg { #010e DEO }
@on-reset ( -> )
banner
second-star
BRK
@banner ( -- )
;/str !puts
@banner/str
"advent 20 "of 20 "code 20 "2025, 20 "day 20 "1, 20 "second 20 "star 0a 00
( second star )
@second-star ( -- )
;/input Input/read
[ LIT2 &pass $2 ]
putdec2 endl
JMP2r
@second-star/newline ( -- )
Number/get Dial/rotate
#0000
Dial/get #0000 EQU2 ?{
Dial/hitzero ORA
}
Dial/fixup
DUP2 putdec2 #2018 DEO Dial/get putdec2 endl
Number/get #0064 DIV2 ( extra-overflow* )
ADD2
,/pass LDR2 ADD2 ,/pass STR2
!Number/reset
@second-star/input ( b -- )
DUP #0a NEQ ?{ POP !/newline }
DUP LIT "R NEQ ?{ POP !Dial/right }
DUP LIT "L NEQ ?{ POP !Dial/left }
!Number/one-byte
( 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
( object lib )
@Input/filename "01.input 00
@Input/read ( callback* -- )
#01ab DEO
;/filename #a8 DEO2
&loop
DUP2
;/byte #ac DEO2
#a3 DEI #00 EQU ?/endloop ( EOF )
[ LIT &byte $1 ]
ROT ROT JSR2
!/loop
&endloop
POP2 JMP2r
@Number/one-byte ( b -- )
#00 SWP
LIT "0 SUB
[ LIT2 &val 0000 ]
#000a MUL2 ADD2
,/val STR2
JMP2r
@Number/get ( -- n* )
,/val LDR2 JMP2r
@Number/reset ( -- )
#0000 ,/val STR2 JMP2r
( problem code )
@Dial/get ( -- n* )
,/state LDR2 #6400 SUB2 JMP2r
@Dial/hitzero ( -- hitzero? )
,/state LDR2
DUP2 #6401 LTH2 STH
#6463 GTH2 STHr ORA ( c < 25601 || c > 25699 )
JMP2r
@Dial/rotate ( n* -- )
#0064 DIV2k MUL2 SUB2
[ LIT2 &state 6432 ] ( start @ 25650 )
SWP2 /op
,/state STR2
JMP2r
@Dial/fixup ( n* -- )
,/state LDR2
#0064 DIV2k MUL2 SUB2 ( mod 100 )
#6400 ADD2 ( keep in range 25600-25699 )
,/state STR2
@Dial/left ( -- )
[ LIT2 SUB2 _/opc ] STR JMP2r
@Dial/right ( -- )
[ LIT2 ADD2 _/opc ] STR JMP2r
@Dial/op ( a* b* -- a?b* )
&opc $1 JMP2r