#!/usr/local/bin/perl -w
###########################################
# bball-drop
# Mike Schilli, 2009 (m@perlmeister.com)
###########################################
use strict;
use POSIX qw(ceil);
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init($INFO);

my $total = 100;

my $n = ceil( (-1 + sqrt(1+4*2*$total)) 
              / 2 );

my $sum   = 1;
my @stops = ();
push @stops, $sum;

while($sum + $n <= $total) {
    push @stops, $sum + $n;
    $sum += $n;
    $n--;
}

my $last_ok_floor = 
  (defined $ARGV[0] ? $ARGV[0] : 42);

INFO "Pst, pst: Highest OK floor is ",
     $last_ok_floor;

my $tries       = 0;
my $ok_floor    = 1;
my $smash_floor = $total + 1;

for my $stop (@stops) {
    $tries++;
    if(!try_floor($stop, $last_ok_floor)) {
        $smash_floor = $stop;
        last;
    }
    $ok_floor = $stop;
}

for my $try_floor ( $ok_floor+1 .. 
                    $smash_floor-1) {
    $tries++;
    if(!try_floor($try_floor, 
                 $last_ok_floor) ) {
        $smash_floor = $try_floor;
        last;
    }
    $smash_floor = $try_floor + 1;
}

INFO "Highest OK floor: ", $smash_floor-1,
     " ($tries tries)";

###########################################
sub try_floor {
###########################################
    my($floor, $last_ok_floor) = @_;

    if($floor > $last_ok_floor) {
        INFO "Floor $floor: Wham, busted!";
        return 0;
    }

    INFO "Floor $floor: Okay.";
    return 1;
}
