2020/day3: part1 and part2
This commit is contained in:
parent
8868221a5b
commit
8fbaa207c5
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
||||
*.o
|
||||
*.bin
|
||||
*.d
|
||||
*.map
|
||||
|
323
2020/day3/input.txt
Normal file
323
2020/day3/input.txt
Normal file
@ -0,0 +1,323 @@
|
||||
.#....#..##.#..####....#.......
|
||||
......#..#....#....###......#.#
|
||||
#..#.....#..............##.#.#.
|
||||
#.#...#....#...#......##..#..#.
|
||||
...#..#.##..#..#........###.#.#
|
||||
...#.#..........#.........##...
|
||||
...#.#....#.#....#..#......#...
|
||||
..##.#.....#.......#.###..#..##
|
||||
..#.......#.......#....##......
|
||||
....##........##.##...#.###.##.
|
||||
#.......#.......##..#......#...
|
||||
..##.............##.#......#...
|
||||
...#.####....#.....#...##......
|
||||
.............##.#......#.......
|
||||
..#...#....#......#....#.......
|
||||
..#....#..#............#.......
|
||||
##...#..#........##..#......#..
|
||||
##........##........#.#.......#
|
||||
#.......#........#.#..#....###.
|
||||
.....#..#.#..........##...#....
|
||||
..##...#......#.#...#..#...#...
|
||||
##.##...#......#....#....#...#.
|
||||
#.......#..#.#..#....#..###.#.#
|
||||
#.............#.#....#..#.#....
|
||||
...#.......###.#.##.##.#...#..#
|
||||
.##.......##..##...#..###......
|
||||
.......#.#.#.#..####..#..#..#..
|
||||
...##......#.#.##.###....#.###.
|
||||
###......###......#.#####..#...
|
||||
..#........##..#..##.##..#...#.
|
||||
.....##..#...#..#.##.....#.#...
|
||||
#......#.##....#..##.#....#.#..
|
||||
##.#.##..#................#....
|
||||
......#.#....#......##.....#...
|
||||
..#...##..#..#...#..#.#..#.....
|
||||
........#.#.#.##...#.#.....#.#.
|
||||
#.#......#.....##..#...#.......
|
||||
..#.#......#...........###.....
|
||||
......##....#....##..#..#.#.#.#
|
||||
##....#.###...#......#..#...#..
|
||||
#.#.##....###...####.......#..#
|
||||
##...........#.....#........#.#
|
||||
.##.#..#.....#......#.......#..
|
||||
##..##..###....#.........##....
|
||||
..#..#..#.##...#.#...#........#
|
||||
#.##.###...#.......#...........
|
||||
.........#.................#...
|
||||
#.##...#.....#..##........#....
|
||||
....#.#...##...#...........#...
|
||||
.#.....#.#..#...##..##.....#...
|
||||
.#.....####....#..##..#........
|
||||
...#..#......##.#..##.#.#.#..#.
|
||||
.##.#.....#.....#...#.......##.
|
||||
......#..#..#......#...####....
|
||||
.......#......##..#..##.....#..
|
||||
......#.#..#...#..#.#..........
|
||||
....##.........#...............
|
||||
.#....#..##.....#....##.##.....
|
||||
#.#.....#...#....####....#.#...
|
||||
#.....#....#.#...#.............
|
||||
...#..#.....#....##..#..#......
|
||||
...#.#............#...........#
|
||||
###.#..#.#......#.....##.....#.
|
||||
####....#....###.....#..#.#####
|
||||
.###..#...#.#..#......##.#.#.#.
|
||||
.....#.##.#....#..##....#..#..#
|
||||
...#....#...##.....#......#.#..
|
||||
....#...#....#...#....#.....#.#
|
||||
.#.....#.....#.#..#......#..#..
|
||||
..#..##....##.##....#.....##...
|
||||
#..##...#.##...#..#.#.#.....#..
|
||||
...#..##.#..#....#.#....######.
|
||||
..........#..#.....#....#...##.
|
||||
#.#####.#.###..#.....#.........
|
||||
#....#......#..#.#.##.##..###..
|
||||
..#...###.#.#....##.##...##....
|
||||
.......#....#..#...##......#...
|
||||
...#.#...#..#.....#..##.#......
|
||||
###..##...........#............
|
||||
..#....#.##....#.#..##...#.....
|
||||
##....#...#....#.....#.#..##...
|
||||
..............#.##.#..#..##.###
|
||||
......#..#..#..#.#....###...##.
|
||||
.#...#..#.#.#....#..........#..
|
||||
..#.#.....#..#...........#.##..
|
||||
...#.#......#......#..#..#.#...
|
||||
...#....#.#.#.....#...#.##..#..
|
||||
.#.#..#...#........##.......#..
|
||||
##..........#..#...#....###.#..
|
||||
#.....###......#..#.#.#....#.#.
|
||||
..###.......#.#...............#
|
||||
#....#.....#.#......#..##.##...
|
||||
#.##.#.#....#..#.#...#.#...#..#
|
||||
#....#..#...........#.......#..
|
||||
...#.####.....#.........###.##.
|
||||
......#..#.....#..........#..#.
|
||||
#...#.#..####...#...#.#.##...##
|
||||
.##.........#......#.#.#.......
|
||||
.......##...##.##....###...##..
|
||||
...#..#....#..#.#.#.....#.#....
|
||||
#....#.#.#.......##..###..##...
|
||||
......#............#.#...#..#..
|
||||
#.#.....#......#...#.......###.
|
||||
...#.#................#...#....
|
||||
.....#......#.#..#...##.#.#...#
|
||||
#....#.#..#..#..##..#.##..#....
|
||||
#.................#..#....#....
|
||||
..#....#.......####....###.....
|
||||
.#..#.#.#...###..#...#..###....
|
||||
..#..#.#......#.###..........#.
|
||||
.....#......#.......##....##.#.
|
||||
.#....#........#.#.##.#........
|
||||
#.#..##..#..#.#...####....##...
|
||||
...#....#.#..#...#..........#..
|
||||
.#.....#.##....#...##..........
|
||||
....##....#.....#.....#...#.###
|
||||
.#...##.#.#..##..#...#.#..#..#.
|
||||
..#.......#.##.....#.#........#
|
||||
...#...#.....##..#.#.#....#....
|
||||
...#.....#.......##.........#.#
|
||||
.##.....#..#.#...#.#...#.#...#.
|
||||
...........#...#.###..#...#..#.
|
||||
#.##........#..###.##...####...
|
||||
.#.....#.#...##...#..#..#...##.
|
||||
..#....#..#...#.....#.....##...
|
||||
..###..#.#.....##........#.##..
|
||||
.#.#..##........#.##....#..#.##
|
||||
.####.#..##..#.#..#....##....#.
|
||||
.##....##...#.#........#.......
|
||||
....#..#..#...#..#..#..#.#.....
|
||||
...#......................#....
|
||||
#.....#.#....#..#..#.#..#....#.
|
||||
##.....#.....##..........###...
|
||||
.#..#..............#...##.#.#.#
|
||||
...#...#.#.............#.#..#.#
|
||||
..#.....#.......#......#.#.....
|
||||
.###.#..#..#..#.#..#.....#.....
|
||||
.....##..##...##.......#....###
|
||||
.#........###...##..#....##....
|
||||
#....#.#......##..#....#.##..#.
|
||||
#....#.#...#........##...###...
|
||||
.#.....#...#.###....#.##.#.####
|
||||
###......#....#...#....##..#..#
|
||||
##....#..###......#...#.#.#....
|
||||
..........#......##.#..#.......
|
||||
.#..#......###.........##...#..
|
||||
....#......#....#.........#.#.#
|
||||
##.#.#...#.#...#...#..#......#.
|
||||
....#.##.........#..#.....##.#.
|
||||
........#...#..#.#.#.#.....##..
|
||||
..#......#.#.#..#.....##.......
|
||||
..............#....#....##.#..#
|
||||
....#.#.....#....#.#.###.#....#
|
||||
..#..........#..#......#.##..#.
|
||||
...#...#.#.............#..#....
|
||||
#.......#..#..##.........##..#.
|
||||
..##..#............#.....#.....
|
||||
....#.#..##...#.#..#.........#.
|
||||
........#.......#.##....#....#.
|
||||
...#.....#.#.....#.#....#......
|
||||
..#......##.#.............#.#.#
|
||||
#.#.............#.#.....#......
|
||||
.##....##.#.....#....#...##....
|
||||
.#.#....##....#.....##.........
|
||||
...#.....#.....#.....#..#.###..
|
||||
.......#....#...##.#...#...#..#
|
||||
..#.#.......#...###.#...#....#.
|
||||
.....###..##....###.#.##.......
|
||||
....#..................##.#.##.
|
||||
.#.......###.##...#.#.....#....
|
||||
....#....##...##.....#.#...#..#
|
||||
#..#.....#......##...#....#....
|
||||
#..##.........#.....#...#......
|
||||
...#..##.......##......#..#####
|
||||
.#..###.###.#.##........#......
|
||||
.#...#....#....#.#....#...##...
|
||||
##........#....#.........##..#.
|
||||
.#.....##............#.#.......
|
||||
....#....#...........###.....##
|
||||
.#......#.#.#..#....#.#.....##.
|
||||
......#.##.#..##....#.#.#..#...
|
||||
#....#......#...#..####........
|
||||
......#..#..##..#.......#.#..#.
|
||||
##....##.###.#...#.##.#..#.###.
|
||||
.#.........#...##...#.#......#.
|
||||
..#.#...........####.#....##.##
|
||||
.....#.#..##.#...###...#..#.#..
|
||||
...#..#..##.#...#.....#.##...##
|
||||
..##......##..........#..###...
|
||||
.#......##.....#.##....#.#.##.#
|
||||
...#.......##..##.....#....#...
|
||||
.##...#...#....#..#............
|
||||
#..#....#...........#..........
|
||||
......#...#.#.......#...#.##..#
|
||||
..#.###..#.....#.....#..#.....#
|
||||
....#....#..........##....#..#.
|
||||
.......##.#.#.#......#....#...#
|
||||
####..#.###........#..#......#.
|
||||
#........##.#.#.#.............#
|
||||
.#......#......#..#.##.....#...
|
||||
.....##.##......##.#.....#.#.#.
|
||||
.......##.#.....##.......#.#.#.
|
||||
.#.#..#.#..#.##...#.#....#.#..#
|
||||
.#..##....#..#...##.......#..#.
|
||||
.#.#..#.......#................
|
||||
#........#.#.#......#.#.#.#....
|
||||
##......#...#..##.#...##.##....
|
||||
##.#..#...........##...#..###..
|
||||
......#.####...#........#.#.#..
|
||||
...#........##..###.#.#...#...#
|
||||
.#.....##..#......##......###..
|
||||
..#.#...#......#..#..##.#.....#
|
||||
#....#..#.#..........#...#.....
|
||||
.#......#.##..###..#.#....#..##
|
||||
.......#.......#..#..#......#..
|
||||
..##.....##.#..#..#.....##.....
|
||||
........#.##...#.#.#..#..#..#..
|
||||
...#.######.........#.....#..##
|
||||
.#.#............#....#.........
|
||||
#...#....###.#......#.#........
|
||||
#.........#....#...##..........
|
||||
....#...........#.###.#...###..
|
||||
.........#........#.#.#..#...#.
|
||||
.#.......#.#.....#.#.....#.##..
|
||||
.....#.......#.....#.#.#.......
|
||||
#.##..#..##.......#...#......#.
|
||||
.###.....##...##.#...##.##.#.#.
|
||||
...#......##..##............#.#
|
||||
...#......................#..##
|
||||
#..#..#................#...#...
|
||||
#..#....#.#.#...##.......#..#..
|
||||
....#.#..###.##...#..#.###..#..
|
||||
..#...#....####.#............#.
|
||||
......#....#.#...#.#.#.........
|
||||
#...#........#.....##..###.#..#
|
||||
#....#...#...##...#..#....##...
|
||||
#..#...#..#.......#.#..##.#..#.
|
||||
#.#..........#...........##....
|
||||
.#...###...#......#.......#.#.#
|
||||
.........#.........#...#...##..
|
||||
##.#..###......##..#.....#..#..
|
||||
....##...............#.....#...
|
||||
.....#.....###.#.....#.#.......
|
||||
....#..#......###..#..##..#....
|
||||
......................#.....#..
|
||||
..#..#...##....##....#........#
|
||||
..#....#...#...#.......#.....#.
|
||||
...##.#.#.##......#.#.#.#.####.
|
||||
.###...#..#......#.#..#........
|
||||
#..#...##.#..#..##..##....#...#
|
||||
...#...#..#..#..#........#..##.
|
||||
.##....#.##.#....#...#.#.#....#
|
||||
#..#....#..#....#.......##..#.#
|
||||
...#.#....####...........#...#.
|
||||
#...#####...#.#..#......#...#.#
|
||||
.##....#.#.#..#......#..##.....
|
||||
..........#..#.#.#.....##......
|
||||
.....#....#..................#.
|
||||
.........#...#...#....#..###...
|
||||
.#.#.#....#....................
|
||||
......##............##.###..#..
|
||||
#.#...#........####.##..#.#.##.
|
||||
#........#.#.#.#..#.##.....#...
|
||||
......####..#.##.......#....#..
|
||||
.........#...#...#.....#.......
|
||||
..##.....#...#...#.....##.....#
|
||||
....#...##....#.....#..#..##.##
|
||||
..#.........##...##..###..#....
|
||||
#....#.#.........##.###.#...##.
|
||||
.##...#....#..#..#.#....##.....
|
||||
##..#..#..#...........#.##....#
|
||||
....#..........#...#..#.....#..
|
||||
........###..#..#.#.#.....##...
|
||||
#...#...#..###............###..
|
||||
..#.....#.#.#..#..#.#..#......#
|
||||
..#...##..#....#...#......#....
|
||||
#....#........##.....#..##....#
|
||||
#.....#.#.#..#.......##.#.#.##.
|
||||
..##...#...#.....#..........#..
|
||||
##.....#....#......#..........#
|
||||
......#..#..........#.#..####..
|
||||
......#...#............##...##.
|
||||
..#.......##.......#...###.###.
|
||||
.#..#.#.#...#..##.#......#.#...
|
||||
.##.....##.#.#...#.##.........#
|
||||
#.#.######...........#.#####.#.
|
||||
........#.##...##....##.#.##.#.
|
||||
....#......#.....#.....###...##
|
||||
#..............#.#....#.#....#.
|
||||
....#..###.#.........##.#.#....
|
||||
..#.#.#..##....####..........#.
|
||||
...#..#.......#................
|
||||
...#....#..............#....#..
|
||||
.....#...#...#....#.#.#..#...#.
|
||||
......##.............###.##..##
|
||||
.#...#.#..#......#..#.##.......
|
||||
##.....#.....#.##...#....#.....
|
||||
..#..#.#.#.#.#..........#..###.
|
||||
##..........#........#....#.#..
|
||||
.....#...#........#.#..###....#
|
||||
.###.#........#.##......#.#...#
|
||||
#...##....#....#....##.#.#.....
|
||||
.....#.#............#..........
|
||||
..#.##....................#....
|
||||
.....#..#..#.#..#.##.......#...
|
||||
.....###......#......##......##
|
||||
#.....#.#.......##.......#...#.
|
||||
.#.#...#......#..###...#.....#.
|
||||
#.#..#...#..##.....#...#.#..#..
|
||||
.....#.#..........#..#.........
|
||||
.###..##..##.....#...#...#..##.
|
||||
#...#.#....#.......##..#.......
|
||||
###...#.#.#..#.......#......#..
|
||||
....##........#..........##....
|
||||
............#....#...........#.
|
||||
#..#.#....##..#.#..#......##...
|
||||
.###....##...#....##..........#
|
||||
.###........#........###.....#.
|
||||
...#...#.#......#...#....#.....
|
||||
.###.......#.........#.........
|
||||
....##.#......#...###......##.#
|
||||
.###...#..##.....##.......#....
|
||||
.#.#...#..#.##....#........#...
|
11
2020/day3/sample.txt
Normal file
11
2020/day3/sample.txt
Normal file
@ -0,0 +1,11 @@
|
||||
..##.......
|
||||
#...#...#..
|
||||
.#....#..#.
|
||||
..#.#...#.#
|
||||
.#...##..#.
|
||||
..#.##.....
|
||||
.#.#.#....#
|
||||
.#........#
|
||||
#.##...#...
|
||||
#...##....#
|
||||
.#..#...#.#
|
161
2020/day3/solution.s
Normal file
161
2020/day3/solution.s
Normal file
@ -0,0 +1,161 @@
|
||||
.global _start
|
||||
_start:
|
||||
mova stack_top,r0
|
||||
mov r0,r15
|
||||
|
||||
_input:
|
||||
mov.l start,r8
|
||||
mov.l size,r9
|
||||
|
||||
/* returns stride in r1 */
|
||||
mova _calculate_stride,r0
|
||||
jsr @r0
|
||||
mov r8,r1
|
||||
|
||||
mov r1,r10 /* r10: stride */
|
||||
|
||||
/* part 1 */
|
||||
mov #3,r13 /* right 3 */
|
||||
mov #1,r14 /* down 1 */
|
||||
|
||||
mova _solve,r0
|
||||
jsr @r0
|
||||
nop
|
||||
|
||||
ldc r7,gbr /* part1 answer */
|
||||
|
||||
/* part 2 */
|
||||
mova part2_data,r0
|
||||
mov r0,r4 /* r4: part2 data start */
|
||||
mov #10,r3
|
||||
add r4,r3 /* r3: part2 data end */
|
||||
|
||||
mov #1,r6 /* r6: tree multiplier */
|
||||
|
||||
part2_loop:
|
||||
mov.b @r4+,r13 /* right */
|
||||
mov.b @r4+,r14 /* down */
|
||||
|
||||
mova _solve,r0
|
||||
jsr @r0
|
||||
nop
|
||||
|
||||
dmulu.l r7,r6
|
||||
cmp/eq r4,r3
|
||||
bf/s part2_loop
|
||||
sts macl,r6
|
||||
|
||||
/* part2 answer : mach,macl */
|
||||
|
||||
trapa #0
|
||||
|
||||
/* right, down */
|
||||
.balign 4
|
||||
part2_data:
|
||||
.byte 1, 1
|
||||
.byte 3, 1
|
||||
.byte 5, 1
|
||||
.byte 7, 1
|
||||
.byte 1, 2
|
||||
|
||||
/* r7: number of trees (in/out) */
|
||||
.balign 4
|
||||
_solve:
|
||||
/* initial state */
|
||||
mov #0,r7 /* number of trees encountered */
|
||||
mov #0,r11 /* position X */
|
||||
mov #0,r12 /* position Y */
|
||||
solve_loop:
|
||||
/* return value in r1 */
|
||||
sts.l pr,@-r15
|
||||
mova _slope_step,r0
|
||||
jsr @r0
|
||||
nop
|
||||
lds.l @r15+,pr
|
||||
|
||||
cmp/pz r1 /* r1 ≥ 0 */
|
||||
bf solve_end /* this is the end */
|
||||
bra solve_loop
|
||||
add r1,r7 /* increment tree count */
|
||||
|
||||
solve_end:
|
||||
rts
|
||||
nop
|
||||
|
||||
.balign 4
|
||||
_slope_step:
|
||||
/* r11: position X */
|
||||
/* r12: position Y */
|
||||
/* r13: right N */
|
||||
/* r14: down N */
|
||||
/* r8 : start */
|
||||
/* r9 : size */
|
||||
/* r10: stride */
|
||||
/* return r1 : tree encountered (-1,0,1) */
|
||||
|
||||
add r13,r11 /* r11 + r13 → r11 (X) */
|
||||
add r14,r12 /* r12 + r14 → r12 (Y) */
|
||||
|
||||
/* Y-coordinate × stride → r5 */
|
||||
mulu.w r10,r12 /* offset */
|
||||
sts macl,r5
|
||||
|
||||
sts.l pr,@-r15
|
||||
|
||||
/* X-axis wrap-around */
|
||||
mov r11,r1
|
||||
mov r10,r0
|
||||
add #-1,r0 /* subtract 1 to remove newline */
|
||||
mov.l div32_16_ptr,r2
|
||||
jsr @r2 /* r1 ÷ r0 → r1 ; (clobbers r0,r1) */
|
||||
mov r0,r2 /* save width in r2 (not clobbered) */
|
||||
|
||||
lds.l @r15+,pr
|
||||
|
||||
/* recover the modulus with a multiplication + subtraction */
|
||||
mulu.w r2,r1
|
||||
sts macl,r1
|
||||
mov r11,r0
|
||||
sub r1,r0 /* r0 - r1 → r0
|
||||
|
||||
/* calculate offset (y_off + x_off → off) */
|
||||
add r5,r0
|
||||
/* compare r0 offset with r9 size */
|
||||
cmp/hs r9,r0 /* r0 ≥ r9 → T */
|
||||
bt end_of_slope
|
||||
|
||||
/* get tree */
|
||||
mov.b @(r0,r8),r0
|
||||
cmp/eq #0x23,r0 /* 0x23 ascii `#` */
|
||||
rts
|
||||
movt r1
|
||||
end_of_slope:
|
||||
rts
|
||||
mov #-1,r1 /* -1: end of slope */
|
||||
|
||||
.balign 4
|
||||
div32_16_ptr: .long _div32_16
|
||||
|
||||
.balign 4
|
||||
_calculate_stride:
|
||||
/* r8: const input start */
|
||||
/* r1: input start (initialized by caller) */
|
||||
/* return r1 : stride */
|
||||
loop:
|
||||
mov.b @r1+,r0
|
||||
cmp/eq #0xa,r0 /* ascii space */
|
||||
bf loop
|
||||
sub r8,r1 /* r1 - r8 → r1 */
|
||||
rts
|
||||
nop
|
||||
|
||||
.balign 4
|
||||
start: .long _binary_2020_day3_input_txt_start
|
||||
size: .long _binary_2020_day3_input_txt_size
|
||||
|
||||
.balign 4
|
||||
stack_bot:
|
||||
.rept 16
|
||||
.long 0
|
||||
.endr
|
||||
stack_top:
|
14
2020/deps.mk
14
2020/deps.mk
@ -4,8 +4,18 @@
|
||||
2020/day2/input.txt.o \
|
||||
common/parse_base10.o
|
||||
|
||||
2020/day2/solution.elf:
|
||||
2020/day2/solution.elf: $(2020_DAY2_OBJ)
|
||||
$(DEFAULT_LINK)
|
||||
|
||||
ALL_ELF += 2020/day2/solution.elf
|
||||
2020_DAY3_OBJ = \
|
||||
2020/day3/solution.o \
|
||||
2020/day3/sample.txt.o \
|
||||
2020/day3/input.txt.o \
|
||||
common/div32_16.o
|
||||
|
||||
2020/day3/solution.elf: $(2020_DAY3_OBJ)
|
||||
$(DEFAULT_LINK)
|
||||
|
||||
ALL_ELF += \
|
||||
2020/day2/solution.elf \
|
||||
2020/day3/solution.elf
|
||||
|
2
Makefile
2
Makefile
@ -61,7 +61,7 @@ endef
|
||||
clean:
|
||||
find -P \
|
||||
-regextype posix-egrep \
|
||||
-regex '.*\.(o|bin|elf|d)$$' \
|
||||
-regex '.*\.(o|bin|elf|d|map)$$' \
|
||||
-exec rm {} \;
|
||||
|
||||
.SUFFIXES:
|
||||
|
18
common/div32_16.s
Normal file
18
common/div32_16.s
Normal file
@ -0,0 +1,18 @@
|
||||
.global _div32_16
|
||||
.align 4
|
||||
_div32_16:
|
||||
/* r1 (32 bits) ÷ r0 (16 bits) */
|
||||
shll16 r0
|
||||
cmp/hs r0,r1
|
||||
bt over_div
|
||||
div0u
|
||||
.rept 16
|
||||
div1 r0,r1
|
||||
.endr
|
||||
rotcl r1
|
||||
rts
|
||||
extu.w r1,r1
|
||||
over_div:
|
||||
bra over_div
|
||||
nop
|
||||
/* r1 = quotient */
|
Loading…
x
Reference in New Issue
Block a user