about summary refs log tree commit diff stats
path: root/linux/advent2017/1a.mu
blob: 4ce92c9ddd10526f4067b6738226cea07db2aef6 (plain) (blame)
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
# Advent of code 2017, problem 1a
#   https://adventofcode.com/2017/day/1
#
# Mu solution by Sumeet Agarwal and Kartik Agaram
#   https://github.com/akkartik/mu/blob/main/linux/advent2017/1a.mu
#   https://archive.org/details/2021-06-02-akkartik-sumeet
#
# To build on Linux:
#   $ git clone https://github.com/akkartik/mu
#   $ cd mu/linux
#   $ ./translate advent2017/1a.mu            # emits a.elf
# To run on Linux:
#   Download https://adventofcode.com/2017/day/1/input
#   $ ./a.elf < input
# Type in the number returned at https://adventofcode.com/2017/day/1

fn main -> _/ebx: int {
  var input_stream: (stream byte 0x8000)
  var input_stream_addr/esi: (addr stream byte) <- address input_stream

  var sum/edi: int <- copy 0
  read-line-from-real-keyboard input_stream_addr

  var temp/eax: int <- read_digit input_stream_addr
  var first_digit/ebx: int <- copy temp
  var this_digit/edx: int <- copy temp

  {
    var done?/eax: boolean <- stream-empty? input_stream_addr
    compare done?, 1
    break-if-=

    var next_digit/eax: int <- read_digit input_stream_addr
    # hacky newline check
    compare next_digit, 0
    break-if-<

    {
      compare this_digit, next_digit
      break-if-!=
      sum <- add this_digit
    }

    this_digit <- copy next_digit
    
    loop
  }

  # the last iteration will need to compare the last number to the first
  {
    compare this_digit, first_digit
    break-if-!=
    sum <- add this_digit
  }

  print-int32-decimal 0, sum
  
  return 0/ok
}

fn read_digit input_stream_addr: (addr stream byte) -> _/eax: int {
  var next_digit/eax: byte <- read-byte input_stream_addr
  next_digit <- subtract 0x30
  var next_digit/eax: int <- copy next_digit
  return next_digit
}