From 9f39f627ad19dbfc22b54f85033ce1f595f3582c Mon Sep 17 00:00:00 2001 From: Toni Date: Thu, 18 Dec 2025 14:04:44 +0100 Subject: [PATCH] advent of code day 1 --- README.md | 2 +- examples/guess_number.zr | 2 +- examples/puzzles/aoc2025_01.zr | 53 +++++++++++++++++++++++++++++++ examples/{ => puzzles}/euler1.zr | 0 examples/{ => puzzles}/euler10.zr | 0 examples/{ => puzzles}/euler12.zr | 0 examples/{ => puzzles}/euler13.zr | 0 examples/{ => puzzles}/euler14.zr | 0 examples/{ => puzzles}/euler15.zr | 0 examples/{ => puzzles}/euler2.zr | 0 examples/{ => puzzles}/euler3.zr | 0 examples/{ => puzzles}/euler4.zr | 0 examples/{ => puzzles}/euler5.zr | 0 examples/{ => puzzles}/euler6.zr | 0 examples/{ => puzzles}/euler7.zr | 0 examples/{ => puzzles}/euler8.zr | 0 examples/{ => puzzles}/euler9.zr | 0 examples/sqlite_todo.zr | 51 +++++++++++++++++++++++++---- src/analyzer.rs | 2 +- src/codegen_x86_64.rs | 13 +++++--- src/std.zr | 10 +++--- 21 files changed, 114 insertions(+), 19 deletions(-) create mode 100644 examples/puzzles/aoc2025_01.zr rename examples/{ => puzzles}/euler1.zr (100%) rename examples/{ => puzzles}/euler10.zr (100%) rename examples/{ => puzzles}/euler12.zr (100%) rename examples/{ => puzzles}/euler13.zr (100%) rename examples/{ => puzzles}/euler14.zr (100%) rename examples/{ => puzzles}/euler15.zr (100%) rename examples/{ => puzzles}/euler2.zr (100%) rename examples/{ => puzzles}/euler3.zr (100%) rename examples/{ => puzzles}/euler4.zr (100%) rename examples/{ => puzzles}/euler5.zr (100%) rename examples/{ => puzzles}/euler6.zr (100%) rename examples/{ => puzzles}/euler7.zr (100%) rename examples/{ => puzzles}/euler8.zr (100%) rename examples/{ => puzzles}/euler9.zr (100%) diff --git a/README.md b/README.md index f624b78..5166fb0 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ func main[] : I64 while true io.println("Guess a number: ") - let guess: I64 = io.read_stdin() |> str.trim() |> str.parse_i64() + let guess: I64 = io.read_line() |> str.trim() |> str.parse_i64() if guess == answer io.println("You win!") diff --git a/examples/guess_number.zr b/examples/guess_number.zr index bfbf03f..8d4d071 100644 --- a/examples/guess_number.zr +++ b/examples/guess_number.zr @@ -3,7 +3,7 @@ func main[] : I64 while true io.println("Guess a number: ") - let guess: I64 = io.read_stdin() |> str.trim() |> str.parse_i64() + let guess: I64 = io.read_line() |> str.trim() |> str.parse_i64() if guess == answer io.println("You win!") diff --git a/examples/puzzles/aoc2025_01.zr b/examples/puzzles/aoc2025_01.zr new file mode 100644 index 0000000..799d0d1 --- /dev/null +++ b/examples/puzzles/aoc2025_01.zr @@ -0,0 +1,53 @@ +func part1[lines: Array] : Void + let password: I64 = 0 + let dial: I64 = 50 + + for i in 0..array.size(lines) + let line: String = array.nth(lines, i) + let dir: U8 = line[0] + let n: I64 = str.substr(line, 1, str.len(line) - 1) |> str.parse_i64() + + if dir == 'L' + dial = dial - n + while dial < 0 + dial = 100 + dial + else + dial = dial + n + while dial >= 100 + dial = dial - 100 + + if dial == 0 + password = password + 1 + + io.println_i64(password) + +func part2[lines: Array] : Void + let password: I64 = 0 + let dial: I64 = 50 + + for i in 0..array.size(lines) + let line: String = array.nth(lines, i) + let dir: U8 = line[0] + let n: I64 = str.substr(line, 1, str.len(line) - 1) |> str.parse_i64() + + if dir == 'L' + for i in 0..n + dial = dial - 1 + if dial == 0 + password = password + 1 + if dial == -1 + dial = 99 + else + for i in 0..n + dial = dial + 1 + if dial == 100 + dial = 0 + password = password + 1 + + io.println_i64(password) + +func main[] : I64 + let lines: Array = io.read_file("input.txt") |> str.split("\n") + + part1(lines) + part2(lines) \ No newline at end of file diff --git a/examples/euler1.zr b/examples/puzzles/euler1.zr similarity index 100% rename from examples/euler1.zr rename to examples/puzzles/euler1.zr diff --git a/examples/euler10.zr b/examples/puzzles/euler10.zr similarity index 100% rename from examples/euler10.zr rename to examples/puzzles/euler10.zr diff --git a/examples/euler12.zr b/examples/puzzles/euler12.zr similarity index 100% rename from examples/euler12.zr rename to examples/puzzles/euler12.zr diff --git a/examples/euler13.zr b/examples/puzzles/euler13.zr similarity index 100% rename from examples/euler13.zr rename to examples/puzzles/euler13.zr diff --git a/examples/euler14.zr b/examples/puzzles/euler14.zr similarity index 100% rename from examples/euler14.zr rename to examples/puzzles/euler14.zr diff --git a/examples/euler15.zr b/examples/puzzles/euler15.zr similarity index 100% rename from examples/euler15.zr rename to examples/puzzles/euler15.zr diff --git a/examples/euler2.zr b/examples/puzzles/euler2.zr similarity index 100% rename from examples/euler2.zr rename to examples/puzzles/euler2.zr diff --git a/examples/euler3.zr b/examples/puzzles/euler3.zr similarity index 100% rename from examples/euler3.zr rename to examples/puzzles/euler3.zr diff --git a/examples/euler4.zr b/examples/puzzles/euler4.zr similarity index 100% rename from examples/euler4.zr rename to examples/puzzles/euler4.zr diff --git a/examples/euler5.zr b/examples/puzzles/euler5.zr similarity index 100% rename from examples/euler5.zr rename to examples/puzzles/euler5.zr diff --git a/examples/euler6.zr b/examples/puzzles/euler6.zr similarity index 100% rename from examples/euler6.zr rename to examples/puzzles/euler6.zr diff --git a/examples/euler7.zr b/examples/puzzles/euler7.zr similarity index 100% rename from examples/euler7.zr rename to examples/puzzles/euler7.zr diff --git a/examples/euler8.zr b/examples/puzzles/euler8.zr similarity index 100% rename from examples/euler8.zr rename to examples/puzzles/euler8.zr diff --git a/examples/euler9.zr b/examples/puzzles/euler9.zr similarity index 100% rename from examples/euler9.zr rename to examples/puzzles/euler9.zr diff --git a/examples/sqlite_todo.zr b/examples/sqlite_todo.zr index b109d4b..1ab6976 100644 --- a/examples/sqlite_todo.zr +++ b/examples/sqlite_todo.zr @@ -2,9 +2,12 @@ extern sqlite3_open extern sqlite3_exec extern sqlite3_prepare_v2 +extern sqlite3_bind_int extern sqlite3_bind_text extern sqlite3_step extern sqlite3_errmsg +extern sqlite3_column_int +extern sqlite3_column_text extern sqlite3_finalize func main[] : I64 @@ -20,13 +23,49 @@ func main[] : I64 if rc dbg.panic(sqlite3_errmsg(mem.read64(db))) - sqlite3_prepare_v2(mem.read64(db), "INSERT INTO todo(task) VALUES(?);", -1, stmt, 0) + while true + io.println("1. List tasks") + io.println("2. Add task") + io.println("3. Delete task") + io.println("0. Quit") + io.print("\n> ") - sqlite3_bind_text(mem.read64(stmt), 1, "World domination", -1, 0) + let choice: I64 = io.read_line() |> str.parse_i64() - if sqlite3_step(mem.read64(stmt)) != 101 - dbg.panic(sqlite3_errmsg(mem.read64(db))) - - io.println("Task added!") + if choice == 0 + break + else if choice == 1 + io.println("============") + sqlite3_prepare_v2(mem.read64(db), "SELECT * FROM todo", -1, stmt, 0) + + while sqlite3_step(mem.read64(stmt)) == 100 + let id: I64 = sqlite3_column_int(mem.read64(stmt), 0) + let task: String = sqlite3_column_text(mem.read64(stmt), 1) + + io.print_i64(id) + io.print(" - ") + io.println(task) + + io.println("============") + else if choice == 2 + io.print("\nEnter new task: ") + let task: String = io.read_line() |> str.trim() + + sqlite3_prepare_v2(mem.read64(db), "INSERT INTO todo(task) VALUES (?);", -1, stmt, 0) + sqlite3_bind_text(mem.read64(stmt), 1, task, -1, 0) + if sqlite3_step(mem.read64(stmt)) != 101 + dbg.panic(sqlite3_errmsg(mem.read64(db))) + + io.println("\nTask added\n") + else if choice == 3 + io.print("\nEnter task id: ") + let id: I64 = io.read_line() |> str.parse_i64() + + sqlite3_prepare_v2(mem.read64(db), "DELETE FROM todo WHERE id = ?;", -1, stmt, 0) + sqlite3_bind_int(mem.read64(stmt), 1, id, -1, 0) + if sqlite3_step(mem.read64(stmt)) != 101 + dbg.panic(sqlite3_errmsg(mem.read64(db))) + + io.println("\nTask deleted\n") sqlite3_finalize(mem.read64(stmt)) diff --git a/src/analyzer.rs b/src/analyzer.rs index bca64db..7dbed93 100644 --- a/src/analyzer.rs +++ b/src/analyzer.rs @@ -125,7 +125,7 @@ impl Analyzer { ); } } else { - // TODO: cant error here since we dont analyze externs/builtins + // TODO: cant error here since we dont analyze externs/builtins YET } for arg in args { diff --git a/src/codegen_x86_64.rs b/src/codegen_x86_64.rs index 7e2848a..127437a 100644 --- a/src/codegen_x86_64.rs +++ b/src/codegen_x86_64.rs @@ -254,11 +254,14 @@ _builtin_environ: self.compile_stmt(env, *body)?; - // fallback to returning null - emit!(&mut self.output, " mov rax, 0"); - emit!(&mut self.output, " mov rsp, rbp"); - emit!(&mut self.output, " pop rbp"); - emit!(&mut self.output, " ret"); + // fallback to null + // very hacky but works + if !self.output.trim_end().ends_with(" ret") { + emit!(&mut self.output, " mov rax, 0"); + emit!(&mut self.output, " mov rsp, rbp"); + emit!(&mut self.output, " pop rbp"); + emit!(&mut self.output, " ret"); + } } Stmt::Return(expr) => { self.compile_expr(env, expr)?; diff --git a/src/std.zr b/src/std.zr index 0d4a898..9915e2e 100644 --- a/src/std.zr +++ b/src/std.zr @@ -65,7 +65,7 @@ func io.read_char[] : U8 mem.free(s) return c -func io.read_stdin[]: String +func io.read_line[]: String let buffer: String = mem.alloc(1025) let n: I64 = _builtin_syscall(0, 0, buffer, 1024) if n < 0 @@ -74,7 +74,7 @@ func io.read_stdin[]: String return buffer func io.read_file[path: String]: String - let fd: I64 = _builtin_syscall(2, path, 0, 0) // open + let fd: I64 = _builtin_syscall(257, -100, path, 0, 0) // openat if fd <= 0 dbg.panic("failed to open file") @@ -88,7 +88,7 @@ func io.read_file[path: String]: String return buffer func io.write_file[path: String, content: String] : Void - let fd: Ptr = _builtin_syscall(2, path, 0x241, 0o644) // open + let fd: Ptr = _builtin_syscall(257, -100, path, 0x241, 0o644) // openat if fd < 0 dbg.panic("failed to open file") @@ -415,7 +415,7 @@ func os.exit[code: I64] : Void func os.urandom[]: I64 let buffer: Ptr = mem.alloc(8) - let fd: I64 = _builtin_syscall(2, "/dev/urandom", 0, 0) // open + let fd: I64 = _builtin_syscall(257, -100, "/dev/urandom", 0, 0) // openat _builtin_syscall(0, fd, buffer, 8) // read _builtin_syscall(3, fd) // close let n: I64 = mem.read64(buffer) @@ -452,7 +452,7 @@ func os.shell[command: String] : I64 return -(st & 0x7f) func os.listdir[path: String] : Array - let fd: I64 = _builtin_syscall(2, path, 0, 0) // open + let fd: I64 = _builtin_syscall(257, -100, path, 0, 0) // openat if fd < 0 return []