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