ブロックソートの復号

30分プログラム、その794。id:mzp:20100814:bwtの続きでブロックソートの復号。
ブロックソート - Wikipediaには『復号は簡単』って書いてあったけど、普通に難しかったよ! あとなんかキレいに書けなかったよ!

使い方

$ perl block_sort.pl 3 ccoaa
cacao

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
use strict;
use warnings;
use Data::Dumper;
use sort 'stable';

sub decode($$){
    my ($n,$str) = @_;
    my @xs = split(//,$str);
    my $length = @xs;
    my @ys = sort { $xs[$a-1] cmp $xs[$b-1]} (1..$length);

    my @zs = ();
    my $i  = $ys[$n-1];
    while(@zs < $length) {
	push @zs,$xs[$i-1];
	$i = $ys[$i-1];
    }
    return join("",@zs);
}

my $str = decode($ARGV[0],$ARGV[1]);
print "$str\n";