#!/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; }