電子書籍の厳選無料作品が豊富!

Perlで、大きいソート順になっている配列があります。
その中には重複しているデータもあります
@list = (100,80,80, 50, 50, 45, 10, 0, 0, 0);
のような配列を
@ranking = (1,2,2, 4, 4, 6, 7,10,10,10);
と順位を格納させたいです。

簡単な方法がありましたら、教えてください。

A 回答 (4件)

@ranking がなぜそうなるのか説明してください.


特に最後の 10.
    • good
    • 0

最後が 8 でいいなら



@ranking = (1);
for my $i (1 .. $#list) {
push @ranking, ($list[$i-1] == $list[$i] ? $ranking[-1] : $i+1);
}

とか.
    • good
    • 0

最後が8でいいなら・・ってことで作ってみました。


100 80 80 50 50 45 10 0 0 0から
1 2 2 4 4 6 7 8 8 8ができます。


#!/usr/bin/perl
use strict;
use warnings;
my @ranking;
my @list = ( 100, 80, 80, 50, 50, 45, 10, 0, 0, 0, );
my $max = $list[0];
my $i = 1;
foreach my $num ( 0 .. $#list ) {
if ( $max == $list[$num] ) {
push @ranking, $i;
} else {
$i=$num+1;
push @ranking, $i;
$max = $list[$num];
}
}
print "@list\n";
print "@ranking\n";
exit;
    • good
    • 0

@ranking = (1,2,2,4,4,6,7,8,8,8);



という結果が正しく,10行程度のプログラムを組んだものでも質問者にとって「簡単な方法」に該当するなら,こんなコード例を挙げられます。

@list = (100,80,80,50,50,45,10,0,0,0);
@ranking = ();
$prev = $list[0] + 1;
$i = 1;
foreach $cur (@list) {
if ($prev != $cur) {
$order = $i;
}
push @ranking, $order;
$prev = $cur;
$i++;
}
print "@ranking";
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!