From 4e8daa6a0e3f423ef7ef6441c4ecc04c17115664 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Tue, 1 Dec 2020 01:02:12 -0800 Subject: 7314 --- html/apps/advent2020/1b.mu.html | 163 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 html/apps/advent2020/1b.mu.html (limited to 'html/apps/advent2020') diff --git a/html/apps/advent2020/1b.mu.html b/html/apps/advent2020/1b.mu.html new file mode 100644 index 00000000..69b2346d --- /dev/null +++ b/html/apps/advent2020/1b.mu.html @@ -0,0 +1,163 @@ + + + + +Mu - apps/advent2020/1b.mu + + + + + + + + + + +https://github.com/akkartik/mu/blob/master/apps/advent2020/1b.mu +
+  1 fn main -> _/ebx: int {
+  2   # data structure
+  3   var numbers-storage: (array int 0x100)  # 256 ints
+  4   var numbers/esi: (addr array int) <- address numbers-storage
+  5   var numbers-index/ecx: int <- copy 0
+  6   # phase 1: parse each line from stdin and add it to numbers
+  7   {
+  8     var line-storage: (stream byte 0x100)  # 256 bytes
+  9     var line/edx: (addr stream byte) <- address line-storage
+ 10     {
+ 11 #?       print-string 0, "== iter\n"
+ 12       # read line from stdin
+ 13       clear-stream line
+ 14       read-line-from-real-keyboard line
+ 15       # if line is empty (not even a newline), quit
+ 16       var done?/eax: boolean <- stream-empty? line
+ 17       compare done?, 0  # false
+ 18       break-if-!=
+ 19 #?       print-stream-to-real-screen line
+ 20       # convert line to int and append it to numbers
+ 21       var n/eax: int <- parse-decimal-int-from-stream line
+ 22 #?       print-int32-decimal 0, n
+ 23 #?       print-string 0, "\n"
+ 24       var dest/ebx: (addr int) <- index numbers, numbers-index
+ 25       copy-to *dest, n
+ 26       numbers-index <- increment
+ 27 #?       print-string 0, "== "
+ 28 #?       print-int32-decimal 0, numbers-index
+ 29 #?       print-string 0, "\n"
+ 30       loop
+ 31     }
+ 32   }
+ 33   # phase 2: for every pair of distinct numbers, check if the rest of the
+ 34   # array has 2020-it
+ 35   var i/edi: int <- copy 0
+ 36   {
+ 37     compare i, numbers-index
+ 38     break-if->=
+ 39     # for j from i+1 to end
+ 40     var j/edx: int <- copy i
+ 41     j <- increment
+ 42     {
+ 43       compare j, numbers-index
+ 44       break-if->=
+ 45       {
+ 46         compare i, j
+ 47         break-if-=
+ 48         var target/ebx: int <- copy 0x7e4  # 2020
+ 49         var src/edi: (addr int) <- index numbers, i
+ 50         target <- subtract *src
+ 51         var src2/ecx: (addr int) <- index numbers, j
+ 52         target <- subtract *src2
+ 53         {
+ 54           var found?/eax: boolean <- find-after numbers, j, target
+ 55           compare found?, 0  # false
+ 56           break-if-=
+ 57           print-string 0, "found\n"
+ 58           print-int32-decimal 0, *src
+ 59           print-string 0, " "
+ 60           print-int32-decimal 0, *src2
+ 61           print-string 0, " "
+ 62           print-int32-decimal 0, target
+ 63           print-string 0, "\n"
+ 64           target <- multiply *src
+ 65           target <- multiply *src2
+ 66           print-int32-decimal 0, target
+ 67           print-string 0, "\n"
+ 68           return 0  # success
+ 69         }
+ 70       }
+ 71       j <- increment
+ 72       loop
+ 73     }
+ 74     i <- increment
+ 75     loop
+ 76   }
+ 77   return 1  # not found
+ 78 }
+ 79 
+ 80 fn find-after _numbers: (addr array int), start: int, _target: int -> _/eax: boolean {
+ 81   var numbers/esi: (addr array int) <- copy _numbers
+ 82   var target/edi: int <- copy _target
+ 83   var len/ecx: int <- length numbers
+ 84   var i/eax: int <- copy start
+ 85   i <- increment
+ 86   {
+ 87     compare i, len
+ 88     break-if->=
+ 89     var src/edx: (addr int) <- index numbers, i
+ 90     # if *src == target, return true
+ 91     compare *src, target
+ 92     {
+ 93       break-if-!=
+ 94       return 1  # true
+ 95     }
+ 96     i <- increment
+ 97     loop
+ 98   }
+ 99   return 0  # false
+100 }
+
+ + + -- cgit 1.4.1-2-gfad0