#!/usr/bin/ruby # ## The Ackermann function # func A({ .is_zero }, n) { n + 1 } func A(m, (0)) { A(m-1, 1); } func A(m, n) { A(m-1, A(m, n-1)); } assert_eq(A(3, 2), 29); # ## The Fibonacci Nth term # func fib(Number n { _ <= 1 } = 0) { return n } func fib(n) { fib(n-1) + fib(n-2) } assert_eq(fib(), 0); assert_eq(fib(12), 144); # ## The Fibonacci Nth term (#2) # func fib2((0)) { 0 } func fib2((1)) { 1 } func fib2(n) { __FUNC__(n-1) + __FUNC__(n-2) } assert_eq(fib2(12), 144); # ## The Fibonacci Nth term (#3) # func fib3(Number n (0)) { n } func fib3(Number n (1)) { n } func fib3(Number n) { fib3(n-1) + fib3(n-2) } assert_eq(fib3(12), 144); # ## The Fibonacci Nth term (#4) # func fib4(Number n {.is_zero}) { n } func fib4(Number n {.is_one }) { n } func fib4(Number n) { fib4(n-1) + __FUNC__(n-2) } assert_eq(fib4(12), 144); # ## The Fibonacci Nth term (#5) # func fib5(n (0)) { n } func fib5(n (1)) { n } func fib5(Number n) { __FUNC__(n-1) + fib5(n-2) } assert_eq(fib5(12), 144); # ## The Fibonacci Nth term (#6) # func fib6(n < Number (0)) { n } func fib6(n < Number (1)) { n } func fib6(n < Number) { fib6(n-1) + fib6(n-2) } assert_eq(fib6(12), 144); # ## The Fibonacci Nth term (#7) # func fib7(n < Number {.is_zero}) { n } func fib7(n < Number {.is_one}) { n } func fib7(n < Number) { fib7(n-1) + fib7(n-2) } assert_eq(fib7(12), 144); # ## Slurpy variable with block # func f(a, *b { .all{ _ >= 0} }) { a * b.sum } assert_eq(f(2, 3, 4, 5, 6), 36); # ## Fizz-Buzz # func fizzbuzz({ _ %% 15 }) { "FizzBuzz" } func fizzbuzz({ _ %% 5 }) { "Buzz" } func fizzbuzz({ _ %% 3 }) { "Fizz" } func fizzbuzz( n ) { n } assert_eq(fizzbuzz(3), 'Fizz'); assert_eq(fizzbuzz(5), 'Buzz'); assert_eq(fizzbuzz(15), 'FizzBuzz'); assert_eq(fizzbuzz(12), 'Fizz'); assert_eq(fizzbuzz(30), 'FizzBuzz'); assert_eq(fizzbuzz(25), 'Buzz'); assert_eq(fizzbuzz(41), 41); assert_eq(fizzbuzz(19), 19); say "** Test passed!";