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 }