#!/usr/bin/perl use strict; use warnings; my $target = defined $ARGV[0] ? $ARGV[0] : 987654321; print join ', ' , get_three( $target ); sub get_three { my $num = shift; my $prev = p_tri( $num ); return ($num, 0, 0) if ! $prev; while ( $prev ) { my $p_tri = ($prev * $prev + $prev) / 2; my $i = 0; my $j = $num - $p_tri; while ( $j >= $i ) { return $p_tri, $i, $j if ! p_tri( $i ) && ! p_tri( $j ); ++$i; --$j; } --$prev; } die "Something went horribly wrong : $num\n"; } sub p_tri { my $num = shift; my $x = ( sqrt( 8 * $num + 1 ) + 1 )/ 2; my $t = int $x; return $t == $x ? 0 : --$t; }