#!/usr/local/bin/perl use 5.010; use strict; use warnings FATAL => 'all'; my $hex = '7c9695cb23a71d851688cc0d7f8b1072'; my @num = map {hex} split '', $hex; forty_two(42 => @num); sub forty_two { my ($target, $expr, $first, @rest) = @_; state $count_hit = 0; state $count_total = 0; unless (defined $first) { $count_total++; if (eval $expr == $target) { $count_hit++; $expr =~ s/(\d+)/sprintf "%x", $1/eg; say "$count_hit/$count_total: $expr == 42"; } return; } forty_two($target, "$expr+$first", @rest); forty_two($target, "$expr-$first", @rest); forty_two($target, "$expr*$first", @rest); if ($first) { my ($last_term) = $expr =~ m{(\d+(?:[*/]\d+)*)$}; forty_two($target, "$expr/$first", @rest) if eval "$last_term % $first == 0"; } }