basic algo care with hare
haphazard collection of programs written in the hare programming language (a.k.a. harelang) as solutions to simple problems and/or implementations of basic algorithms.
the problem statements themselves were either taken from or inspired by similar ones in:
get yourself a 🐇
you can bootstrap the hare toolchain in any linux environment/distro/machine as follows:
- bootstrap the hare compiler with its QBE backend, i.e.,
harec
$ git clone https://git.sr.ht/~sircmpwn/harec && cd harec
$ cp configs/linux.mk config.mk
$ make
# run the test suite
$ make check
# install system wide
$ make install
- bootstrap the
hareandharedoccommand, i.e., the build driver, the stdlib, and its documentation
$ git clone https://git.sr.ht/~sircmpwn/hare && cd hare
$ cp configs/linux.mk config.mk
$ make
# run the test suite
$ make check
# install system wide
$ make install
this will install the harec, hare, and haredoc binaries from the toolchain into /usr/local/bin, which you can verify with
$ hare version
hare 0.24.2-rc1-412-gf2d0f47d
1. triple sum condition
write a hare program to compute the sum of two input values. if the two values are the same, then return triple their sum.
use os;
use fmt;
use bufio;
use strings;
use strconv;
fn triplesumcondition(a: int, b: int) int = {
const sum = a + b;
return if (a == b) 3 * sum else sum;
};
export fn main() void = {
fmt::println("Enter the first value: ")!;
const a = bufio::read_line(os::stdin)! as []u8;
const a = strings::fromutf8(a)!;
const a = strconv::stoi(a)!;
fmt::println("Enter the second value: ")!;
const b = bufio::read_line(os::stdin)! as []u8;
const b = strings::fromutf8(b)!;
const b = strconv::stoi(b)!;
fmt::printfln("sum of {} and {} = {}", a, b, triplesumcondition(a, b))!;
};
2. absolute difference from 51
write a hare program that will take a number as input and find the absolute difference between the input number and
51. if the input number is greater than51, it will return triple the absolute difference.
use os;
use fmt;
use bufio;
use strings;
use strconv;
fn abs(n: int) int = {
const diff = n - 51;
const diff = if (diff > 0) 3 * diff else -diff;
return diff;
};
export fn main() void = {
fmt::println("Enter the number: ")!;
const num = bufio::read_line(os::stdin)! as []u8;
const num = strings::fromutf8(num)!;
const num = strconv::stoi(num)!;
fmt::printfln("{}", abs(num))!;
};
3. all but one
given an array of integers, write a hare program that returns a new array such that each element at index
iof the new array is the product of all the numbers in the original array except the one ati.
for example, if our input was [1, 2, 3, 4, 5], the expected output would be [120, 60, 40, 30, 24]. if our input was [3, 2, 1], the expected output would be [2, 3, 6].
use fmt;
export fn main() void = {
const arr: [_]int = [1, 2, 3, 4, 5];
const new = alloc([1...], len(arr))!;
defer free(new);
for (let i = 0z; i < len(arr); i += 1) {
for (let j = 0z; j < len(arr); j += 1) {
if (i == j) continue;
new[i] *= arr[j];
};
};
for (let elem .. new) fmt::printfln("{}", elem)!;
};