~aleteoryx/up-for-it

up-for-it/aoc/2025/01.2.tal -rw-r--r-- 2.0 KiB
195fe6fdAleteoryx notes 2 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
( 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