Tzopilotl
Docs
GitHub

Tzopilotl by Example

27. Advanced Examples

27.1 Fibonacci (Recursive and Iterative)

fn fib(n Int) Int {
    if (n <= 1) { return n; }
    fib(n - 1) + fib(n - 2)
}

fn fib_iter(n Int) Int {
    if (n <= 1) { return n; }
    var a = 0;
    var b = 1;
    for (k : (2..n)) {
        let next = a + b;
        a = b;
        b = next;
    }
    b
}

27.2 FizzBuzz

fn fizzbuzz(n Int) String {
    if (n % 15 == 0) { return "FizzBuzz"; }
    if (n % 3 == 0) { return "Fizz"; }
    if (n % 5 == 0) { return "Buzz"; }
    ""
}

for (i : (1..20)) {
    let fb = fizzbuzz(i);
    if (fb == "") { i println; } else { fb println; }
}

27.3 Euler Problem 9: Pythagorean Triplet

-- Find a*b*c where a+b+c=1000, a^2+b^2=c^2
fn euler9() Int {
    for (a : (1..332)) {
        for (b : ((a + 1)..499)) {
            let c = 1000 - a - b;
            if (c > b) {
                if (a * a + b * b == c * c) {
                    return a * b * c;
                }
            }
        }
    }
    0
}

27.4 Complex Number Powers of i

-- i^1=i, i^2=-1, i^3=-i, i^4=1
let i_1 = 1i;
let i_2 = i_1 * i_1;      -- -1+0i
let i_3 = i_2 * i_1;      -- 0-1i
let i_4 = i_3 * i_1;      -- 1+0i

27.5 Bitwise Operator Overloading

struct Mask { bits Int }

fn &(a Mask, b Mask) Mask = Mask { bits: a.bits & b.bits };
fn |(a Mask, b Mask) Mask = Mask { bits: a.bits | b.bits };
fn ^(a Mask, b Mask) Mask = Mask { bits: a.bits ^ b.bits };
fn <<(a Mask, n Int) Mask = Mask { bits: a.bits << n };
fn >>(a Mask, n Int) Mask = Mask { bits: a.bits >> n };

let m1 = Mask { bits: 255 };
let m2 = Mask { bits: 15 };
println(m1 & m2);     -- Mask { bits: 15 }
println(m1 | m2);     -- Mask { bits: 255 }
println(m1 << 4);     -- Mask { bits: 4080 }