アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは、Perlを始めたばかりの初心者です。
さっそく質問の方失礼します。

乱数1~100までの数字のうち20個をとりだし配列にいれ、数字を昇順に入れ替えして昇順前と昇順後の数字を表示する問題なのですが。

@a[100]=(1..100);
srand(time());
for($i=0 ; $i<20 ; $i++){
$a=int(rand(@a));
print"$a\n";
}

と上記の乱数20個を取り出すことができたのですが、
そのあとの昇順させようとしてバブルソートを利用したいのですが、どのように組み込めばいいかわかりません。
どのように組み込めばいいのでしょうか?
お答えの方ヨロシクお願いします。

A 回答 (3件)

@a=(1..100);


srand(time());
for($i=0 ; $i<20 ; $i++){
$before[$i]=$a[rand @a];
}

@after = sort { $a <=> $b } @before;

print "before:\n";
print join(",",@before) ;
print "\nafter:\n";
print join(",",@after) . "\n";
    • good
    • 0
この回答へのお礼

お答えいただき有難うございます。
こちらが作ったものと比べるととても
綺麗にまとまっていたので驚かされました。

参考にさせて頂きました。
ありがとうございます。

お礼日時:2005/05/05 06:17

@b = sort { $a <=> $b; } @a;


で @a に入っている要素を数値として比較し, 昇順に @b に入れます. 文字列として比較したければ
@b = sort { $a cmp $b; } @a;
降順だったら, 数値の場合には
@b = sort { $b <=> $a; } @a;
文字列の場合には
@b = sort { $b cmp $a; } @a;

一般には
sort ブロック 配列
の形で, ブロックの部分は評価して数値になる必要があります. ブロックの中では特殊な変数として $a, $b を使います. 結果として得られる配列は, 前の方の要素を $a, 後ろの方の要素を $b としたときにこのブロックの返す値が 0 以下になるようなものとなります.
例えば { $a <=> $b; } というブロックだと, 最終的に得られる配列は ((前の方の要素) <=> (後ろの方の要素)) <= 0, つまり (前の方の要素) <= (後ろの方の要素) を満たすものになるので昇順にソートできる, ということになります.
    • good
    • 0
この回答へのお礼

参考にさせて頂きました。
解りやすい説明をありがとうございます。

お礼日時:2005/05/05 06:13

どうしてもバブルソートでなければならないという特段の理由がない限りは sort を使うのが普通だと思います.

    • good
    • 0
この回答へのお礼

早速のアドバイスありがとうございます。
こちらの記入ミスがあったようで、すみません。

使用するのはバブルソート以外のものでもOKです。

ソートでのやり方を教えていただければ幸いです。

お礼日時:2005/05/04 16:36

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