#!/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($pairs{$vars[$count-1]} < 10) { 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++; } } return @sol; }