前の日 / 次の日 / 2010-04
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2010-04-17 Sat

Perl で配列の要素を回転させる

Perl で配列の要素を回転させるときのコードってどんなんかな?、と頭の中でコードを思い浮かべたので、メモ。

rotate($$) は配列を回転する処理です。第一引数に配列のリファレンスを与えます。第二引数に第一引数で与えた配列の要素のうち回転後の配列で先頭になって欲しい要素番号を与えます。出力としては、例えば、配列 (1, 2, 3, 4, 5) のリファレンスと、2 という配列の添字を rotate() に与えると、配列 (3, 4, 5, 1, 2) のリファレンスが得られます。

実際には rotate() を for 文で繰り返しおこなって全ての回転を得たり、重複を取り除いたりする処理とあわせて使うのかな。文字の回転だったら、substr で全部やれるし、入力と出力が同じ長さになるから、もっと簡単に書ける気がします。

コメントを書く変わりに長い変数名に意味を込めました。第二引数で与えられた引数が第一引数で与えられた配列の範囲外だったり、第二引数で与えられた引数が負の値だった場合には無言で第一引数を返してます。場合によっては警告を出したほうがいいかも。そもそもrotate()を呼ぶより前にチェックしとけばいいですね。

#!/usr/bin/env perl                                                    

use strict;
use warnings;
use utf8;

use YAML;

sub rotate {
    my ($seq_arr_ref, $start_att_num) = @_;
    my @result_arr = ();
    my $last_att_num = $#{$seq_arr_ref};
    my $diff_num = $last_att_num - $start_att_num;
    if (($diff_num >= 0) && ($last_att_num > 0) && ($start_att_num >= 0)) {
        my $cursor = 0;
        for (my $i = 0; $i <= $last_att_num ;$i++) {
            if (($diff_num - $i) >= 0) {
                $result_arr[$cursor] = $seq_arr_ref->[$start_att_num + $i];
            }
            else {
                my $abs_i = (($diff_num - $i) * -1) - 1;
                $result_arr[$cursor]  =  $seq_arr_ref->[$abs_i];
            }
            $cursor++;
        }
    }
    else {
        @result_arr = @{$seq_arr_ref};
    }
    return \@result_arr;
}

sub fetch {
    my @sample_arr = (
               ['a', 'a::b', 'a::c', 'd', 'c::f'],
               ['a::d', 'c', 'b::c', 'a::e'],
               ['e::f', 'a::b', 'd::f', 'c', 'b'],
               ['e', 'a::f', 'c', 'b', 'c'],
              );

    foreach my $sequence_arr_ref (@sample_arr) {
        print Dump &rotate($sequence_arr_ref, 3);
    }
}

&fetch();


実行すると、以下のようになります。

---
- d
- c::f
- a
- a::b
- a::c
---
- a::e
- a::d
- c
- b::c
---
- c
- b
- e::f
- a::b
- d::f
---
- b
- c
- e
- a::f
- c


こういうのをブログに書いておくとペタっと貼れていい感じ。

次は順列を得るコードが欲しくなってきたなぁ。

コンピュータサイエンスのための 離散数学入門 : 第2版

[Amazonで詳細を見る]

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

弟に娘が生まれて叔父になった

今日の午前4時37分に弟夫婦に娘が生まれたそうです。予定日より20日も早いから 2405g なんだとか。でも、元気そうなのでよかったよかった。

ということで叔父になりました。

お祝いに何を買ってあげようか悩むけど、とりあえず、きむらゆういち先生の定番本は買ってあげようかな。

いないいないばああそび (あかちゃんのあそびえほん)

[Amazonで詳細を見る]


今日は、書くこと無いかな?と思っていたら、良いニュースがあってよかった!!

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |