I’ve been doing the Perl Weekly
Challenges. The
latest
was about a bad encoding scheme and producing the source of a program.
The encoder clearly needs to strip spaces, chop the source into
sections, and slice transversely. This is all fairly standard stuff.
my $l=length($in)-1;
my @out;
foreach my $c (0..$o{n}-1) {
my $out;
for (my $k=$c;$k<=$l;$k+=$o{n}) {
$out.=substr($in,$k,1);
}
push @out,$out;
}
print join(' ',@out),"\n";
It turns out that to decode you don't even need to know the key number
(because it's given by the "word" length)). Decoding was not required,
but one might as well.
my @in;
while (<>) {
chomp;
push @in,split ' ',$_;
}
my @out;
foreach my $n (0..length($in[0])-1) {
foreach my $w (@in) {
if (length($w)<$n+1) {
last;
}
push @out,substr($w,$n,1);
}
}
print join('',@out),"\n";
The Perl6 (Raku) encoder is similar.
As for producing quines, I've never had much interest; like perl golf
(producing a program in as few characters as possible), I think it's
harmful to the language community when this sort of thing is regarded
as a major activity. So here's two fingers up to the computational
purist, and a program that simply reads its own source code.
#! /usr/bin/perl
use strict;
use warnings;
open F,$0;
print <F>;
Perl6:
#! /usr/bin/perl6
my $f=open :r,$*PROGRAM-NAME;
for $f.lines {
say $_;
}
Comments on this post are now closed. If you have particular grounds for adding a late comment, comment on a more recent post quoting the URL of this one.