Skip to content

Instantly share code, notes, and snippets.

@mcmillhj
Created January 22, 2020 15:43
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 mcmillhj/d67649b4a691ff3d82817194f9fdcb07 to your computer and use it in GitHub Desktop.
Save mcmillhj/d67649b4a691ff3d82817194f9fdcb07 to your computer and use it in GitHub Desktop.
Solution to casidoo's weekly interview question: is-factorial
use experimental :cached;
sub postfix:<!>(Int:D $n) {
[*] 2..$n;
}
multi sub is-factorial(0) { True }
multi sub is-factorial(1) { True }
multi sub is-factorial(Int:D $n where * >= 2 --> Bool) {
sub is-factorial-recursive(Int:D $n, Int:D $d --> Bool) is cached {
# if $n is 1, then this is a factorial
return True if $n == 1;
# if $d does not divide $n, then this cannot be a factorial
return False if $n % $d != 0;
return is-factorial-recursive($n div $d, $d + 1);
}
return is-factorial-recursive($n, 2);
}
for 1..20 -> $n {
say "is-factorial($n) = " ~ is-factorial($n);
}
# is-factorial(1) = True
# is-factorial(2) = True
# is-factorial(3) = False
# is-factorial(4) = False
# is-factorial(5) = False
# is-factorial(6) = True
# is-factorial(7) = False
# is-factorial(8) = False
# is-factorial(9) = False
# is-factorial(10) = False
# is-factorial(11) = False
# is-factorial(12) = False
# is-factorial(13) = False
# is-factorial(14) = False
# is-factorial(15) = False
# is-factorial(16) = False
# is-factorial(17) = False
# is-factorial(18) = False
# is-factorial(19) = False
# is-factorial(20) = False
for 1..20 -> $n {
say "is-factorial(" ~ $n! ~ ") = " ~ is-factorial($n!);
}
# is-factorial(1) = True
# is-factorial(2) = True
# is-factorial(6) = True
# is-factorial(24) = True
# is-factorial(120) = True
# is-factorial(720) = True
# is-factorial(5040) = True
# is-factorial(40320) = True
# is-factorial(362880) = True
# is-factorial(3628800) = True
# is-factorial(39916800) = True
# is-factorial(479001600) = True
# is-factorial(6227020800) = True
# is-factorial(87178291200) = True
# is-factorial(1307674368000) = True
# is-factorial(20922789888000) = True
# is-factorial(355687428096000) = True
# is-factorial(6402373705728000) = True
# is-factorial(121645100408832000) = True
# is-factorial(2432902008176640000) = True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment