diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-12-04 23:35:18 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-12-04 23:35:18 -0800 |
commit | 68a5032ccdd26865ce189b7ccb21e4364848974f (patch) | |
tree | c42887c05764c53be00d103d694fd82092d0af48 | |
parent | d893ae58b73915057e715fc4c2d17ee991831742 (diff) | |
download | mu-68a5032ccdd26865ce189b7ccb21e4364848974f.tar.gz |
7334 - advent day 5 done
-rw-r--r-- | apps/advent2020/5b.mu | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/apps/advent2020/5b.mu b/apps/advent2020/5b.mu new file mode 100644 index 00000000..215b0a66 --- /dev/null +++ b/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_mu 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 +} |