One-two primes: Difference between revisions

Content added Content deleted
m (→‎Generalized: A little less terse. Exact same functionality but better names and whitespace)
m (→‎{{header|Perl}}: improved 'condense' (no args required))
Line 371: Line 371:
use ntheory 'is_prime';
use ntheory 'is_prime';


sub condense ($n,$a,$b) { my $i = index($n,$b); $i>9 ? "($a x $i) " . substr($n,$i) : $n }
sub condense($n) { $n =~ /^((.)\2+)/; my $i = length $1; $i>9 ? "($2 x $i) " . substr($n,$i) : $n }


sub combine ($d, $a, $b, $s='') {
sub combine ($d, $a, $b, $s='') { # NB: $a < $b
if ($d == 1 && is_prime $s.$a) { return $s.$a
if ($d == 1 && is_prime $s.$a) { return $s.$a
} elsif ($d == 1 && is_prime $s.$b) { return $s.$b
} elsif ($d == 1 && is_prime $s.$b) { return $s.$b
Line 382: Line 382:
my($a,$b) = (1,2);
my($a,$b) = (1,2);
say "Smallest n digit prime using only $a and $b (or '0' if none exists):";
say "Smallest n digit prime using only $a and $b (or '0' if none exists):";
printf "%4d: %s\n", $_, combine($_,$a,$b) for 1..20;
printf "%4d: %s\n", $_, combine($_,$a,$b) for 1..20;
printf "%4d: %s\n", $_, condense(combine($_,$a,$b),$a,$b) for map {100*$_} 1..20;
printf "%4d: %s\n", $_, condense combine($_,$a,$b) for map 100*$_, 1..20;


($a,$b) = (7,9);
($a,$b) = (7,9);
say "\nSmallest n digit prime using only $a and $b (or '0' if none exists):";
say "\nSmallest n digit prime using only $a and $b (or '0' if none exists):";
printf "%4d: %s\n", $_, condense(combine($_,$a,$b),$a,$b) for 1..20, 100, 200;
printf "%4d: %s\n", $_, condense combine($_,$a,$b) for 1..20, 100, 200;


# 1st term missing
# 1st term missing