From 2aebae682ac3f7e961cea2d01e00b06f8a3be3de Mon Sep 17 00:00:00 2001 From: joe1g24 <james@jamalam.tech> Date: Wed, 23 Oct 2024 11:10:30 +0100 Subject: [PATCH] Week 2 --- challenge-ii/barebones.rio | 213 +++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 challenge-ii/barebones.rio diff --git a/challenge-ii/barebones.rio b/challenge-ii/barebones.rio new file mode 100644 index 0000000..ec7368c --- /dev/null +++ b/challenge-ii/barebones.rio @@ -0,0 +1,213 @@ +fn remove_leading_whitespace(input) { + result := "" + leading := true + + for char in input { + when char { + ' ' => { + when leading { + false => { + result += char + } + } + }, + else => { + leading = false + result += char + } + } + } + + return result +} + +fn split_by(input, splitter) { + lines := [] + line := "" + + for char in input { + when char { + splitter => { + lines += line + line = "" + }, + else => { + line += char + } + } + } + + lines += line + return lines +} + +fn filter_out(input, filter) { + result := "" + + for char in input { + when char { + filter => {}, + else => { result += char } + } + } + + return result +} + +fn split(input) { + splitterated := [] + + for line in split_by(input, '\n') { + splitterated += line | remove_leading_whitespace() | filter_out(';') | split_by(' ') + } + + return splitterated +} + +fn index_of(arr, value) { + var_idx := 0 + + for v in arr { + when v { + value => { + return var_idx + } + } + + var_idx += 1 + } + + return 99999 +} + +fn parse_int(str) { + result := 0 + + for c in str { + result *= 10 + when c { + '0' => {}, + '1' => {result += 1}, + '2' => {result += 2}, + '3' => {result += 3}, + '4' => {result += 4}, + '5' => {result += 5}, + '6' => {result += 6}, + '7' => {result += 7}, + '8' => {result += 8}, + '9' => {result += 9}, + } + } + + return result +} + +fn interpret_line(line_idx, lines) { + line := lines[line_idx] + + when line[0] { + "clear" => { + variable_idx := index_of(variable_names, line[1]) + + when variable_idx { + 99999 => { + variable_values += 0 + variable_names += line[1] + }, + else => { + variable_values[variable_idx] = 0 + } + } + } + "incr" => { + variable_idx := index_of(variable_names, line[1]) + variable_values[variable_idx] = variable_values[variable_idx] + 1 + } + "decr" => { + variable_idx := index_of(variable_names, line[1]) + variable_values[variable_idx] = variable_values[variable_idx] - 1 + } + "while" => { + variable_name := line[1] + variable_idx := index_of(variable_names, variable_name) + comparison_value := parse_int(line[3]) + start_idx := line_idx + end_idx := line_idx + 1 + depth := 0 + while true { + cond_a := lines[end_idx][0] == "end" + cond_b := depth == 0 + when cond_a and cond_b { + true => { + break + } + } + + when lines[end_idx][0] { + "while" => { + depth += 1 + } + "end" => { + depth -= 1 + } + } + + end_idx += 1 + } + + while variable_values[variable_idx] != comparison_value { + idx := start_idx + 1 + + while idx < end_idx { + idx = interpret_line(idx, lines) + } + } + + return end_idx + } + "end" => {} + } + + return line_idx + 1 +} + +input := "clear X; +incr X; +incr X; +clear Y; +incr Y; +incr Y; +incr Y; +clear Z; +while X not 0 do; + clear W; + while Y not 0 do; + incr Z; + incr W; + decr Y; + end; + while W not 0 do; + incr Y; + decr W; + end; + decr X; +end;" + +variable_names := [] +variable_values := [] +lines := split(input) +lines_length := 0 +for line in lines { + lines_length += 1 +} + +line_idx := 0 +while line_idx < lines_length { + line_idx = interpret_line(line_idx, lines) +} + +variable_idx := 0 +for variable_name in variable_names { + d := print(variable_name, ": ", variable_values[variable_idx]) + variable_idx += 1 +} -- GitLab