このブログは、一番下のフッタに示すように「
Smatr Blog」のスクリプトを使わせていただいています。
このブログシステムはperlで書かれています。私は、一応perlは使えるのですが、perlでよく使う正規表現の書き方が難しく、わからない場合はWEBで探しながらスクリプトを作っています。
「ブログ一覧」ページの「良く読まれているブログ」に掲載する記事を選ぶために、アクセスログから読まれたブログの番号とタイトルを検索し、読まれた順に6つのブログを表示するようにしています。この際に、3つの仮想配列を1組にして、そのうちの1つの仮想配列の要素でソートする必要がありました。エクセルで、3列を対象にソートするようなイメージです。
このソートがを行わせるのが難しく、WEBを探しても見つけられませんでした。
そこで、ChatGPTに質問し、作ってもらいました。こんな感じです。
作成されたスクリプトを調整して実装しました。ちゃんと動きました。
ややこしい正規表現は、自分で考えたりWEBで調べたりするより、ChatGPTに聞いたほうが、遥かに効率的です。
ですが、明らかに間違っている回答をする場合もあり、「これは間違っていないか?」と聞くと、シラっと「ご指摘の通り間違っています」と回答したりするので、ちょっと笑ってしまいますが、注意が必要です。
<CharGPTに投げた質問>
以下の条件でクイックソートするプログラムをperlで作ってください。
仮想配列 @a, @b, @c がある
これらの参照リストの仮想配列 @list=(\@a, \@b, \@c); がある
このとき、@aの要素を使って、@listをソートしたい
昇順、降順を切り替えられるようにしたい
<作成されたスクリプト>
use strict;
use warnings;
# サンプルの仮想配列
my @a = (3, 1, 4, 1, 5);
my @b = qw(b1 b2 b3 b4 b5);
my @c = qw(c1 c2 c3 c4 c5);
# 仮想配列の参照リスト
my @list = (\@a, \@b, \@c);
# 昇順 or 降順を指定(1で昇順、-1で降順)
my $order = 1; # 昇順なら1, 降順なら-1に設定
# クイックソートの実装
sub quicksort {
my ($refs, $start, $end, $order) = @_;
return if $start >= $end;
my $pivot_index = partition($refs, $start, $end, $order);
quicksort($refs, $start, $pivot_index - 1, $order);
quicksort($refs, $pivot_index + 1, $end, $order);
}
sub partition {
my ($refs, $start, $end, $order) = @_;
my $pivot = $refs->[0][$end];
my $i = $start - 1;
for my $j ($start .. $end - 1) {
if (($refs->[0][$j] * $order) <= ($pivot * $order)) {
$i++;
swap($refs, $i, $j);
}
}
swap($refs, $i + 1, $end);
return $i + 1;
}
sub swap {
my ($refs, $i, $j) = @_;
foreach my $arr_ref (@$refs) {
($arr_ref->[$i], $arr_ref->[$j]) = ($arr_ref->[$j], $arr_ref->[$i]);
}
}
# クイックソート実行
quicksort(\@list, 0, $#a, $order);
# ソート結果の確認
print "Sorted arrays:\n";
print "a: @{$list[0]}\n";
print "b: @{$list[1]}\n";
print "c: @{$list[2]}\n";