#!/usr/bin/perl use strict; use warnings; my @Eq = ( " ABC + DDE = FCF", " CB + BGE = BCA", " AEE + CBG = DGAE", " ABC + CB = AEE", " DDE + BGE = CBG", " FCF + BCA = DGAE", ); my @res = &Sol(@Eq); foreach my $r (@res) { print join("; ", map { "$_ = $r->{$_}" } keys %{$r}), "\n"; } sub Sol { my (@e) = @_; my %pairs = (); my @sol = (); for (@e) { s!=!==!; $pairs{$_} = 0 foreach (m!(\w)!g); } my @vars = keys %pairs; my $count = scalar @vars; while(1) { my $true = 0; foreach my $e (@e) { while(my($k, $v) = each %pairs) { $e =~ s!$k!$v!g; } $true = eval $e; last unless $true; } push @sol, {%pairs} if $true; my $i = 0; while($i < $count) { last if ++$pairs{$vars[$i]} < 10; $pairs{$vars[$i]} = 0; $i++; } last if $i == $count; } return @sol; }