解答数と言語別の内訳は
小飼弾です。答案作成、
総解答数は23
言語 | 解答数 | 正答数 |
---|---|---|
Perl | 5 | 1 |
Python | 5 | 1 |
Java | 2 | 1 |
PHP | 1 | 0 |
Ruby | 1 | 0 |
C | 1 | 0 |
C++ | 1 | 1 |
R | 1 | 1 |
Shell Script | 1 | 1 |
Squeak Smalltalk | 1 | 1 |
【番外】 | ||
日本語 | 2 | 0 |
URL | 1 | 0 |
「番外」
しかしコーダーであれば、
解答評価のポイント
アルゴリズム
Perlによる実装も本記事の末尾に載せておきます。具体的には、
Message:mmmmmmmm
Pixel: RRRRRmmmGGGGGGmmBBBBBmmm
なぜPNGやBMPはOKでJPEGはだめなのか、
せっかく画像をアップロードしても、
また、
しかし、
きちんとテストを!
きちんとテストをした上で答案を提出しなかった人が多かったのは残念な点です。今回、
# 4ピクセルを使って1バイトを埋め込む。
# 赤成分に4bit,青成分に4bitを割り振る。
# 人間の目は緑に敏感だとかというのをどこかで聞いたので、
# 緑成分は変更しないでみる。気休め程度かも。
しかし、
- デコーダー
- ⇒問題のembedded.
pngからメッセージがきちんと取り出せればよい - エンコーダー
- ⇒source.
pngにメッセージを埋め込んで、 結果の映像がembedded. pngとピクセル単位で合致すればよい
にもかかわらず、
濫用可能なコードを書いたら幇助罪に?
ところで、
しかし、
私や解答者のみなさんも、
濫用可能なコードを書いたら幇助罪が適用されるとなっては、
- Dan the Open Source Programmer
#!/usr/bin/env perl
use strict;
use warnings;
use Imager;
use Perl6::Slurp;
sub transcode {
my ( $imgfile, $txtfile, $outfile ) = @_;
my $img = Imager->new();
$img->read( file => $imgfile ) or die $img->errstr;
$img->write( data => \my $pnm, type => 'pnm' ) or die $img->errstr;
my $hdr = do {
$pnm =~ s/((?:[^\n]+\n){4})//;
$1;
};
my @pnm = map { ord } split //, $pnm;
if ( !$txtfile ) { # decode
my $txt = '';
for my $i ( 0 .. +@pnm / 3 ) {
my $ord =
( ( $pnm[ 3 * $i ] & 0b00000111 ) << 5 ) +
( ( $pnm[ 3 * $i + 1 ] & 0b00000011 ) << 3 ) +
( $pnm[ 3 * $i + 2 ] & 0b00000111 );
last if !$ord;
$txt .= chr $ord;
}
print $txt;
}
else { # encode
my $txt = slurp $txtfile;
die "image too small" if @pnm < length $txt;
my $i = 0;
for my $ord ( unpack 'C*', $txt . "\0" ) {
my $r = ( $ord & 0b11100000 ) >> 5;
my $g = ( $ord & 0b00011000 ) >> 3;
my $b = $ord & 0b00000111;
$pnm[ $i ] = ( $pnm[ $i ] & 0b11111000 ) | $r;
$pnm[ $i + 1 ] = ( $pnm[ $i + 1 ] & 0b11111100 ) | $g;
$pnm[ $i + 2 ] = ( $pnm[ $i + 2 ] & 0b11111000 ) | $b;
$i += 3;
}
$pnm = $hdr . pack 'C*', @pnm;
$img->read( data => $pnm ) or die $img->errstr;
if ($outfile) {
$img->write( file => $outfile ) or die $img->errstr;
}
else {
$img->write( fh => \*STDOUT, type => 'png' ) or die $img->errstr;
}
}
}
transcode @ARGV;
__END__