I can get down to 300 bytes without using compression schemes or code packing
in to an eval (perl). I think the 176 was using a string compression of the code.
-- "SplinterFL" comments on the codegolf 99 bottles of beer game
What I can't fathom is how someone could possibly
solve this problem in 134 characters in PHP, the way eyepopslikeamosquito did.
That is insane my friend.
Probably ran a Perl solution through PHP's shell command functions.
-- Abdulla Arif comments on the codegolf savingtime game
Don't assume. It makes an "ass" out of "u" and "me".
-- David Brent in The Office
Though I can't comment on the 176 char bottles of beer solution that "SplinterFL"
was referring to,
please note that my 168 char solution uses just a humble sub
and a lowly print statement inside a simple for loop.
No need for any "string compression of the code".
As for my 134 character PHP saving time solution, I'm happy to reveal that
it does not "run a Perl solution through PHP's shell command functions".
It's just plain old PHP code.
No dirty tricks.
Just the usual blood, toil, tears and sweat.
Why on Earth do beginning golfers indulge in such unfounded speculations?
I don't know but a possible answer can be found by
remembering one of Beth's many insightful responses
where she perceptively noted that:
In the late 1990's Justin Kruger and David Dunning did a series
of studies demonstrating that the less skillful had a tendency
to overrate their abilities and fail to recognize expertise in others.
Anyway, after reading Abdulla's 234 char PHP solution
to the codegolf
Saving Time
challenge, namely:
<?fscanf(STDIN,'%d:%d',$h,$m);$s=array_combine(str_split('0b1a29384756
+'),array_fill(0,12,'o'));$s[$h=dechex($h>11?$h-12:$h)]='h';$s[$m=dech
+ex($m>59?0:$m/5)]=$h==$m?'x':'m';vprintf("%9s
%5s%8s
%s%14s
%s%16s
%s%14s
%5s%8s
%9s",$s)
?>
I refined his interesting approach
into a (shortened) 132 stroke Perl solution as follows:
<>=~/:/;@y=(o)x12;$y[$`%12]=h;$y[$'/5]=~y/oh/mx/;
printf'%9s
%5s%8s
%s%14s
%s%16s
%s%14s
%5s%8s
%9s',map{$y[$_],$y[11-$_]}0..5
To clarify precisely what problem this code is solving, and to make it easier to test
possible solutions, I've written a test program as follows:
# test.pl
use strict;
use warnings;
my $testprog = shift or die "usage: $0 program-file\n";
my $datafile = 'tt.txt';
my $cmd = "perl $testprog <$datafile";
sub build_file {
my $contents = shift;
open(my $fh, '>', $datafile) or die "open '$datafile': $!";
print $fh "$contents\n";
close($fh);
}
print "Testing $testprog, size=", -s $testprog, " bytes.\n";
my @testdata = (
[ '00:00', <<'EXPECTED' ],
x
o o
o o
o o
o o
o o
o
EXPECTED
[ '23:59', <<'EXPECTED' ],
o
x o
o o
o o
o o
o o
o
EXPECTED
[ '21:35', <<'EXPECTED' ],
o
o o
o o
h o
o o
m o
o
EXPECTED
[ '04:59', <<'EXPECTED' ],
o
m o
o o
o o
o h
o o
o
EXPECTED
[ '12:00', <<'EXPECTED' ],
x
o o
o o
o o
o o
o o
o
EXPECTED
[ '03:03', <<'EXPECTED' ],
m
o o
o o
o h
o o
o o
o
EXPECTED
[ '21:08', <<'EXPECTED' ],
o
o m
o o
h o
o o
o o
o
EXPECTED
[ '23:05', <<'EXPECTED' ],
o
h m
o o
o o
o o
o o
o
EXPECTED
[ '16:24', <<'EXPECTED' ],
o
o o
o o
o o
o x
o o
o
EXPECTED
[ '13:06', <<'EXPECTED' ],
o
o x
o o
o o
o o
o o
o
EXPECTED
[ '18:00', <<'EXPECTED' ],
m
o o
o o
o o
o o
o o
h
EXPECTED
[ '22:26', <<'EXPECTED' ],
o
o o
h o
o o
o o
o m
o
EXPECTED
[ '20:10', <<'EXPECTED' ],
o
o o
o m
o o
h o
o o
o
EXPECTED
);
for my $r (@testdata) {
print $r->[0], "\n";
build_file($r->[0]);
my $got = `$cmd`;
chomp($got);chomp($got);chomp($got);$got.="\n";
$got eq $r->[1] or die "expected:\n$r->[1]got:\n$got";
}
print "successful\n";
You can test possible solutions by running:
perl test.pl mysolution.pl
Note that the 132 stroke Perl solution given above is just a random example solution
to give you a working solution to this problem.
Better approaches are available.
Please feel free to golf this code.
Or speculate on the general approach I took to get down to 101 strokes.
If you do happen to speculate correctly, I'd be happy to congratulate you
and confirm a correct speculation.
I'm writing this node for fun and to see if the above two wildly-off-the-mark speculations
are really representative ... or if most golfers can speculate rather
better than that. :-)
References
Update: After this node was written, I described most
of the interesting solutions I'm aware of for both
the Saving Time and 99 Bottles of Beer golf games at:
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.