Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re: Efficient enumeration of pandigital fractions

by tybalt89 (Monsignor)
on Jul 20, 2018 at 23:20 UTC ( [id://1218971]=note: print w/replies, xml ) Need Help??


in reply to Efficient enumeration of pandigital fractions

Here's a first pass at it.

It does partial math (same number of digits on both sides) to cut off further consideration because of duplicates or 0.

It does base 18 in under 3 minutes.

#!/usr/bin/perl -l # https://perlmonks.org/?node_id=1218964 use strict; use warnings; use POSIX; my $base = shift // 10; my @numbers = (0..9, 'a'..'z')[0..$base-1]; my $numberlength = $base - 1 >> 1; my $pattern = '-' x $numberlength . '=' . '-' x $numberlength . '*'; sub inbase { my ($n, $b) = @_; my $ans = ''; while($n > 0) { $ans = $numbers[$n % $b] . $ans; $n = int $n / $base; } $ans || 0; } # dddd=dddd*d # for base 10 my $solutions = my $count = 0; my @queue = map "$pattern$_", @numbers[2..$#numbers]; while( @queue ) { $count++; $_ = shift @queue; /(\w).*\1/ and next; if( !/.*=.*\K-/ ) { print; $solutions++; next; } my ($before, $after) = ($`, $'); my $mul = POSIX::strtol( substr( $after, -1 ), $base ); for my $d ( @numbers[1..$#numbers] ) { $_ =~ $d and next; my $new = "$before$d$after"; $new =~ /=-*(\w+)/ or next;; my $len = length $1; my $prod = POSIX::strtol( $1, $base ) * $mul; my $baseprod = inbase( $prod, $base ); length $baseprod > $numberlength and next; substr $new, $numberlength - $len, $len, substr $baseprod, -$len; $new =~ /0|(\w).*\1/ and next; push @queue, $new; } } print "\nsteps $count solutions $solutions";

Replies are listed 'Best First'.
Re^2: Efficient enumeration of pandigital fractions
by kikuchiyo (Hermit) on Jul 21, 2018 at 20:40 UTC
    Thanks, nice, perlish solution! I didn't really know about \K, and I guess I have a blind spot about $', $`, perhaps because the documentation makes (made?) a good job of dissuading anyone from using them.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1218971]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (3)
As of 2024-04-25 07:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found