りはびりぱーる

ちょっと余所見してる間に、はてなソースコードへの色つけしてくれるようになってるらしいしPerlリハビリ。
実用性が皆無なソートアルゴリズムボゴソートでも実装してみましょう。

#!/usr/bin/perl

@a=<>=~/\d+/g; # 入力を一行読んで、その結果で\d+にマッチする部分を配列として@aに代入。
while(1){
  for($p=$a[$n=0];$p<=$a[$n];$p=$a[$n++]){} # @aはどこまでソートされてるかなー
  last if($n==@a);# @aはソート済みだから終わる
  # ソートされてなかったから@aを適当にシャッフル
  for($n=0;$n<@a;++$n){
    @a[$n..@a]=(splice(@a, $n+int rand(@a-$n), 1), @a[$n..$#a]);
  }
}
print"@a"; # ソート済みの@aを表示

こんなかんじ。実行結果は?

% perl bogosort.pl
1 3 33 34  454 421 111 <- 入力行
1 3 33 34 111 421 454 <- 出力行
% perl bogosort.pl
1 34 45 952 727 13 1 <- 入力行
1 1 13 34 45 727 952 <- 出力行

ああちゃんとソートできてるじゃんすごいすごい。でも10個くらいの値を渡したらなかなか終わらなかったり。

spliceなどという便利な組み込み関数を知らなかったので

  for(@b=();@a;){
    push@b,splice(@a, int rand@a, 1);
  }
  @a=@b

なんて方法で配列のソートをしていた。こーいう超基本的な関数とかよくわかってないからCodeGolfで上の方行けねえんだろか。

http://codegolf.com/reverseなんて、splice使ったら縮むかなとか思って今見てみたら、

1st 	kinaba 	51 	Ruby

51バイトってうわあ別次元だ。一番良い記録出せてるhttp://codegolf.com/pascals-triangleとかも、どうやったらもっと縮むのかさっぱりわからない。

test