diff options
Diffstat (limited to 'linux/apps/advent2020/5b.mu')
-rw-r--r-- | linux/apps/advent2020/5b.mu | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/linux/apps/advent2020/5b.mu b/linux/apps/advent2020/5b.mu new file mode 100644 index 00000000..197ea885 --- /dev/null +++ b/linux/apps/advent2020/5b.mu @@ -0,0 +1,81 @@ +# https://adventofcode.com/2020/day/5 +# +# To run (on Linux): +# $ git clone https://github.com/akkartik/mu +# $ cd mu +# $ ./translate apps/advent2020/5b.mu +# $ ./a.elf < input +# +# You'll need to register to download the 'input' file for yourself. + +fn main -> _/ebx: int { + var pass-storage: (array int 0x400) # 1k ints + var pass/esi: (addr array int) <- address pass-storage + # phase 1: populate pass array + var line-storage: (stream byte 0x10) # 16 bytes is enough + var line/edx: (addr stream byte) <- address line-storage + { + # read line from stdin + clear-stream line + read-line-from-real-keyboard line + # if line is empty (not even a newline), quit + var done?/eax: boolean <- stream-empty? line + compare done?, 0/false + break-if-!= + # process line + var seat-id/eax: int <- convert-from-binary line + var dest/eax: (addr int) <- index pass, seat-id + copy-to *dest, 1 + loop + } + # phase 2: skip empty seats + var i/eax: int <- copy 0 + { + compare i, 0x400 + break-if->= + var src/ecx: (addr int) <- index pass, i + compare *src, 0 + break-if-!= + i <- increment + loop + } + # phase 3: skip non-empty seats + { + compare i, 0x400 + break-if->= + var src/ecx: (addr int) <- index pass, i + compare *src, 0 + break-if-= + i <- increment + loop + } + print-int32-decimal 0, i + print-string 0, "\n" + return 0 +} + +fn convert-from-binary in: (addr stream byte) -> _/eax: int { + var result/edi: int <- copy 0 + var i/ecx: int <- copy 9 # loop counter and also exponent + { + compare i, 0 + break-if-< + var c/eax: byte <- read-byte in + var bit/edx: int <- copy 0 + { + compare c, 0x42/B + break-if-!= + bit <- copy 1 + } + { + compare c, 0x52/R + break-if-!= + bit <- copy 1 + } + var bit-value/eax: int <- repeated-shift-left bit, i + result <- add bit-value + i <- decrement + loop + } + return result +} |