say "Hello World!";
####
pugs hello.p6
####
Hello World!
####
# tsanta.pl. Santa Claus golf game test program.
use strict;
sub GolfScore {
my $script = shift;
open(FF, $script) or die "error: open '$script'";
my $golf = 0;
while () {
chomp; next unless length;
s/^#!.*?perl// if $. == 1;
$golf += length;
}
close(FF);
return $golf;
}
sub PrintGolfScore {
my @scr = @_;
my $tot = 0;
for my $s (@scr) { $tot += GolfScore($s) }
print "You shot a round of $tot strokes.\n";
}
sub BuildFile {
my ($fname, $data) = @_;
open(FF, '>'.$fname) or die "error: open '$fname'";
print FF $data;
close(FF);
}
sub CheckOne {
my ($scr, $label, $data, $exp) = @_;
my $intmp = 'in.tmp';
BuildFile($intmp, $data);
my $cmd = "pugs $scr $intmp";
print "$label: running: '$cmd'...";
my $out = `$cmd`; my $rc = $? >> 8;
print "done (rc=$rc).\n";
if ($out ne $exp) {
warn "Expected:\n"; print STDERR $exp;
warn "Got:\n"; print STDERR $out;
die "Oops, you failed.\n";
}
}
# -----------------------------------------------------
my $file1 = <<'GROK';
1st line
GROK
my $file2 = <<'GROK';
1st line
2nd line
GROK
my $file3 = <<'GROK';
1st line
2nd line
3rd line
GROK
my $file4 = <<'GROK';
1st line
2nd line
3rd line
4th line
GROK
my $file12 = <<'GROK';
1st line
2nd line
3rd line
4th line
5th line
6th line
7th line
8th line
9th line
10th line
11th line
12th line
GROK
my $file21 = <<'GROK';
1st line
2nd line
3rd line
4th line
5th line
6th line
7th line
8th line
9th line
10th line
11th line
12th line
GROK
# -----------------------------------------------------
sub CheckHead {
my ($scr) = @_;
my @tt = (
[ 'file1', $file1, "1st line\n" ],
[ 'file2', $file2, "1st line\n2nd line\n" ],
[ 'file3', $file3, "1st line\n2nd line\n3rd line\n" ],
[ 'file12', $file12,
"1st line\n2nd line\n3rd line\n4th line\n5th line\n".
"6th line\n7th line\n8th line\n9th line\n10th line\n" ],
);
for my $r (@tt) { CheckOne($scr, $r->[0], $r->[1], $r->[2]) }
}
sub CheckTail {
my ($scr) = @_;
my @tt = (
[ 'file1', $file1, "1st line\n" ],
[ 'file2', $file2, "1st line\n2nd line\n" ],
[ 'file3', $file3, "1st line\n2nd line\n3rd line\n" ],
[ 'file12', $file12,
"3rd line\n4th line\n5th line\n6th line\n7th line\n".
"8th line\n9th line\n10th line\n11th line\n12th line\n" ],
[ 'file21', $file21, "12th line\n\n\n\n\n\n\n\n\n\n" ],
);
for my $r (@tt) { CheckOne($scr, $r->[0], $r->[1], $r->[2]) }
}
sub CheckRev {
my ($scr) = @_;
my @tt = (
[ 'file1', $file1, "1st line\n" ],
[ 'file2', $file2, "2nd line\n1st line\n" ],
[ 'file3', $file3, "3rd line\n2nd line\n1st line\n" ],
[ 'file21', $file21,
"\n\n\n\n\n\n\n\n\n12th line\n11th line\n10th line\n".
"9th line\n8th line\n7th line\n6th line\n5th line\n".
"4th line\n3rd line\n2nd line\n1st line\n" ],
);
for my $r (@tt) { CheckOne($scr, $r->[0], $r->[1], $r->[2]) }
}
sub CheckMid {
my ($scr) = @_;
my @tt = (
[ 'file1', $file1, "1st line\n" ],
[ 'file2', $file2, "1st line\n2nd line\n" ],
[ 'file3', $file3, "2nd line\n" ],
[ 'file4', $file4, "2nd line\n3rd line\n" ],
[ 'file12', $file12, "6th line\n7th line\n" ],
[ 'file21', $file21, "11th line\n" ],
);
for my $r (@tt) { CheckOne($scr, $r->[0], $r->[1], $r->[2]) }
}
sub CheckWc {
my ($scr) = @_;
my @tt = (
[ 'file1', $file1, "0000000001\n" ],
[ 'file2', $file2, "0000000002\n" ],
[ 'file3', $file3, "0000000003\n" ],
[ 'file4', $file4, "0000000004\n" ],
[ 'file12', $file12, "0000000012\n" ],
[ 'file21', $file21, "0000000021\n" ],
);
for my $r (@tt) { CheckOne($scr, $r->[0], $r->[1], $r->[2]) }
}
# -----------------------------------------------------
my $head = 'head.p6';
my $tail = 'tail.p6';
my $rev = 'rev.p6';
my $mid = 'mid.p6';
my $wc = 'wc.p6';
select(STDERR);$|=1;select(STDOUT);$|=1; # auto-flush
-f $head or die "error: file '$head' not found.\n";
-f $tail or die "error: file '$tail' not found.\n";
-f $rev or die "error: file '$rev' not found.\n";
-f $mid or die "error: file '$mid' not found.\n";
-f $wc or die "error: file '$wc' not found.\n";
PrintGolfScore($head, $tail, $rev, $mid, $wc);
CheckHead($head);
CheckTail($tail);
CheckRev($rev);
CheckMid($mid);
CheckWc($wc);
PrintGolfScore($head, $tail, $rev, $mid, $wc);
print "Hooray, you passed.\n";
####
*** Eugene van der Pijll: 89 (11 19 13 25 21) ***
--- head.pl ---------------------------------------------
#!/usr/bin/perl -p
11..exit
--- tail.pl ---------------------------------------------
print+(<>)[-10..-1]
--- rev.pl ---------------------------------------------
#!/usr/bin/perl -p
$\=$_.$\}{
--- mid.pl ---------------------------------------------
#!/usr/bin/perl -p0
$_=$1while/.^(.+)^/ms
--- wc.pl ---------------------------------------------
printf"%010d\n",$.,<>
####
--- head.p6 ---------------------------------------------
my$h=open@ARGS[0];print(($h.readline())[0..9])
--- tail.p6 ---------------------------------------------
my$h=open@ARGS[0];my@l=$h.readline();
my$i;for(@l){++$i}
$i=$i-10;$i=0 if$i<0;
print@l[$i..Inf]
--- rev.p6 ---------------------------------------------
my$h=open@ARGS[0];my@l=$h.readline();
my$x;for(@l){$x=$_~$x}
print$x;
--- mid.p6 ---------------------------------------------
# Note: works for Pugs 6.0.10 but will require removal
# of -0.1 below for Pugs 6.0.11.
my$h=open@ARGS[0];my@l=$h.readline();
my$i;for(@l){++$i}
print@l[int(($i-1)/2-0.1)..int($i/2-0.1)]
--- wc.p6 ---------------------------------------------
my$h=open@ARGS[0];my@l=$h.readline();
my$i;for(@l){++$i}
say join"",(split"",int(7e10+$i))[1..Inf];
####
You shot a round of 398 strokes.
file1: running: 'pugs head.p6 in.tmp'...done (rc=0).
file2: running: 'pugs head.p6 in.tmp'...done (rc=0).
file3: running: 'pugs head.p6 in.tmp'...done (rc=0).
file12: running: 'pugs head.p6 in.tmp'...done (rc=0).
file1: running: 'pugs tail.p6 in.tmp'...done (rc=0).
file2: running: 'pugs tail.p6 in.tmp'...done (rc=0).
file3: running: 'pugs tail.p6 in.tmp'...done (rc=0).
file12: running: 'pugs tail.p6 in.tmp'...done (rc=0).
file21: running: 'pugs tail.p6 in.tmp'...done (rc=0).
file1: running: 'pugs rev.p6 in.tmp'...done (rc=0).
file2: running: 'pugs rev.p6 in.tmp'...done (rc=0).
file3: running: 'pugs rev.p6 in.tmp'...done (rc=0).
file21: running: 'pugs rev.p6 in.tmp'...done (rc=0).
file1: running: 'pugs mid.p6 in.tmp'...done (rc=0).
file2: running: 'pugs mid.p6 in.tmp'...done (rc=0).
file3: running: 'pugs mid.p6 in.tmp'...done (rc=0).
file4: running: 'pugs mid.p6 in.tmp'...done (rc=0).
file12: running: 'pugs mid.p6 in.tmp'...done (rc=0).
file21: running: 'pugs mid.p6 in.tmp'...done (rc=0).
file1: running: 'pugs wc.p6 in.tmp'...done (rc=0).
file2: running: 'pugs wc.p6 in.tmp'...done (rc=0).
file3: running: 'pugs wc.p6 in.tmp'...done (rc=0).
file4: running: 'pugs wc.p6 in.tmp'...done (rc=0).
file12: running: 'pugs wc.p6 in.tmp'...done (rc=0).
file21: running: 'pugs wc.p6 in.tmp'...done (rc=0).
You shot a round of 398 strokes.
Hooray, you passed.