From e25a81dc12f8071a3fa8aeb294c9823e8d8e1985 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Thu, 10 Apr 2025 19:06:03 +0300 Subject: [PATCH 01/22] Fix syntax of powint.dana Use"=" instead of "==" for equality and moved "var temp is int" declaration to the beginning of the block. The program still contains a semantic error so I copied it to the dana/programs-erroneous directory. --- dana/programs-erroneous/powint-erroneous.dana | 30 +++++++++++++++++++ dana/programs/powint.dana | 9 +++--- 2 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 dana/programs-erroneous/powint-erroneous.dana diff --git a/dana/programs-erroneous/powint-erroneous.dana b/dana/programs-erroneous/powint-erroneous.dana new file mode 100644 index 0000000..475718c --- /dev/null +++ b/dana/programs-erroneous/powint-erroneous.dana @@ -0,0 +1,30 @@ +def main + + def powint: base as int, exp as int, mod as int, result as ref int + + base := base % mod + var temp is int + + if exp < 1: + result := 1 + else: + if exp % 2 = 0: + powint: base, exp / 2, mod, temp # SEMANTIC ERROR: temp is not a ref variable but being passed to a ref parameter + result := (temp * temp) % mod + else: + powint: base, exp - 1, mod, temp # SEMANTIC ERROR: temp is not a ref variable but being passed to a ref parameter + result := (base * temp) % mod + + var b is int + var e is int + var m is int + var res is int + + b := readInteger() + e := readInteger() + m := readInteger() + + powint: b, e, m, res + + writeInteger: res + writeString: "\n" diff --git a/dana/programs/powint.dana b/dana/programs/powint.dana index b3631be..475718c 100644 --- a/dana/programs/powint.dana +++ b/dana/programs/powint.dana @@ -3,17 +3,16 @@ def main def powint: base as int, exp as int, mod as int, result as ref int base := base % mod + var temp is int if exp < 1: result := 1 else: - if exp % 2 == 0: - var temp is int - powint: base, exp / 2, mod, temp + if exp % 2 = 0: + powint: base, exp / 2, mod, temp # SEMANTIC ERROR: temp is not a ref variable but being passed to a ref parameter result := (temp * temp) % mod else: - var temp is int - powint: base, exp - 1, mod, temp + powint: base, exp - 1, mod, temp # SEMANTIC ERROR: temp is not a ref variable but being passed to a ref parameter result := (base * temp) % mod var b is int From c85f61ababbd9182bfd64a6eee1490b098da1a95 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Wed, 16 Apr 2025 05:26:09 +0300 Subject: [PATCH 02/22] Fix syntax in binarysearch program Adjusted the bAdded a missing comma in a procedure call, changed function calls to use () instead of :, specifed a fixed size for the local array variable declaration, and corrected the assignment operator from "=" to ":=". --- dana/programs/binarysearch.dana | 10 +++++----- dana/programs/powint.dana | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dana/programs/binarysearch.dana b/dana/programs/binarysearch.dana index 146f3a8..5d8b013 100644 --- a/dana/programs/binarysearch.dana +++ b/dana/programs/binarysearch.dana @@ -11,13 +11,13 @@ def main i := i + 1 swap: arr[i], arr[j] j := j + 1 - swap: arr[i+1] arr[high] + swap: arr[i+1], arr[high] return: (i+1) def quicksort: arr as int [], low high as int var pi is int if low < high: - pi := (partition: arr, low, high) + pi := partition(arr, low, high) quicksort: arr, low, (pi - 1) quicksort: arr, (pi + 1), high @@ -40,7 +40,7 @@ def main high := mid - 1 return: -1 - var nums is int [] + var nums is int [100] var size k find is int k := 0 writeString: "Give size of array: " @@ -50,7 +50,7 @@ def main loop: if k <= size: nums[k] := readInteger() - k = k + 1 + k := k + 1 else: nums[k] := '\0' break @@ -62,4 +62,4 @@ def main find := readInteger() writeString: "\n" writeString: "Value is: " - writeInteger: (binarySearch: nums, 0, (size - 1), find) + writeInteger: (binarySearch( nums, 0, (size - 1), find)) diff --git a/dana/programs/powint.dana b/dana/programs/powint.dana index 475718c..7e6b6d2 100644 --- a/dana/programs/powint.dana +++ b/dana/programs/powint.dana @@ -9,10 +9,10 @@ def main result := 1 else: if exp % 2 = 0: - powint: base, exp / 2, mod, temp # SEMANTIC ERROR: temp is not a ref variable but being passed to a ref parameter + powint: base, exp / 2, mod, temp result := (temp * temp) % mod else: - powint: base, exp - 1, mod, temp # SEMANTIC ERROR: temp is not a ref variable but being passed to a ref parameter + powint: base, exp - 1, mod, temp result := (base * temp) % mod var b is int From 1428f98881fb8844165ab0cc50219bd64d601a8b Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Wed, 16 Apr 2025 20:45:38 +0300 Subject: [PATCH 03/22] Fix powint-erroneous.dana Add actual semantic error in powint-erroneous.dana and highlighted it with a comment. --- dana/programs-erroneous/powint-erroneous.dana | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/dana/programs-erroneous/powint-erroneous.dana b/dana/programs-erroneous/powint-erroneous.dana index 475718c..02530a6 100644 --- a/dana/programs-erroneous/powint-erroneous.dana +++ b/dana/programs-erroneous/powint-erroneous.dana @@ -1,30 +1,37 @@ def main def powint: base as int, exp as int, mod as int, result as ref int - - base := base % mod + var temp is int if exp < 1: result := 1 + elif exp = 0: + result := 1 else: - if exp % 2 = 0: - powint: base, exp / 2, mod, temp # SEMANTIC ERROR: temp is not a ref variable but being passed to a ref parameter - result := (temp * temp) % mod - else: - powint: base, exp - 1, mod, temp # SEMANTIC ERROR: temp is not a ref variable but being passed to a ref parameter - result := (base * temp) % mod + powint: base, exp / 2, mod, temp + + if exp % 2 = 0: + result := (temp * temp) % mod + else: + result := (base * temp * temp) % mod + + writeString: temp # SEMANTIC ERROR: Calling writeString (expects byte[]) with an int argument (temp) var b is int var e is int var m is int var res is int + writeString: "Enter base: " b := readInteger() + writeString: "Enter exponent: " e := readInteger() + writeString: "Enter modulus: " m := readInteger() powint: b, e, m, res + writeString: "Result: " writeInteger: res writeString: "\n" From 464662dfd80398349643a8faec022bca414ac589 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Sat, 19 Apr 2025 22:07:45 +0300 Subject: [PATCH 04/22] Fix syntax of calculator.dana Fixed various lexical and syntax errors found in the program. --- dana/programs/calculator.dana | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/dana/programs/calculator.dana b/dana/programs/calculator.dana index 2ba3c6d..a1bcb74 100644 --- a/dana/programs/calculator.dana +++ b/dana/programs/calculator.dana @@ -9,7 +9,7 @@ def main if c = '+' or c = '-' or c = '*' or c = '/': return: true else: - return false + return: false (* Conversion from part of a string to an int @@ -44,7 +44,7 @@ def main *) var buf is byte[256] - var idx len start end a b is int + var idx len start p_end a b is int var op is byte loop lines: @@ -57,27 +57,27 @@ def main idx := 0 loop a_start: - if idx == len: + if idx = len: writeString: "Invalid\n" continue: lines elif is_number(buf[idx]): break: a_start idx := idx + 1 - start := idx; + start := idx loop a_end: - if idx == len: + if idx = len: writeString: "Invalid\n" continue: lines elif not is_number(buf[idx]): break: a_end idx := idx + 1 - end := idx; + p_end := idx - a := string_to_int(buff, start, end); + a := string_to_int(buff, start, p_end) loop op_detect: - if idx == len: + if idx = len: writeString: "Invalid\n" continue: lines elif is_operator(buf[idx]): @@ -86,21 +86,21 @@ def main op := buf[idx] loop b_start: - if idx == len: + if idx = len: writeString: "Invalid\n" continue: lines elif is_number(buf[idx]): break: b_start idx := idx + 1 - start := idx; + start := idx loop b_end: - if idx == len or not is_number(buf[idx]): + if idx = len or not is_number(buf[idx]): break: b_end idx := idx + 1 - end := idx; + p_end := idx - b := string_to_int(buff, start, end); + b := string_to_int(buff, start, p_end) # We have finished parsing now we can calculate From dfba77a6ea1dc8a673f3c0483b77990b388ad076 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Sat, 19 Apr 2025 22:35:38 +0300 Subject: [PATCH 05/22] Fix syntax of dot_produnct.dana The nested dot_product function definition was moved before the main execution statements within main. The equality comparison was changed from == to =. The begin/end keywords were removed from the bodies of main and dot_product because they contained declarations, requiring layout-based blocks instead. Finally, the call dot_product : ... was changed to dot_product(...) to use the correct function call syntax within an expression. --- dana/programs/dot_product.dana | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/dana/programs/dot_product.dana b/dana/programs/dot_product.dana index 96e789c..56e7860 100644 --- a/dana/programs/dot_product.dana +++ b/dana/programs/dot_product.dana @@ -1,18 +1,15 @@ def main -begin - def dot_product is int : n as int, vector1 as int [], vector2 as int [] - begin - var product i is int - product := 0 - i := 0 - loop: - begin - if i == n : begin break end - product := product + vector1[i]*vector2[i] - i := i + 1 - end - return : product - end + def dot_product is int : n as int, vector1 as int [], vector2 as int [] + var product i is int + product := 0 + i := 0 + loop: + begin + if i = n : begin break end + product := product + vector1[i]*vector2[i] + i := i + 1 + end + return : product var ex_vector1 ex_vector2 is int[4] @@ -27,8 +24,7 @@ begin ex_vector2[3] := 7 var result is int - result := dot_product : 4, ex_vector1, ex_vector2 + result := dot_product(4, ex_vector1, ex_vector2) writeString : "The dot product of the two vectors is: " writeInteger : result writeChar : '\n' -end From 3c13d6e98485f1b536b92ebb976b2c65fc4a5f1b Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Sat, 19 Apr 2025 22:46:09 +0300 Subject: [PATCH 06/22] Fix syntax of evenChecker.dana Use "=" instead of "==" --- dana/programs/evenChecker.dana | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dana/programs/evenChecker.dana b/dana/programs/evenChecker.dana index b3b338b..6afb1ab 100644 --- a/dana/programs/evenChecker.dana +++ b/dana/programs/evenChecker.dana @@ -1,7 +1,7 @@ def main def even: n as int, result as ref int - if n % 2 == 0: + if n % 2 = 0: result := 1 else: result := 0 @@ -15,7 +15,7 @@ def main writeInteger: n writeString: " is " - if res == 0: + if res = 0: writeString: "even!" else: writeString: "odd!" From eb00a72c57b505601852b04fa0d222b5865fcb4b Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Sat, 19 Apr 2025 22:52:48 +0300 Subject: [PATCH 07/22] Fix syntax of factorial.dana --- dana/programs/factorial.dana | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dana/programs/factorial.dana b/dana/programs/factorial.dana index 3a56104..885c321 100644 --- a/dana/programs/factorial.dana +++ b/dana/programs/factorial.dana @@ -8,8 +8,8 @@ def main input := readInteger() output := fact(input) - writeString: "The factorial of "; + writeString: "The factorial of " writeInteger: input writeString: " is " writeInteger: output - writeString "\n" + writeString: "\n" From 059aa226dd3ee781ad717d78639527e56be8c814 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Sat, 19 Apr 2025 23:01:23 +0300 Subject: [PATCH 08/22] Fix syntax of fibonacci.dana Variable declarations for a and b were moved from inside the else block to the beginning of the fib function's body. --- dana/programs/fibonacci.dana | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dana/programs/fibonacci.dana b/dana/programs/fibonacci.dana index ef6cfe0..01c0525 100644 --- a/dana/programs/fibonacci.dana +++ b/dana/programs/fibonacci.dana @@ -1,13 +1,14 @@ def main def fib: n as int, result as ref int + var a is int + var b is int + if n <= 0: result := 0 elif n = 1: result := 1 else: - var a is int - var b is int fib: n-1, a fib: n-2, b result := a + b From 4801110ead7c50da8fcd3db06246dd1ec707c5d5 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Sat, 19 Apr 2025 23:11:10 +0300 Subject: [PATCH 09/22] Fix syntax of gcd.dana The 'var s' declaration was moved to the start of gcd, the else block's begin/end was removed, the equality operator was changed from == to =, and function calls were updated to use parenthesis () syntax. --- dana/programs/gcd.dana | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/dana/programs/gcd.dana b/dana/programs/gcd.dana index c7cc889..fed17d4 100644 --- a/dana/programs/gcd.dana +++ b/dana/programs/gcd.dana @@ -1,26 +1,24 @@ def main def gcd is int: a b as int - if b == 0: return: a + var s is int + + if b = 0: return: a else: - begin - var s is int - s := gcd: b, a % b - return: s - end + s := gcd(b, a % b) + return: s var n1 n2 is int - (* just messing around *) var d is int - + (* just messing around *) var d is int writeString: "Give me two positive integers: \n" n1 := readInteger() n2 := readInteger() - # Making sure numbers are non-negative - + # Making sure numbers are non-negative + if n1 < 0: n1 := -n1 - if not n2 >= 0: n2 := -n2 + if not n2 >= 0: n2 := -n2 d := gcd(n1, n2) writeString: "\nTheir GCD is: " writeInteger: d - writeString: "\n" + writeString : "\n" From d476eaf023469c31968845c41a5b4ab16ab03f36 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Sat, 19 Apr 2025 23:27:48 +0300 Subject: [PATCH 10/22] Fix syntax of IntXor.dana The colon after main was removed, assignment operators were changed from '=' to ':=', 'return n' became 'return : n', parameter types were defined using 'as' instead of 'is', and the final 'writeString' call was corrected. --- dana/programs/IntXor.dana | 43 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/dana/programs/IntXor.dana b/dana/programs/IntXor.dana index 066823d..6badc05 100644 --- a/dana/programs/IntXor.dana +++ b/dana/programs/IntXor.dana @@ -1,43 +1,43 @@ -# A (not so efficient) program that returns the XOR of 2 ints +# A (not so efficient) program that returns the XOR of 2 ints + +def main -def main: - # A binary number is represented with an array # where every bit is stored as an int - + # Function definitions - def DecToBin: n as int, N as int[15] + def DecToBin: n as int, N as int[] var max i is int max := 16384 i := 14 loop: N[i] := n / max - n := n % max + n := n % max max := max / 2 - i = i - 1 + i := i - 1 if i < 0: break - - def BinToDec is int: N as int[15] + + def BinToDec is int: N as int[] var max i n is int max := 16384 i := 14 n := 0 - + loop: - n := n + N[i] * max + n := n + N[i] * max max := max / 2 - i = i - 1 + i := i - 1 if i < 0: break - return n + return : n - def XOR: A B X is int[15] + def XOR: A B X as int[] var i is int i := 14 - + loop: - X[i] := (A[i] + B[i]) % 2 - i = i - 1 + X[i] := (A[i] + B[i]) % 2 + i := i - 1 if i < 0: break @@ -47,18 +47,19 @@ def main: # Read input writeString: "Input 2 non negative integers" - a := readInteger() + a := readInteger() b := readInteger() - # Convert to binary + # Convert to binary DecToBin: a, A DecToBin: b, B # Calculate XOR XOR: A, B, X - + # Convert result to int x := BinToDec(X) - + # Print result writeInteger: x + writeString : "\n" From 760a731bdfe1e5e82c1f661e66ff3c4937175908 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Mon, 21 Apr 2025 02:09:41 +0300 Subject: [PATCH 11/22] Fix syntax of knapsack.dana --- dana/programs/knapsack.dana | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dana/programs/knapsack.dana b/dana/programs/knapsack.dana index 8379e11..bacfd3d 100644 --- a/dana/programs/knapsack.dana +++ b/dana/programs/knapsack.dana @@ -11,7 +11,7 @@ def main dp[w_c] := 0 w_c := w_c + 1 - i := 0; + i := 0 loop: if i >= n: break w_c := w_max @@ -29,7 +29,7 @@ def main n := readInteger() weight_max := readInteger() - if n <= 0: return + if n <= 0: exit i := 0 loop: @@ -43,7 +43,7 @@ def main weight[i] := readInteger() i := i + 1 - res := knapsack: n, weight_max, profit, weight + res := knapsack( n, weight_max, profit, weight) writeInteger: res writeChar: "\n" From 3b4f9f567bfd352c92b66e31bf44fd05963f57ac Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Tue, 22 Apr 2025 05:05:13 +0300 Subject: [PATCH 12/22] Fix syntax of dana programs --- dana/programs-erroneous/bsort_error.dana | 2 +- dana/programs/dot_product.dana | 2 -- dana/programs/knapsack.dana | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dana/programs-erroneous/bsort_error.dana b/dana/programs-erroneous/bsort_error.dana index c0ef8c0..5534d4e 100644 --- a/dana/programs-erroneous/bsort_error.dana +++ b/dana/programs-erroneous/bsort_error.dana @@ -50,5 +50,5 @@ def main writeArray: "Initial array: ", 16, x # according to the grammar, x here should be a proc-call of function `x` with no arguments # error should be that x is a variable of type int[16], not a function. - bsort: 16 x + bsort: 16, x writeArray: "Sorted array: ", 16, x diff --git a/dana/programs/dot_product.dana b/dana/programs/dot_product.dana index 56e7860..5e0d02d 100644 --- a/dana/programs/dot_product.dana +++ b/dana/programs/dot_product.dana @@ -4,11 +4,9 @@ def main product := 0 i := 0 loop: - begin if i = n : begin break end product := product + vector1[i]*vector2[i] i := i + 1 - end return : product var ex_vector1 ex_vector2 is int[4] diff --git a/dana/programs/knapsack.dana b/dana/programs/knapsack.dana index bacfd3d..3e4d143 100644 --- a/dana/programs/knapsack.dana +++ b/dana/programs/knapsack.dana @@ -46,5 +46,5 @@ def main res := knapsack( n, weight_max, profit, weight) writeInteger: res - writeChar: "\n" + writeChar: '\n' From 15ccad39014ca51b11886d854c1c47f4a5053aed Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Wed, 23 Apr 2025 00:07:58 +0300 Subject: [PATCH 13/22] Fix semantics of binarysearch.dana Added return types to the declerations of 'partition' and 'binarySearch' function definitions. Corrected a type mismatch in the array population loop by changing the termination assignment from the byte literal '\0' to the integer 0. --- dana/programs/binarysearch.dana | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dana/programs/binarysearch.dana b/dana/programs/binarysearch.dana index 5d8b013..a99b58f 100644 --- a/dana/programs/binarysearch.dana +++ b/dana/programs/binarysearch.dana @@ -1,6 +1,6 @@ def main - def partition: arr as int [], low high as int + def partition is int: arr as int [], low high as int var pivot i j is int pivot := arr[high] i := low - 1 @@ -27,7 +27,7 @@ def main a := b b := t - def binarySearch: arr as int [], low high x as int + def binarySearch is int: arr as int [], low high x as int var mid is int loop: if low > high: break @@ -52,7 +52,7 @@ def main nums[k] := readInteger() k := k + 1 else: - nums[k] := '\0' + nums[k] := 0 break writeString: "\n" From 2de6cbe645b987554b9a9513d67805fba34c4d25 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Wed, 21 May 2025 00:50:24 +0300 Subject: [PATCH 14/22] Fix infinite loop in bsort.dana The 'if not changed: break' condition was previously inside the inner loop. This meant it only broke the inner loop, causing the outer loop to repeat indefinitely if the array was sorted, as 'changed' would be reset at each outer iteration. --- dana/programs/bsort.dana | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/dana/programs/bsort.dana b/dana/programs/bsort.dana index 98e008a..149b424 100644 --- a/dana/programs/bsort.dana +++ b/dana/programs/bsort.dana @@ -1,27 +1,28 @@ def main def bsort: n as int, x as int [] - - def swap: x y as ref int - var t is int - t := x - x := y - y := t - var changed is byte var i is int - loop: + loop outer_loop_label: changed := false i := 0 - loop: + loop inner_loop_label: if i < n-1: if x[i] > x[i+1]: swap: x[i], x[i+1] changed := true i := i+1 - else: break - if not changed: break + else: + break : inner_loop_label + if not changed: + break : outer_loop_label + + def swap: x y as ref int + var t is int + t := x + x := y + y := t def writeArray: msg as byte [], n as int, x as int [] var i is int @@ -37,16 +38,17 @@ def main writeString: "\n" var seed i is int - var x is int [16] + var x is int [16] seed := 65 i := 0 - loop: + loop init_loop: if i < 16: seed := (seed * 137 + 220 + i) % 101 x[i] := seed i := i+1 - else: break + else: + break : init_loop writeArray: "Initial array: ", 16, x bsort: 16, x writeArray: "Sorted array: ", 16, x From fc13a785c7a03ab50b5a26a78ea906b6567c4b74 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Thu, 22 May 2025 19:57:25 +0300 Subject: [PATCH 15/22] Fix linemarket --- dana/programs/linemarket.dana | 155 ++++++++++++++++------------------ 1 file changed, 71 insertions(+), 84 deletions(-) diff --git a/dana/programs/linemarket.dana b/dana/programs/linemarket.dana index b659880..6099498 100644 --- a/dana/programs/linemarket.dana +++ b/dana/programs/linemarket.dana @@ -1,136 +1,123 @@ -(* - This is an implementation of my solution for the first exercise in - the first coding exercises set for the Algorithms course during the - 2024-2025 winter Semester @ ECE/NTUA. The full description of the - problem can be found in the web page of the course in Helios. - - Our goal is to place N stores in M non-overlapping integer intervals[s_i, x_i]. - A store can be placed in any integer number that belongs to an interval. - We want our program to calculate the smallest possible distance between - two consecutive stores such as that distance is maximized. - - Input: The program reads from the standard input two positive integers, N amount of stores and M amount of spaces(intervals) to place them. - After that for the next M lines it reads from the standard input two non-negative integers defining the beginning and the end of each space(interval). - We assume the spaces are given in a random order and their total length is not shorter than N. - - Output: Our program prints in the standard output a positive integer, - the minimum required distance between two consecutive stores in a - placement of all stores such as that minimum distance is maximized. - - Example Input: 6 3 - 10 12 - 0 4 - 5 8 - - Example Output: 2 - -*) - -def main +(* linemarket.dana + * + * Input: + * 6 <-- stores + * 3 <-- N (number of intervals) + * 10 <-- s (start of interval 1) + * 12 <-- f (end of interval 1) + * 0 <-- s (start of interval 2) + * 4 <-- f (end of interval 2) + * 5 <-- s (start of interval 3) + * 8 <-- f (end of interval 3) + * + * Output: + * 2 + *) +def main + var stores size s f N tail is int + var MAX_STORES MAX_PLACES is int + var i is int + var arr is int[200000] + + def swap: x y as ref int + var t is int + t := x + x := y + y := t + def bsort: n as int, x as int[] - def swap: x y as ref int - var t is int - t := x - x := y - y := t - var changed is byte - var i is int - + var i_bsort is int + loop: changed := false - i := 0 + i_bsort := 0 loop: - if i < n-1: - if x[i] > x[i+1]: - swap x[i], x[i+1] + if i_bsort < n-1: + if x[i_bsort] > x[i_bsort+1]: + swap: x[i_bsort], x[i_bsort+1] changed := true - i := i + 1 + i_bsort := i_bsort + 1 else: break if not changed: break - - def possible_store is byte: arr as int[], mid spaces stores as int: - var last_position placed_stores i is int + + def possible_store is byte: current_arr as int[], mid spaces stores_to_place as int + var last_position placed_stores i_ps is int + var j is int + var position is int last_position := -1000000000 placed_stores := 0 - i := 0 + i_ps := 0 loop: - if i >= (spaces/2): break + if i_ps >= (spaces/2): break else: - var j is int - j := 2*i - var position is int - if (last_position + mid) > arr[j]: position := last_position + mid - else: position := arr[j] + j := 2*i_ps + if (last_position + mid) > current_arr[j]: position := last_position + mid + else: position := current_arr[j] loop: - if position > arr[j + 1]: break + if position > current_arr[j + 1]: break else: placed_stores := placed_stores + 1 last_position := position position := position + mid - if placed_stores >= stores: return true - i := i + 1 - return false + if placed_stores >= stores_to_place: return: true + i_ps := i_ps + 1 + return: false - def largest_minimum_distance is int: arr as int[], spaces stores as int: - bsort(arr, spaces) + def largest_minimum_distance is int: lmd_arr as int[], spaces num_stores as int + var distance is int var result left right is int + + bsort: spaces, lmd_arr result := 0 left := 0 - right := arr[spaces - 1] - arr[0] - - #Simple Binary Search for finding the sweet spot + if spaces > 0 : right := lmd_arr[spaces - 1] - lmd_arr[0] + else: right := 0 + + loop: if left > right: break else: - var distance is int - distance := (left + right) / 2 - if possible_store(arr, distance, spaces, stores): + if left > right : distance := left + else: distance := (left + right) / 2 + + if distance <= 0 : distance := 1 + + if possible_store(lmd_arr, distance, spaces, num_stores): result := distance left := distance + 1 else: - right = distance + 1 - return result + right := distance - 1 + return: result - var stores size s f N tail is int tail := 0 + MAX_STORES := 1000000 + MAX_PLACES := 100000 + stores := readInteger() N := readInteger() - var MAX_SIZE MAX_PLACES is int - - MAX_STORES := 1000000 #Change accordingly for larger sizes - MAX_PLACES := 100000 #Change accordingly for larger sizes - - (* - The program handles out of bound inputs by - asking the user again for a correct one. - Maybe the two "if" statements can be combined into one. - *) if stores > MAX_STORES or stores < 1: - writeString "Wrong starting input, let's try again!" + writeString: "Wrong starting input, let's try again!\n" stores := readInteger() if N > MAX_PLACES or N < 1: - writeString "Wrong starting input, let's try again!" + writeString: "Wrong starting input, let's try again!\n" N := readInteger() - var arr is int[2*N] - - var i is int i := 0 loop: if i >= N: break else: - s := readInteger() #We assume correct values for the limits of the spaces + s := readInteger() f := readInteger() arr[i*2] := s arr[i*2 + 1] := f tail := tail + 2 i := i + 1 - + writeInteger: largest_minimum_distance(arr, tail, stores) writeString: "\n" From 8ff950d393b71276d8fc305b40dfab930dad3ba9 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Thu, 22 May 2025 22:18:21 +0300 Subject: [PATCH 16/22] Fix lis.dana syntax --- dana/programs/lis.dana | 122 +++++++++++++++++++++-------------------- 1 file changed, 64 insertions(+), 58 deletions(-) diff --git a/dana/programs/lis.dana b/dana/programs/lis.dana index d70873a..35be0c8 100644 --- a/dana/programs/lis.dana +++ b/dana/programs/lis.dana @@ -2,62 +2,68 @@ Finds the length of the Longest Increasing Subsequence. Dynamic Programming solution in O(N^2) *) - def main - - def lis is int: n as int, arr as int[] - - var dp is int [n] - var i j maxLen is int - - if n <= 0: - return: 0 - - (* Initialize dp array *) - i := 0 - loop: - if i >= n : break - dp[i] := 1 - i := i + 1 - - (* Begin computing values *) - i := 1 - loop: - if i >= n: break - j := 0 - loop: - if j >= i: break - if arr[j] < arr[i] and dp[j] + 1 > dp[i]: - dp[i] := dp[j] + 1 - j := j + 1 - i := i + 1 - - maxLen := dp[0] - i := 1 - loop: - if i >= n: break - if dp[i] > maxLen: - maxLen := dp[i] - i := i + 1 - - return: maxLen - - var n is int - n := readInteger() - - var arr is int [n] - - (* Populate array *) - var i is int - i := 0 - loop: - if i >= n: break - arr[i] := readInteger() - i := i + 1 - - var len is int - len := lis: n, arr - - writeString: "longest inreasing subsequence has length " - writeInteger: len - writeString: "\n" + var n_main is int + var arr_main is int [1000] + var i_main is int + var len is int + var dummy_val is int + + def lis is int: n_param as int, arr_param as int[] + + var dp is int [1000] + var i j maxLen is int + + if n_param <= 0: + return: 0 + + i := 0 + loop: + if i >= n_param : break + dp[i] := 1 + i := i + 1 + + i := 1 + loop: + if i >= n_param: break + j := 0 + loop: + if j >= i: break + if arr_param[j] < arr_param[i] and dp[j] + 1 > dp[i]: + dp[i] := dp[j] + 1 + j := j + 1 + i := i + 1 + + if n_param > 0: + maxLen := dp[0] + else: + maxLen := 0 + + i := 1 + loop: + if i >= n_param: break + if dp[i] > maxLen: + maxLen := dp[i] + i := i + 1 + + return: maxLen + + n_main := readInteger() + + i_main := 0 + loop: + if i_main >= n_main: break + if i_main < 1000: + arr_main[i_main] := readInteger() + else: + dummy_val := readInteger() + i_main := i_main + 1 + + if n_main > 1000: + writeString: "Warning: Input size exceeds program capacity, processing up to 1000 elements.\n" + n_main := 1000 + + len := lis( n_main, arr_main ) + writeString: "longest increasing subsequence has length " + writeInteger: len + writeString: "\n" From 148810b7d2d68ed9e6fcdd48126d533697c6ebbf Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Thu, 22 May 2025 22:29:50 +0300 Subject: [PATCH 17/22] Fix mergesort.dana syntax --- dana/programs/mergesort.dana | 144 +++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 67 deletions(-) diff --git a/dana/programs/mergesort.dana b/dana/programs/mergesort.dana index 7c924f0..f803457 100644 --- a/dana/programs/mergesort.dana +++ b/dana/programs/mergesort.dana @@ -1,83 +1,93 @@ -def merge: arr as int [], left as int, mid as int, right as int - var n1 n2 i j k is int - n1 := mid - left + 1 - n2 := right - mid +def main + var n_main is int + var arr_main is int [1000] + var i_main is int + var dummy_val is int - var L is int [n1] - var R is int [n2] + def merge: arr_param as int [], left_param as int, mid_param as int, right_param as int + var n1_local n2_local i_local j_local k_local is int + var L_temp is int [1000] + var R_temp is int [1000] - i := 0 - loop: - if i < n1: - L[i] := arr[left + i] - i := i + 1 - else: break + n1_local := mid_param - left_param + 1 + n2_local := right_param - mid_param - j := 0 - loop: - if j < n2: - R[j] := arr[mid + 1 + j] - j := j + 1 - else: break + i_local := 0 + loop: + if i_local < n1_local and left_param + i_local < 1000 and i_local < 1000: + L_temp[i_local] := arr_param[left_param + i_local] + i_local := i_local + 1 + else: break - i := 0 - j := 0 - k := left + j_local := 0 + loop: + if j_local < n2_local and mid_param + 1 + j_local < 1000 and j_local < 1000: + R_temp[j_local] := arr_param[mid_param + 1 + j_local] + j_local := j_local + 1 + else: break - loop: - if i < n1 and j < n2: - if L[i] <= R[j]: - arr[k] := L[i] - i := i + 1 - else: - arr[k] := R[j] - j := j + 1 - k := k + 1 - else: break + i_local := 0 + j_local := 0 + k_local := left_param - loop: - if i < n1: - arr[k] := L[i] - i := i + 1 - k := k + 1 - else: break + loop: + if i_local < n1_local and j_local < n2_local: + if L_temp[i_local] <= R_temp[j_local]: + if k_local < 1000: arr_param[k_local] := L_temp[i_local] + i_local := i_local + 1 + else: + if k_local < 1000: arr_param[k_local] := R_temp[j_local] + j_local := j_local + 1 + k_local := k_local + 1 + else: break - loop: - if j < n2: - arr[k] := R[j] - j := j + 1 - k := k + 1 - else: break + loop: + if i_local < n1_local: + if k_local < 1000: arr_param[k_local] := L_temp[i_local] + i_local := i_local + 1 + k_local := k_local + 1 + else: break -def merge_sort: arr as int [], left as int, right as int - if left < right: - var mid is int - mid := (left + right) / 2 - merge_sort: arr, left, mid - merge_sort: arr, mid + 1, right - merge: arr, left, mid, right + loop: + if j_local < n2_local: + if k_local < 1000: arr_param[k_local] := R_temp[j_local] + j_local := j_local + 1 + k_local := k_local + 1 + else: break -def main - var n is int - n := readInteger() + def merge_sort: arr_param as int [], left_param as int, right_param as int + var mid_local is int - var arr is int [n] - var i is int + if left_param < right_param: + mid_local := (left_param + right_param) / 2 + merge_sort: arr_param, left_param, mid_local + merge_sort: arr_param, mid_local + 1, right_param + merge: arr_param, left_param, mid_local, right_param - i := 0 + n_main := readInteger() + + i_main := 0 loop: - if i < n: - arr[i] := readInteger() - i := i + 1 - else: break + if i_main >= n_main: break + if i_main < 1000: + arr_main[i_main] := readInteger() + else: + dummy_val := readInteger() + i_main := i_main + 1 + + if n_main > 1000: + writeString: "Warning: Input size exceeds program capacity (1000 elements). Processing first 1000.\n" + n_main := 1000 + - merge_sort: arr, 0, n-1 + if n_main > 0 : + merge_sort: arr_main, 0, n_main - 1 - i := 0 + i_main := 0 loop: - if i < n: - writeInteger: arr[i] - writeString: " " - i := i + 1 - else: break + if i_main >= n_main: break + if i_main < 1000: + writeInteger: arr_main[i_main] + writeString: " " + i_main := i_main + 1 writeString: "\n" From 6f5e754f6f2bab4d317b1fcfd1529daa13ef6d39 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Tue, 27 May 2025 17:18:30 +0300 Subject: [PATCH 18/22] Fix N_Queens.dana --- dana/programs/N_Queens.dana | 137 +++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 64 deletions(-) diff --git a/dana/programs/N_Queens.dana b/dana/programs/N_Queens.dana index 72fc27c..57382ca 100644 --- a/dana/programs/N_Queens.dana +++ b/dana/programs/N_Queens.dana @@ -1,101 +1,110 @@ def main - def printBoard: board as byte[][], n as int - var i j is int - i := 0 + var size_main is int + + def printBoard: board_param as byte[][], n_param as int + var i_pb j_pb is int + i_pb := 0 loop: - if i >= n : + if i_pb >= n_param : break - j := 0 + j_pb := 0 loop: - if j >= n : + if j_pb >= n_param : break - if board[i][j] = 1 : + if board_param[i_pb][j_pb] = true : writeString: "Q " else : writeString: ". " - j := j + 1 + j_pb := j_pb + 1 writeString: "\n" - i := i + 1 + i_pb := i_pb + 1 writeString: "\n" - def isSafe is byte: board as byte[][], row col n as int - var i j is int + def isSafe is byte: board_param as byte[][], row_param col_param n_param as int + var i_is j_is is int - # check columns - i := 0 + i_is := 0 loop: - if i >= row : + if i_is >= row_param : break - if board[i][col] = 1 : - return : 0 - i := i + 1 + if board_param[i_is][col_param] = true : + return : false + i_is := i_is + 1 - # check left diagonal - i := row - 1 - j := col - 1 + i_is := row_param - 1 + j_is := col_param - 1 loop: - if i < 0 or j < 0 : + if i_is < 0 or j_is < 0 : break - if board[i][j] = 1 : - return : 0 - i := i - 1 - j := j - 1 - - # check right diagonal - i := row - 1 - j := col + 1 + if board_param[i_is][j_is] = true : + return : false + i_is := i_is - 1 + j_is := j_is - 1 + + i_is := row_param - 1 + j_is := col_param + 1 loop: - if i < 0 or j >= n : + if i_is < 0 or j_is >= n_param : break - if board[i][j] = 1 : - return : 0 - i := i - 1 - j := j + 1 + if board_param[i_is][j_is] = true : + return : false + i_is := i_is - 1 + j_is := j_is + 1 - return : 1 + return : true - def solveNQueensUtil is byte: board as byte[][], row n as int - if row = n : - printBoard: board, n - return : 1 + def solveNQueensUtil is byte: board_param as byte[][], row_param n_param as int + var col_util is int - var col is int - col := 0 + if row_param = n_param : + printBoard: board_param, n_param + return : true + + col_util := 0 loop: - if col >= n : + if col_util >= n_param : break - if isSafe: board, row, col, n : - board[row][col] := 1 - if solveNQueensUtil: board, row + 1, n : - return : 1 - board[row][col] := 0 - col := col + 1 + if isSafe(board_param, row_param, col_util, n_param) : + if row_param < 20 and col_util < 20 : board_param[row_param][col_util] := true + + if solveNQueensUtil(board_param, row_param + 1, n_param) : + return : true + + if row_param < 20 and col_util < 20 : board_param[row_param][col_util] := false + col_util := col_util + 1 - return : 0 + return : false - def solveNQueens: n as int - var board is byte[n][n] - var i j is int + def solveNQueens: n_param as int + var board_snq is byte[20][20] + var i_snq j_snq is int - i := 0 + i_snq := 0 loop: - if i >= n : + if i_snq >= n_param : break - j := 0 + j_snq := 0 loop: - if j >= n : + if j_snq >= n_param : break - board[i][j] := 0 - j := j + 1 - i := i + 1 + if i_snq < 20 and j_snq < 20 : board_snq[i_snq][j_snq] := false + j_snq := j_snq + 1 + i_snq := i_snq + 1 - if solveNQueensUtil: board, 0, n : - writeString: "Solution found.\n" + if solveNQueensUtil(board_snq, 0, n_param) : + skip else : writeString: "No solution exists.\n" - var size is int writeString: "Enter board size: " - size := readInteger() - solveNQueens: size + size_main := readInteger() + if size_main > 20 : + writeString: "Warning: Board size capped at 20 due to program limits.\n" + size_main := 20 + if size_main < 1 : + writeString: "Info: Board size must be at least 1. Setting to 1.\n" + size_main := 1 + + if size_main > 0 : solveNQueens: size_main + else: writeString: "No solution exists for non-positive size.\n" From 78d44ee3175c03060491860621ceef1953d0952d Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Tue, 27 May 2025 18:33:07 +0300 Subject: [PATCH 19/22] Fix palindrome.dana --- dana/programs/palindrome.dana | 58 +++++++++++++++++------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/dana/programs/palindrome.dana b/dana/programs/palindrome.dana index 29efc9e..8203a85 100644 --- a/dana/programs/palindrome.dana +++ b/dana/programs/palindrome.dana @@ -1,35 +1,35 @@ def main - - def check_pal is byte: s as byte[] + def check_pal is byte: s as byte[] + var res is byte + var i l is int - var res is byte - var i l is int - - l:=strlen(s) - i:=0 - res:=true - - loop: - if i = l/2: break - elif not s[i] = s[l-i-1]: - res:=false - break - else: - i:=i+1 + l := strlen(s) + i := 0 + res := true - return: res + loop: + if i = l / 2: break + elif not s[i] = s[l-i-1]: + res := false + break + else: + i := i + 1 + return: res + var is_pal is byte + var input is byte [31] - val is_pal is byte - val input is byte [] - - writeString: "Give a string with maximum length 30: " - readString: 30, input - writeString: input + writeString: "Give a string with maximum length 30: " + readString: 31, input + writeString: "Input was: " + writeString: input + writeString: "\n" - is_pal := check_pal: input - - if is_pal: - writeString: " ... is palindrome\n" - else: - writeString: " ... is not palindrome\n" + is_pal := check_pal(input) + + if is_pal = true: + writeString: input + writeString: " ... is palindrome\n" + else: + writeString: input + writeString: " ... is not palindrome\n" From 3fa191343b75319c2e8dbabf1c11642df3ccde3b Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Tue, 27 May 2025 18:42:11 +0300 Subject: [PATCH 20/22] Fix quicksort.dana --- dana/programs/quicksort.dana | 71 +++++++++++++++--------------------- 1 file changed, 29 insertions(+), 42 deletions(-) diff --git a/dana/programs/quicksort.dana b/dana/programs/quicksort.dana index 11bf5b9..f1bf905 100644 --- a/dana/programs/quicksort.dana +++ b/dana/programs/quicksort.dana @@ -1,72 +1,59 @@ def main -begin def partition is int: low high as int, arr as int [] - begin - var pivot i temp j is int + var pivot i temp j is int pivot := arr[high] i := low - 1 j := low - loop: - begin - if j <= high-1: begin break end + if j >= high: break if arr[j] < pivot: - begin i := i + 1 temp := arr[i] arr[i] := arr[j] arr[j] := temp - end j := j + 1 - end temp := arr[i+1] arr[i+1] := arr[high] arr[high] := temp - return: i+1 - end + return: i+1 def quicksort: low high as int, arr as int [] - begin - if low <= high: - begin - var pivot is int - pivot := partition(low, high, arr) - # recursion - quicksort: low, pivot-1, arr - quicksort: pivot+1, high, arr - end - end + var pi is int + if low < high: + pi := partition(low, high, arr) + quicksort: low, pi-1, arr + quicksort: pi+1, high, arr - # Read the length of array from input var N is int - N := readInteger() - # Define the array of given length - var nums is int [N] + var nums is int [100] var k is int - k := 0 + writeString: "Enter number of elements (max 100):\n" + N := readInteger() + + if N > 100: + writeString: "Error: Number of elements exceeds maximum allowed size (100).\n" + exit + if N <= 0: + writeString: "Number of elements must be positive.\n" + exit + + k := 0 loop: - begin - if k < N: begin break end + if k >= N: break + writeString: "Enter element " nums[k] := readInteger() k := k + 1 - end - quicksort: 0, N, nums + quicksort: 0, N-1, nums k := 0 + writeString: "Sorted array: \n" loop: - begin - if i < n: - begin - if k > 0: begin writeString: ā€, ā€ end - writeInteger: x[k] + if k < N: + if k > 0: writeString: ", " + writeInteger: nums[k] k := k+1 - end - else: - begin + else: break - end - end - writeString: ā€\nā€ -end + writeString: "\n" From 10cc84203ebdaa5395f4c8d887ebef804412a4ae Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Tue, 27 May 2025 18:49:32 +0300 Subject: [PATCH 21/22] Fix rotatefun.dana --- dana/programs/rotatefun.dana | 55 ++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/dana/programs/rotatefun.dana b/dana/programs/rotatefun.dana index 459045d..ce054c2 100644 --- a/dana/programs/rotatefun.dana +++ b/dana/programs/rotatefun.dana @@ -1,50 +1,57 @@ # LeetCode problem: 396. Rotate Function (https://leetcode.com/problems/rotate-function/description/) def main - - def maxRotateFunction is int: n as int, nums as int [] - var sum prevF maxF i is int + def maxRotateFunction is int: n_param as int, nums_param as int [] + var sum prevF maxF i F is int sum := 0 prevF := 0 - maxF := 0 i := 0 loop: - if i < n: - sum := sum + nums[i] - prevF := prevF + i * nums[i] + if i < n_param: + sum := sum + nums_param[i] + prevF := prevF + i * nums_param[i] i := i + 1 else: break - maxF := prevF - i := 1 + maxF := prevF + i := 1 loop: - if i < n: - var F is int - F := prevF + sum - n * nums[n-i] - if F > maxF: maxF := F + if i < n_param: + F := prevF + sum - n_param * nums_param[n_param-i] + if F > maxF: + maxF := F prevF := F i := i + 1 else: break return: maxF - var n is int - n := readInteger() - - var nums is int [n] + var n_actual is int + var nums_main is int [100] + var i_main is int + var result is int - var i is int - i := 0 + writeString: "Enter number of elements (max 100):\n" + n_actual := readInteger() + + if n_actual <= 0: + writeString: "Number of elements must be positive.\n" + exit + if n_actual > 100: + writeString: "Number of elements exceeds array capacity (100).\n" + exit + + i_main := 0 loop: - if i < n: - nums[i] := readInteger() - i := i + 1 + if i_main < n_actual: + writeString: "Enter element " + nums_main[i_main] := readInteger() + i_main := i_main + 1 else: break - var result is int - result := maxRotateFunction(n, nums) + result := maxRotateFunction(n_actual, nums_main) writeInteger: result writeString: "\n" From d601d79eadf9080935de47c74e8c4697fc65a3a9 Mon Sep 17 00:00:00 2001 From: Orestis Sabethai Date: Tue, 27 May 2025 18:56:59 +0300 Subject: [PATCH 22/22] Fix calculator.dana --- dana/programs/calculator.dana | 81 ++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/dana/programs/calculator.dana b/dana/programs/calculator.dana index a1bcb74..65482f6 100644 --- a/dana/programs/calculator.dana +++ b/dana/programs/calculator.dana @@ -1,3 +1,4 @@ +(* calculator.dana *) def main # Helper Function @@ -11,10 +12,8 @@ def main else: return: false - (* - Conversion from part of a string to an int - [from, to) - *) + # Conversion from part of a string to an int + # [from, to) def string_to_int is int: s as byte[], from to as int var i res pow is int @@ -30,18 +29,16 @@ def main return: res - (* - Simple Calculator - - Input: lines of the following form: - - where is a positive integer - and is one of +, -, *, / - Any other characters among them get ignored. - - Output: lines with the results - or a message "Invalid" in case of failure - *) + # Simple Calculator + # + # Input: lines of the following form: + # + # where is a positive integer + # and is one of +, -, *, / + # Any other characters among them get ignored. + # + # Output: lines with the results + # or a message "Invalid" in case of failure var buf is byte[256] var idx len start p_end a b is int @@ -60,50 +57,71 @@ def main if idx = len: writeString: "Invalid\n" continue: lines - elif is_number(buf[idx]): + elif is_digit(buf[idx]): break: a_start idx := idx + 1 start := idx loop a_end: if idx = len: - writeString: "Invalid\n" - continue: lines - elif not is_number(buf[idx]): + p_end := idx + break: a_end + elif not is_digit(buf[idx]): + p_end := idx break: a_end idx := idx + 1 - p_end := idx + if idx = len: + p_end := idx + break: a_end + + if start = p_end: + writeString: "Invalid\n" + continue: lines - a := string_to_int(buff, start, p_end) + a := string_to_int(buf, start, p_end) loop op_detect: if idx = len: writeString: "Invalid\n" continue: lines elif is_operator(buf[idx]): + op := buf[idx] + idx := idx + 1 break: op_detect idx := idx + 1 - op := buf[idx] + + if idx = start: + writeString: "Invalid\n" + continue: lines loop b_start: if idx = len: writeString: "Invalid\n" continue: lines - elif is_number(buf[idx]): + elif is_digit(buf[idx]): break: b_start idx := idx + 1 start := idx loop b_end: - if idx = len or not is_number(buf[idx]): + if idx = len: + p_end := idx + break: b_end + elif not is_digit(buf[idx]): + p_end := idx break: b_end idx := idx + 1 - p_end := idx + if idx = len: + p_end := idx + break: b_end - b := string_to_int(buff, start, p_end) + if start = p_end: # No digits were found for the second number + writeString: "Invalid\n" + continue: lines - # We have finished parsing now we can calculate + b := string_to_int(buf, start, p_end) # Corrected buff to buf + # We have finished parsing now we can calculate if op = '+': writeInteger: a + b elif op = '-': @@ -111,9 +129,12 @@ def main elif op = '*': writeInteger: a * b elif op = '/': - writeInteger: a / b + if b = 0: + writeString: "Invalid\n" # Division by zero + else: + writeInteger: a / b else: writeString: "Invalid\n" + writeString: "\n" exit -