作者: Noritsugu Nakamura
日時: 2002/11/20(20:14)
中村 のりつぐ です。

In article <20021115203106M.nnakamur@...> 
Noritsugu Nakamura <nnakamur@...> wrote:
> > 最近ちょっとした用事で必要があって,
> > 
> > 1,2,3,5,7,8,10,12,14,15,16,17
> > 
> > の様なソート済番号のリストを,
> > 
> > 1-3,5,7-8,10,12,14-17
> > 
> > の様な表現に直すスクリプトを Perl でつくりました.
> 
> 数ヵ月前に欲しかった (^_^;
> # ありそうで見つからなかったので自分で作った
> # (会社に置いてある)

そのとき作ったもの + ちょっと変更
もともと、最大数が決まっていて、
# 3 --> 1,2,4-26
# 2 --> 1,3-26
# 2, 3, 4 --> 1,5-26
という仕様で作っていたので色々変かも。
# という前に正しいかどうかもあやしい…。

#!/usr/bin/env perl

$max_phase = 26;

##### ##### ##### #####
#
# 3 --> 1,2,4-26
# 2 --> 1,3-26
# 2, 3, 4 --> 1,5-26
#
# 
sub format_range {
    # 数字の配列を仮定
    my(@ok_phase) = @_;
    my($phase, %ok_phase);
    my($ret_val, $last_phase);

    foreach $phase (@ok_phase) {
        $ok_phase{$phase} = 1;
    }

    # 範囲文字列の作成
    # 最初の OK phase を取得
    $last_phase = 0;
    foreach $phase (1..$max_phase) {
        if (exists($ok_phase{$phase})) {
            $ret_val = "$phase";
            $last_phase = $phase;
            last;
        }
    }
    #return "x" if ($last_phase == 0);
    return () if ($last_phase == 0);

    # 残りの OK phase を処理
    foreach $phase (2..$max_phase) {
        next if (!exists($ok_phase{$phase}));
        next if ($phase == $last_phase);
        # 前の数字が存在しない場合
        if (!exists($ok_phase{$phase - 1})) {
            $ret_val .= ",$phase";
            $last_phase = $phase;
        } else {
            # 後の数字が存在しない場合
            if (!exists($ok_phase{$phase + 1})) {
                if ($phase - $last_phase > 1) {
                    $ret_val .= "-$phase";
                } else {
                    $ret_val .= ",$phase";
                }
                $last_phase = $phase;
            }
        }
    }
    
    return $ret_val;
}

print format_range(1,2,4,5,6,7,8,9), "\n";
print format_range(1,3,4,5,6,7,8,9), "\n";
print format_range(1,5,6,7,8,9), "\n";

       中村 典嗣  E-mail:     nnakamur@...