From: Gavin Kistner 
> Following are the results I obtained from running my test 
> script against everyone's submissions.

Oops. I found a small bug in my test script's counting of offsets.
(Large update intervals would cause it to think that the class was
transitioning outside of a +/- 5 minute range.)

Here are updated results and test script. Sorry for the bandwidth. :)

C:\Ruby\Quiz\FuzzyTime>testall.bat

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb BenGiddings_1.rb
Loaded suite BenGiddings_1
Started
F
Finished in 0.016 seconds.

  1) Failure:
test_running(FuzzyTimeTester)
    [./test_fuzzytime.rb:33:in `test_running'
     ./test_fuzzytime.rb:27:in `times'
     ./test_fuzzytime.rb:27:in `test_running'
     ./test_fuzzytime.rb:23:in `each'
     ./test_fuzzytime.rb:23:in `test_running']:
<Mon Nov 06 23:04:15 -0700 2006> expected but was
<Mon Nov 06 23:04:13 -0700 2006>.

1 tests, 3 assertions, 1 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb CameronPope_1.rb
Loaded suite CameronPope_1
Started
2 second advance: 0.0% behind, 38.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%   0%   0%   0%  0.7%  0%   12%  41%  46%

6 second advance: 0.0% behind, 31.8% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%   0%   0%  0.7% 4.8% 9.6%  25%  38%  22%

17 second advance: 1.8% behind, 19.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 0.7% 0.7% 2.7% 6.2%  11%  14%  19%  21%  18% 6.2%

30 second advance: 3.2% behind, 16.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
1.4% 2.1% 1.4% 3.4% 6.2%  19%  14%  18%  23% 9.0% 3.4%

47 second advance: 6.8% behind, 14.2% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
5.6% 3.5% 5.6% 5.6%  11%  13%  16%  15%  16% 5.6% 3.5%

60 second advance: 11.5% behind, 9.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 10% 7.6% 6.3%  11%  13%  15%  15%  12% 6.3% 4.2% 0.7%

65 second advance: 9.8% behind, 10.2% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 11% 4.8% 8.3%  10% 9.0%  18%  14%  14% 6.2% 3.4%  0%

120 second advance: 22.5% behind, 9.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 26%  20%  0%   17%  0%   17%  0%   15%  0%  4.9%  0%

290 second advance: 27.2% behind, 9.4% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 64%  10% 2.9% 5.0% 2.9% 6.5% 3.6% 2.2% 1.4% 1.4%  0%

.
Finished in 16.937 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb DamienPetrelli_1.rb
Loaded suite DamienPetrelli_1
Started
F
Finished in 0.016 seconds.

  1) Failure:
test_running(FuzzyTimeTester)
    [./test_fuzzytime.rb:33:in `test_running'
     ./test_fuzzytime.rb:27:in `times'
     ./test_fuzzytime.rb:27:in `test_running'
     ./test_fuzzytime.rb:23:in `each'
     ./test_fuzzytime.rb:23:in `test_running']:
<Mon Nov 13 12:19:40 -0700 2006> expected but was
<Sun Oct 22 09:22:42 -0600 2006>.

1 tests, 1 assertions, 1 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb DanielLucraft_1.rb
Loaded suite DanielLucraft_1
Started
2 second advance: 7.8% behind, 17.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  9.0% 7.6%  10%  11%  10%  12% 7.6% 4.2%  16%  12%

6 second advance: 7.3% behind, 16.0% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  11% 5.5%  15% 9.0%  12%  12% 9.7% 5.5%  13% 6.2%

17 second advance: 9.9% behind, 17.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  13%  16% 6.9% 7.6% 8.3% 6.2% 9.0%  14% 9.0% 9.7%

30 second advance: 9.9% behind, 15.0% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   12% 6.9%  15%  13% 8.3% 7.6%  10% 7.6%  10% 9.0%

47 second advance: 10.3% behind, 13.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  11%  14%  10%  12%  12%  10%  10% 5.5% 5.5% 8.3%

60 second advance: 8.1% behind, 15.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   12% 9.0%  10%  13%  12%  11% 8.3% 9.7% 6.2% 8.3%

65 second advance: 8.8% behind, 16.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  10%  14% 9.0%  10% 9.0%  10% 9.0% 9.0% 8.3%  10%

120 second advance: 6.1% behind, 20.4% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
8.4%  0%   17%  0%   22%  0%   19%  0%   20%  0%   13%

290 second advance: 7.4% behind, 18.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 14%  12% 6.5%  12%  11%  11% 7.9%  12% 6.5% 3.6% 4.3%

.
Finished in 28.344 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb GavinKistner_1.rb
Loaded suite GavinKistner_1
Started
2 second advance: 0.3% behind, 20.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%   0%   0%   10%  20%  27%  19% 8.3%  15%

6 second advance: 0.9% behind, 24.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%   0%  5.5% 6.8%  11%  25%  18%  12%  21%

17 second advance: 13.1% behind, 12.0% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
3.4%  12%  14% 7.6%  12%  12% 9.0% 9.0% 5.5% 9.0% 6.2%

30 second advance: 9.2% behind, 14.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
2.8% 6.3% 7.6%  15% 6.3% 9.0%  12%  15%  11% 8.3% 6.3%

47 second advance: 6.1% behind, 22.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
4.1% 6.9% 2.8% 5.5% 5.5% 9.0% 6.9% 9.7%  18%  19%  12%

60 second advance: 7.0% behind, 18.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
3.4% 9.0% 6.2% 4.8%  12% 9.7%  14% 9.7% 8.3%  12%  12%

65 second advance: 12.2% behind, 15.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
7.6%  11%  13% 6.9% 9.0% 8.3% 5.5%  12% 9.0%  11% 6.2%

120 second advance: 6.8% behind, 23.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 12%  0%   17%  0%   19%  0%   12%  0%   21%  0%   19%

290 second advance: 14.1% behind, 18.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 34% 5.5% 8.3% 5.5% 5.5% 9.0% 8.3% 6.2% 6.2% 4.8% 6.2%

.
Finished in 17.828 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb JeremyHinegardner_1.rb
Loaded suite JeremyHinegardner_1
Started
2 second advance: 0.0% behind, 43.0% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%  0.7%  0%   0%   0%   0%   0%  1.4%  22%  76%

6 second advance: 0.0% behind, 38.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%  0.7%  0%   0%   0%   0%  9.6%  46%  43%

17 second advance: 0.0% behind, 31.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 0.7%  0%   0%   0%  0.7% 2.1%  12%  36%  34%  15%

30 second advance: 0.4% behind, 25.0% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%   0%  2.1% 6.2% 9.7%  22%  29%  23% 7.6%

47 second advance: 0.8% behind, 23.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%  2.1% 4.1% 8.2%  15%  21%  21%  18% 8.9%

60 second advance: 0.5% behind, 21.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%  1.4% 2.8%  17%  18%  15%  20%  19% 6.9%

65 second advance: 1.2% behind, 18.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%  0.7% 4.1% 8.3%  15%  18%  21%  19%  12% 2.1%

120 second advance: 6.1% behind, 11.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 5.6%  0%   20%  0%   30%  0%   33%  0%   11%  0%

290 second advance: 11.1% behind, 14.8% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 23%  11%  12%  11%  11% 5.0% 9.9% 7.1% 4.3% 3.5% 1.4%

.
Finished in 19.016 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb MarcelWard_1.rb
Loaded suite MarcelWard_1
Started
2 second advance: 5.9% behind, 15.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 2.8% 4.1% 9.7%  11%  12%  15%  12%  11%  10%  10%

6 second advance: 6.7% behind, 15.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 3.4% 4.1%  10%  12% 8.2%  13%  17%  12%  10% 8.9%

17 second advance: 7.1% behind, 15.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  2.8% 6.9%  13%  13%  12% 7.6%  11%  13%  13% 7.6%

30 second advance: 8.1% behind, 15.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  7.6% 6.2%  13% 4.1%  14%  10%  12%  12% 9.0%  11%

47 second advance: 6.8% behind, 17.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
2.7% 4.1% 4.8%  12%  12%  11% 6.2%  14%  10%  14% 8.9%

60 second advance: 9.7% behind, 13.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
3.4% 9.7% 9.7% 9.7% 6.9%  12%  13%  12%  12% 7.6% 2.8%

65 second advance: 6.4% behind, 16.2% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
1.4% 5.5% 6.9% 9.7% 8.3%  15%  12%  10%  12%  12% 6.9%

120 second advance: 6.0% behind, 17.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
9.0%  0%   17%  0%   24%  0%   22%  0%   24%  0%  4.2%

290 second advance: 8.4% behind, 14.8% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 19%  12% 9.3%  14%  10%  11% 9.3% 7.1% 4.3% 3.6% 1.4%

.
Finished in 22.282 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb PaoloNegri_1.rb
Loaded suite PaoloNegri_1
Started
2 second advance: 8.3% behind, 10.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 2.7% 9.6%  14%  10%  14%  16%  14%  12% 4.8% 2.1%

6 second advance: 8.0% behind, 11.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  2.1% 8.3% 9.0%  16%  16%  12%  12%  12% 8.3% 4.9%

17 second advance: 7.4% behind, 11.4% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  5.5% 4.8% 9.0%  17%  10%  21% 9.0%  12% 9.7% 1.4%

30 second advance: 7.5% behind, 11.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 4.8% 8.3% 9.0%  19%  16%  14% 9.0% 5.5%  11% 2.1%

47 second advance: 8.3% behind, 10.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 6.9% 8.3%  12%  18%  11%  15%  12% 9.0% 4.1% 2.1%

60 second advance: 7.2% behind, 11.2% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 3.4%  12% 9.7%  17%  14%  14%  13%  10% 4.8% 1.4%

65 second advance: 6.8% behind, 13.2% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
2.1% 5.6% 7.6%  12%  15%  12%  16%  13%  10% 5.6% 2.1%

120 second advance: 9.4% behind, 11.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 13%  0%   28%  0%   22%  0%   25%  0%   12%  0%   0%

290 second advance: 9.1% behind, 12.8% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 22%  12%  11%  12% 9.7%  12% 7.6% 6.2% 2.8% 3.4% 1.4%

.
Finished in 18.89 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb RobertConn_1.rb
Loaded suite RobertConn_1
Started
2 second advance: 0.0% behind, 49.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  0.7%  0%   0%   0%   0%   0%   0%   0%   0%   99%

6 second advance: 0.0% behind, 48.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%  0.7%  0%   0%   0%   0%   0%   0%   0%   99%

17 second advance: 0.0% behind, 46.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%   0%   0%   0%  0.7%  0%  1.4% 9.0%  89%

30 second advance: 0.0% behind, 44.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%   0%   0%   0%  0.7%  0%  5.6%  19%  74%

47 second advance: 0.0% behind, 41.8% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%   0%   0%  0.7% 2.1% 2.1%  13%  31%  50%

60 second advance: 0.2% behind, 38.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%  0.7% 0.7% 4.1% 2.8%  10%  13%  20%  48%

65 second advance: 0.3% behind, 40.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%  1.4% 1.4% 1.4% 2.1% 5.6%  14%  28%  47%

120 second advance: 1.9% behind, 25.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
2.1% 2.8%  0%  2.8%  0%   16%  0%   30%  0%   46%  0%

290 second advance: 10.1% behind, 27.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 13% 5.5% 2.4% 3.1% 8.7% 7.9%  13%  15%  10%  11%  10%

.
Finished in 17.453 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb ThomasMueller_1.rb
Loaded suite ThomasMueller_1
Started
2 second advance: 0.0% behind, 43.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%   0%   0%   0%   0%   0%   0%   15%  85%

6 second advance: 0.0% behind, 37.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  0.7%  0%   0%   0%   0%   0%  0.7%  14%  48%  36%

17 second advance: 0.0% behind, 32.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%   0%   0%  0.7% 2.1%  14%  26%  41%  17%

30 second advance: 0.4% behind, 26.8% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%  1.4% 2.1% 2.8%  12%  18%  28%  22%  13%

47 second advance: 0.8% behind, 23.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%  0.7% 1.4% 3.5% 9.0%  17%  21%  17%  21% 9.7%

60 second advance: 2.1% behind, 17.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  0.7% 1.4% 4.8%  10%  15%  16%  13%  27% 9.0% 2.8%

65 second advance: 1.2% behind, 19.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  0.7%  0%  2.1%  11%  12%  21%  17%  19%  16% 2.1%

120 second advance: 3.9% behind, 14.2% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  3.4%  0%   16%  0%   30%  0%   34%  0%   17%  0%

290 second advance: 5.7% behind, 14.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 11%  11%  11%  14%  13%  12% 9.2% 8.5% 3.5% 2.1% 3.5%

.
Finished in 17.234 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb TomPollard_1.rb
Loaded suite TomPollard_1
Started
2 second advance: 0.0% behind, 46.8% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%   0%   0%   0%   0%   0%  0.7% 4.8%  94%

6 second advance: 0.0% behind, 42.8% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  0.7%  0%   0%   0%   0%   0%   0%  5.5%  32%  62%

17 second advance: 0.0% behind, 33.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%   0%  0.7% 0.7% 3.4% 8.3%  26%  33%  28%

30 second advance: 0.1% behind, 31.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7%  0%   0%   0%  0.7%  0%  5.5%  16%  29%  28%  21%

47 second advance: 0.8% behind, 23.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%  2.1% 2.1% 9.7%  14%  21%  25%  14%  12%

60 second advance: 1.3% behind, 23.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 0.7% 0.7% 3.4% 4.8% 7.6%  19%  17%  14%  23% 8.3%

65 second advance: 1.1% behind, 22.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%  0.7% 2.1% 9.0% 9.0%  17%  20%  17%  18% 7.6%

120 second advance: 5.7% behind, 13.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 8.3%  0%   18%  0%   28%  0%   30%  0%   15%  0%

290 second advance: 8.7% behind, 15.1% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 17%  12%  13% 9.5%  10% 9.5% 8.0% 8.0% 6.6% 5.8% 0.7%

.
Finished in 17.859 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors

C:\Ruby\Quiz\FuzzyTime>ruby -rtest_fuzzytime.rb TomPollard_2.rb
Loaded suite TomPollard_2
Started
2 second advance: 0.0% behind, 49.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%  0.7%  0%   0%   0%   0%   0%   0%   99%

6 second advance: 0.0% behind, 48.9% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%   0%   0%   0%  0.7%  0%   0%   0%   0%  2.1%  97%

17 second advance: 0.0% behind, 45.5% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 0%  0.7%  0%   0%   0%   0%   0%  0.7% 5.5%  17%  77%

30 second advance: 0.8% behind, 38.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
0.7% 0.7% 2.1%  0%  0.7% 1.4% 3.4% 3.4%  16%  26%  46%

47 second advance: 5.9% behind, 23.2% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
2.8% 3.4% 6.9% 4.8% 9.7%  12% 5.5% 7.6%  12%  15%  21%

60 second advance: 12.9% behind, 13.3% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 10%  11%  11% 9.0% 9.0% 9.0%  10% 9.0% 9.7% 7.6% 4.1%

65 second advance: 16.8% behind, 14.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 23%  10% 7.5% 9.6% 9.6% 4.8% 4.8% 8.2% 7.5% 8.2% 6.8%

120 second advance: 9.2% behind, 18.6% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
4.9%  13%  0%   13%  0%   10%  0%   32%  0%   27%  0%

290 second advance: 29.9% behind, 8.7% ahead
 -5   -4   -3   -2   -1    0   +1   +2   +3   +4   +5
 72% 9.0% 3.5% 4.9% 3.5% 2.1% 4.2% 1.4%  0%   0%   0%

.
Finished in 19.25 seconds.

1 tests, 142380 assertions, 0 failures, 0 errors


====
Updated test script
====

require 'test/unit'

$DEBUG = false

class Time
  def to_fuzzy
    s = strftime("%H:%M")
    s[4] = "~"
    s
  end
  def short
    strftime("%H:%M")
  end
  def round_to( seconds )
    seconds = seconds.round
    Time.at( self.to_i / seconds * seconds )
  end
end

RUNS_PER_SET = 1
class FuzzyTimeTester < Test::Unit::TestCase
  def test_running
    [ 2, 6, 17, 30, 47, 60, 65, 120, 290 ].each{ |advance_seconds|
      runs, num_ahead, num_behind = 0, 0, 0
      offsets = Hash.new(0)
      
      RUNS_PER_SET.times{
        t = Time.at( Time.new + rand( 3600 * 300 ) )
        end_time = t + 60 * 60 * 24 # Run for 24 hours
        ft = FuzzyTime.new( t )
        last_value = nil
        while( t < end_time )
          assert_equal t, ft.actual
          t0 = Time.at( t - 60 * 5 )
          t2 = Time.at( t + 60 * 5 )
          legal_values = [ t0, t, t2 ].map{ |x| x.to_fuzzy }.uniq

          fuzzy_fuzz = ft.to_s      

          if last_value
            y,mon,day = t.year, t.mon, t.day
            h,m = last_value.scan(/\d+/).map{ |s| s.to_i }
            m *= 10
            if (m -= 10) < 0
              m %= 60
              if (h -= 1) < 0
                h %= 24
              end
            end
            illegal_old_value = Time.local( y,mon,day,h,m ).to_fuzzy
            legal_values -= [ illegal_old_value ]
            if $DEBUG
              puts "Now: %s=>%s; legal: %s (was %s, can't be %s)" % [
                t.short, fuzzy_fuzz,
                legal_values.inspect, last_value,
                illegal_old_value
              ]
            end
          end
  
          assert_block( ( "It is %s, the clock displayed %s,\n" +
                        "but it should only display one of %s.\n" +
                        "(Last time I asked, it said it was %s.)" ) % [
            t.short, fuzzy_fuzz.inspect,
            legal_values.inspect,
            last_value
          ] ){
            legal_values.include?( fuzzy_fuzz )
          }
    
          actual_fuzz = t.to_fuzzy
          ahour, amin = actual_fuzz.scan( /\d+/ ).map{ |x| x.to_i }
          fhour, fmin = fuzzy_fuzz.scan( /\d+/ ).map{ |x| x.to_i }
          if fuzzy_fuzz != actual_fuzz
            if fmin>amin || fhour>ahour || ( fhour==0 && ahour==23 )
              num_ahead += 1
            else
              num_behind +=1
            end
          end
        
          if fuzzy_fuzz != last_value
            ahour2, amin2 = t.short.scan( /\d+/ ).map{ |x| x.to_i }
            if fmin>amin || fhour>ahour || ( fhour==0 && ahour==23 )
              offset = ( fmin*10 - amin2 ) % 60
            else
              offset = ( fmin*10 - amin2 )
            end
            offset = [-5, [ 5, offset ].min ].max
            offsets[ offset ] += 1
            if $DEBUG
              puts ( "It is %s, I just switched from %s to %s, " + 
                     "and I think that's an offset of %+d" ) % [
                t.short, last_value, fuzzy_fuzz, offset
              ]
            end
          end
          runs += 1      
          last_value = fuzzy_fuzz
          ft.advance( advance_seconds )
          t += advance_seconds
        end
      }
      
      puts "%d second advance: %.1f%% behind, %.1f%% ahead" % [
        advance_seconds,
        100.0 * num_behind / runs,
        100.0 * num_ahead / runs
      ]
      total_offsets = offsets.inject(0){ |sum,kv| sum+kv[1] }
      -5.upto(5){ |o|
        print "#{o>0?'+':''}#{o}".center( 5 )
      }; print "\n"
      -5.upto(5){ |o|
        pct = 100.0 * offsets[o] / total_offsets
        print( ( "%.#{(pct<10&&pct>0)?1:0}f%" % pct ).center( 5 ) )
      }; puts "\n "
    }
  end
end