~aleteoryx/up-for-it

ref: ff0d1bd0afcddd5a61cea8d7afe504abb9a1480c up-for-it/aoc/2025/02.1.tal -rw-r--r-- 2.0 KiB
ff0d1bd0Aleteoryx ascii math routines 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
139
140
141
142
143
( advent of code 2025, day 2, first star )

%dbg { #010e DEO }


|00
@Buffers/num $f &endnum $1
@Buffers/end $f &endend $1

$1 @Buffers/read $f &endread $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 )

@astr $1 "89 &end "5 $1
@bstr $1 "10 &end "9 $1

@first-star ( -- )
	;astr/end ;bstr/end sumstrs
	
	;astr puts endl

	( Input/read )
	JMP2r

@first-star/on-input ( b -- )
	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

@findend ( p* -- p* )
	INC2 LDAk ?findend
	JMP2r

@sumstrs ( a* b* -- )			( takes pointers to the last digits of each number )
	LDAk STH SWP2 LDAk STHr		( b* a* ac bc ) dbg
	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! )


( object lib )

@Input/filename "02.input.test 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

	
@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 )