3

私は Perl が初めてで、Perl で特定の関数を設計する際に問題があります。

この関数は、すべての増加ストリップと減少ストリップを見つけて返す必要があります。どういう意味ですか?2 つの位置が隣り合っている場合、その位置は隣り合っています。すなわち (2,3) または (8,7)。増加するストリップは、隣人の増加するストリップです。すなわち (3,4,5,6)。減少ストリップも同様に定義されます。すべての配列の先頭に 0 が追加され、最後に配列の長さ +1 が追加されます。隣人を持たないシングルナンバーは減少しています。0 と n+1 が増えています。

したがって、配列 (0,3,4,5,9,8,6,2,1,7,10) がある場合、次の結果が得られるはずです: 増加するストリップは: (3,4,5) (10) (0) 減少ストリップ: (9,8)、(6)、(2,1) (7)

問題を減らしてすべての減少ストリップのみを取得しようとしましたが、これは私が得る限りです: http://pastebin.com/yStbgNme

ここにコード:

sub getIncs{
    my @$bar = shift;
    my %incs;
    my $inccount = 0;
    my $i=0;
    while($i<@bar-1){
        for($j=$i; 1; $j++;){
            if($bar[$j] == $bar[$j+1]+1){
                $incs{$inccount} = ($i,$j);
            } else {
                $inccount++;
                last;
            }
        }
    }

//edit1: 上記の関数 getStrips() を含む Python プログラムを見つけましたが、私の python はせいぜい散発的です。http://www.csbio.unc.edu/mcmillan/Media/breakpointReversalSort.txt

//edit2: 配列内のすべての数値は正確に 1 つの時間なので、重複はありません。

4

1 に答える 1

2
use strict;
my @s = (0,3,4,5,9,8,6,2,1,7,10);
my $i = 0;
my $j = 0; #size of @s
my $inc = "Increasing: ";
my $dec = "Decreasing: ";

# Prepend the beginning with 0, if necessary
if($s[0] != 0 || @s == 0 ) { unshift @s, 0; }
$j = @s;

foreach(@s) {
  # Increasing
  if( ($s[$i] == 0) || ($i == $j-1) || ($s[$i+1] - $s[$i]) == 1 || ($s[$i] - $s[$i-1] == 1)) {
    if($s[$i] - $s[$i-1] != 1) { $inc .= "("; }
    $inc .= $s[$i];    
    if($s[$i+1] - $s[$i] != 1) { $inc .= ")"; }
    if($s[$i+1] - $s[$i] == 1) { $inc .= ","; }
  }

  #Decreasing
  if( ($s[$i]-$s[$i-1] != 1) && ($s[$i+1] - $s[$i] != 1) && ($s[$i] != 0) && ($i != $j-1) ) {
    if($s[$i-1] - $s[$i] != 1) { $dec .= "("; }
    $dec .= $s[$i];
    if($s[$i] - $s[$i+1] != 1) { $dec .= ")"; }
    if($s[$i] - $s[$i+1] == 1) { $dec .= ","; }
  }
  $i++;
}

$inc =~ s/\)\(/\),\(/g;
$dec =~ s/\)\(/\),\(/g;
print "$inc\n";
print "$dec\n";

結果:

Increasing: (0),(3,4,5),(10)
Decreasing: (9,8),(6),(2,1),(7)
于 2012-05-19T20:23:32.930 に答える