~aleteoryx/up-for-it

ref: 6314273f43c01a3ac5c5bb8768c8c698328671e5 up-for-it/aoc/2025/01.tal -rw-r--r-- 2.5 KiB
6314273fAleteoryx 2025.01.2, finally 3 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
( advent of code 2025, day 1 )

%dbg { #010e DEO }

|00

|100
@on-reset ( -> )
	banner
	first-star
	Dial/reset
	second-star
	BRK

@banner ( -- )
	;/str !puts
@banner/str
	"advent 20 "of 20 "code, 20 "day 20 "1 0a 00


( first star )

@first-star ( -- )
	;/input Input/read

	[ LIT2 &pass $2 ]
	;/str puts
	putdec2 endl

	JMP2r
@first-star/str "first 20 "star: 09 00

@first-star/newline ( -- )
	Number/get Dial/rotate
	Number/reset
	
	Dial/get ORA ?{ ,/pass LDR2 INC2 ,/pass STR2 }
	JMP2r

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


( second star )

@second-star ( -- )
	;/input Input/read

	[ LIT2 &pass $2 ]
	;/str puts
	putdec2 endl

	JMP2r
@second-star/str "second 20 "star: 09 00

@second-star/newline ( -- )
	#0000
	Dial/get #0000 EQU2 ?{
		Dial/getraw
		Number/get
		#0064 DIV2k MUL2 SUB2
		Dial/op
		
		DUP2 #6401 LTH2 STH
		     #6463 GTH2 STHr ORA	( c < 25601  || c > 25699 )
		ORA
	}

	Number/get Dial/rotate

	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/getraw ( -- n* )
	,/state LDR2 JMP2r
@Dial/reset ( -- )
	#6432 ,/state STR2 JMP2r
@Dial/rotate ( n* -- )
	[ LIT2 &state 6432 ]	( start @ 25650 )
	SWP2 /op
	#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