about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-12-04 23:35:18 -0800
committerKartik Agaram <vc@akkartik.com>2020-12-04 23:35:18 -0800
commit68a5032ccdd26865ce189b7ccb21e4364848974f (patch)
treec42887c05764c53be00d103d694fd82092d0af48
parentd893ae58b73915057e715fc4c2d17ee991831742 (diff)
downloadmu-68a5032ccdd26865ce189b7ccb21e4364848974f.tar.gz
7334 - advent day 5 done
-rw-r--r--apps/advent2020/5b.mu81
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
+}
alt'>
4ad365fc ^
0a32b684 ^
2144cf26 ^
36e4e71e ^

4ea0f69a ^

36e4e71e ^




78a7d762 ^
36e4e71e ^

78a7d762 ^
36e4e71e ^


4ea0f69a ^

36e4e71e ^
bd088c49 ^
36e4e71e ^
0a32b684 ^
36e4e71e ^

f6ae504c ^
4ea0f69a ^

0a32b684 ^

4ea0f69a ^
0a32b684 ^
4ea0f69a ^


0a32b684 ^

4ea0f69a ^



36e4e71e ^
7582555b ^
36e4e71e ^
7582555b ^








36e4e71e ^
4ea0f69a ^


36e4e71e ^




4ea0f69a ^
e71c8103 ^

36e4e71e ^

f6ae504c ^
4ea0f69a ^
36e4e71e ^

4ea0f69a ^

36e4e71e ^






4ea0f69a ^

306c76d8 ^






b6aff4c3 ^

306c76d8 ^
4ea0f69a ^

45cf5174 ^












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