about summary refs log tree commit diff
path: root/thinkperl6/draft.p6
blob: 7f74238a978aad48191670d93060419d2889f126 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env perl6
# Exercise 2.2.1
sub sphere-volume($r) { 4/3 * π * $r³ }

# Exercise 3.1
# Notice the operator precedence
sub rjust(Str $str, Int $width = 70) { ' ' x $width - $str.chars ~ $str }
#put rjust("Larry Wall", 80);

# Exercise 3.2
sub print-twice($str) {
    put $str;
    put $str
}
sub do-twice(&code, $arg) {
    code $arg;
    code $arg
}
#do-twice(&print-twice, "What's up doc");
sub do-four(&code, $arg) { do-twice { do-twice &code, $_ }, $arg }

# Exercise 3.3
sub grid(Int $rows=2, Int $cols=2, Int $side=4) {
    (('+' for 0..$cols).join((' ' for 0..$side).join('-'))~"\n" for 0..$rows)
    .join((('|' for 0..$cols).join(' ' x $side*2 + 1)~"\n") x $side)
}
#print grid(4, 4);

# Exercise 4.2
sub check-fermat(Int $a, Int $b, Int $c, Int $n) {
    return if $n <= 2;
    if $a**$n + $b**$n == $c**$n {
        put "Holy smokes, Fermat was wrong!"
    } else {
        put "No, that doesn't work."
    }
}

# Exercise 4.3
sub is-triangle($a, $b, $c) { ([-] reverse sort $a, $b, $c) < 0 }

# Exercise 4.4
sub fibonacci(Int $n, Int $a = 0, Int $b = 1) {
    return $a if $n <= 0; #put $a;
    fibonacci $n - 1, $b, $a + $b
}
#put fibonacci 20;

sub hypotenuse($a, $o) { sqrt $a² + $o² }
#put hypotenuse 3, 4;

# Exercise 5.2
multi ack(0, Int $n) { $n + 1 }
multi ack(Int $m where * > 0, 0) { ack $m - 1, 1 }
multi ack(Int $m where * > 0, Int $n where * > 0) {
    ack $m - 1, ack($m, $n - 1)
}
#put ack 3, 4;

# Exercise 5.3
sub is-palindrome(Str $str) { $str eq $str.flip }

# Exercise 5.4
sub is-power-of($a, $b) { { $_ == $_.Int }(log $a, $b) }

# Exercise 5.5: gcd is a built-in operator

# Exercise 6.1
sub my-sqrt($a, $epsilon = 0.000_000_1, $x = $a) {
    return $x if abs $x² - $a < $epsilon;
    my-sqrt $a, $epsilon, ($x + $a/$x) / 2
}

# Exercise 6.2
sub factorial(Int $n) { [*] 1..$n }
sub estimate-pi {
    my $factor = 2 * 2.sqrt / 9801;
    sub Srinivasa-Ramanujan($k = 1, $current = 1103, $result = 1103) {
        my $next = factorial($k * 4) * (1103 + $k*26390)
                   / factorial($k) / 396**($k*4);
        return $result + $next if $factor * $next < 10**-15;
        Srinivasa-Ramanujan $k + 1, $next, $result + $next;
    }
    1 / $factor / Srinivasa-Ramanujan
}
#put abs estimate-pi() - pi;