Skip to content

Instantly share code, notes, and snippets.

@rassoc
Last active June 30, 2021 22:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rassoc/7cc2d9b853fd2164dbdd0b98e9da3ab9 to your computer and use it in GitHub Desktop.
Save rassoc/7cc2d9b853fd2164dbdd0b98e9da3ab9 to your computer and use it in GitHub Desktop.
collatz
# 0.53 s, 31424 kb
$memo = {}
def collatz(n)
return $memo[n] if $memo[n]
$memo[n] = case
when n == 1 then 1
when n.even? then 1 + collatz(n.div 2)
else 1 + collatz(3 * n + 1)
end
end
(1..100_000).each { |n| puts "#{n} #{collatz n}" }
# 21.89 s, 197740 kb
use experimental :cached;
sub Collatz ($n) is cached {
given ($n) {
when (1) { 1 };
when ($n %% 2 ) { 1 + Collatz($n / 2) };
when ($n !%% 2 ) { 1 + Collatz(3 * $n + 1) };
}
}
(1 .. 1E5).map: -> $n {
say join ' ', $n, Collatz $n;
}
# 4.40 s, 157024 kb
sub collatz ($n) {
state %memo;
return %memo{$n} if %memo{$n}:exists;
%memo{$n} = do given $n {
when 1 { 1 };
when $n %% 2 { 1 + collatz($n div 2) };
default { 1 + collatz(3 * $n + 1) };
}
}
say $_, ' ', collatz $_ for 1..100_000;
# 12.00 s, 175020 kb
use experimental :cached;
sub collatz ($n) is cached {
given $n {
when 1 { 1 };
when $n %% 2 { 1 + collatz($n div 2) };
default { 1 + collatz(3 * $n + 1) };
}
}
say $_, ' ', collatz $_ for 1..100_000;
@japhb
Copy link

japhb commented Jun 30, 2021

# japhb: 1.63 s, 145748 kb
my %memo;
sub collatz (int $n) {
    %memo{$n} //= ($n == 1 ?? 1 !!
                   $n %% 2 ?? 1 + collatz($n div 2) !!
                              1 + collatz(3 * $n + 1))
}

say $_, ' ', collatz $_ for 1..100_000;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment