Facto week

Weekly challenge 153 — 21 February 2022

Week 153 - 21 Feb 2022

Task 2

You are given an integer, `$n`

.

Write a script to figure out if the given integer is a factorion. A factorion is a natural number that equals the sum of the factorials of its digits.

Example 1: Input: $n = 145 Output: 1 Since 1! + 4! + 5! => 1 + 24 + 120 = 145Example 2: Input: $n = 123 Output: 0 Since 1! + 2! + 3! => 1 + 2 + 6 <> 123

I was tempted to submit

say 0;

which is nearly always correct. According to my algorithm 1, 2, 145 and 40585 are the only factorions under 100k, and these nice chaps at OEIS state that these are indeed the only 4 that exist. So

say $n =~ m/^(1|2|145|40585)$/ ? 1 : 0;

would do. However, since the task says we have to 'figure out' if the given number is a factorion I have written the relevant code.

#!/usr/bin/perl # Peter Campbell Smith - 2022-02-21 # PWC 153 task 2 use v5.28; use strict; use utf8; my (@tests, $test, $sum, @fac, $n, $not, $string1, $string2); # numbers to test @tests = (1, 2, 3, 4, 125, 145, 40585, 57778); # calculate factorials of single digits $fac[0] = 1; for $n (1 .. 9) { $fac[$n] = $n * $fac[$n - 1]; } # loop over tests for $test (@tests) { $sum = 0; $string1 = $string2 = ''; # test for being a factorion while ($test =~ m|(\d)|g) { $sum += $fac[$1]; $string1 .= qq[$1! + ]; $string2 .= qq[$fac[$1] + ]; } # format output $string1 =~ s|...$||; $string2 =~ s|...$||; if ($sum == $test) { say qq[\nInput: $test\nOutput: 1 since $string1 => $string2 = $test]; } else { say qq[\nInput: $test\nOutput: 0 since $string1 => $string2 = $sum <> $test]; } }

Input: 1 Output: 1 since 1! => 1 = 1 Input: 2 Output: 1 since 2! => 2 = 2 Input: 3 Output: 0 since 3! => 6 = 6 <> 3 Input: 4 Output: 0 since 4! => 24 = 24 <> 4 Input: 125 Output: 0 since 1! + 2! + 5! => 1 + 2 + 120 = 123 <> 125 Input: 145 Output: 1 since 1! + 4! + 5! => 1 + 24 + 120 = 145 Input: 40585 Output: 1 since 4! + 0! + 5! + 8! + 5! => 24 + 1 + 120 + 40320 + 120 = 40585 Input: 57778 Output: 0 since 5! + 7! + 7! + 7! + 8! => 120 + 5040 + 5040 + 5040 + 40320 = 55560 <> 57778

The content of this website which has been created by

Peter Campbell Smith is hereby placed in the public domain

Peter Campbell Smith is hereby placed in the public domain