鍋の中

Miliファンの雑文置き場

world.search(you);に現れるソートについて

01/07追記:ソートの説明~1段落目の読解までを大幅に加筆しました

 

こんにちは、文章力がないせいで記事の下書きだけがたまっていっている白洲です。

この記事ではworld.search(you); (以下wsy) の歌詞にはこんなモチーフがある、といったことについてオタクが好き勝手に語ろうと話していこうと思います。多少理系っぽい横文字が出てくるのですが、できる限り平易に書くよう努めます。

 

さて、すこし前提知識を説明します。ちょっと唐突ですが、「ランダムに並べられた数字を整列する」という問題を考えてみます。[2, 3, 8, 1, 6]という並びがあるときに、[1,2,3,6,8]となるように並び替えたいです。もちろん人間は数えればすぐにできますが、これをコンピュータが解くためには、プログラムのように定式化した手続きを用意する必要があります。これをアルゴリズムといい、整列のためのアルゴリズムをソート(sort)と言います。

ソートはアルゴリズムの基本的なもので、今までにさまざまな方法が考案されています。

(このへんは主眼じゃないので雑な説明に留めますが、説明が下手でよくわからんという方は下記のリンクなどを参照ください)

www.ics.kagoshima-u.ac.jp

qiita.com

 

なぜ突然情報学の問題の話をしたかと言うと、もちろんこのソートがworld.search(you); に関わるためです。周知の通り、wsyは世界の中でyouを探す存在についての物語です。では、実際にプログラムの上でどのようにyouを探そうとしているか。wsyの主人公がyouを探すために用いている方法論がソートです。

歌詞カードのプログラムの1行目には、「public class worldSorterSearcher」と記述があります。

雑な説明をすると、このworldSorterSearcherというのがプログラムに付けられた名前です。世界をソートして(Youを)探すためのプログラム、といったところでしょうか。

 

つぎに、sortと「you」を探すことにどのような関係があるのか説明します。例示も兼ねてさっそく歌詞のはじめの部分を読んでいきましょう:

Side by side, the lovelier goes up

Reach for the top, till the bubble pops

結論から言うと、この部分のモチーフは、ソートアルゴリズムの一つであるバブルソート(bubble sort)です。

バブルソートそのものについては以下のリンクに詳しいです:

http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/bubble-sort.html

 

この部分に該当するコードでもバブルソートが書かれています。HueかMillennium Motherの歌詞カードをお持ちなら、3行目に「bubbleSortByLoveliness」という記述があるのを見てみてください。

バブルソートでやっていることは、世界のあらゆるものを「Loveliness」、すなわち「可愛さ」でもって並び替えるという操作です。では、これでなぜyouを探せるか?それはおそらく、主人公にとって、世界の中でもっとも可愛い(Loveliest)存在がyouであるからです。

youが様々なものに姿を変えていて、どれがyouか分からなくても、すべての物を可愛さの順で並べることで、最も可愛いyouを探し当てることができる。このいささか強引にも思える方法で、主人公はyouを探そうとします。これが、ソートでyouを探すことができる理由です。

 

そして、バブルソートを踏まえると、この2行の歌詞は以下のように解釈できます。無数にある諸物のなかから二つを取り出し「横に並べて、可愛い方を取り出す」という操作を続けることで、Top = 最も可愛いものを探し求めている、というふうに。

余談ですが、「泡が弾けるまで」というのは、水中の泡が浮力で上に向かっていき、水面(=トップ)に至ると弾ける、という様子のことで、バブルソートの名前の由来です。

 

次の部分についても見ていきます。

Pick a memory, insert the past

which one is sweetest? Save it for the last

この部分は、同じくソートアルゴリズムの一つ、挿入ソート(Insertion sort)がモチーフです。挿入というのは、たとえばトランプで、手に持っているカードを並べる動きを想像するとわかりやすいです。一枚ずつ札を取って、適切な位置に差し込む(Insert)。この動きを繰り返すとカードが順に並びますが、これと同じような原理で動くのが挿入ソートです。

さまざまな記憶があり、それぞれに甘さ(sweetiness)が決まっていると考えてみます。これらをトランプのように挿入して並び替えると、手札の最後(the last)には最も甘い(Sweetest)ものが残ります。歌詞はこうした操作をたとえていると考えられます。

ここから大きく飛んで、ラスサビ前のこの部分をみてみます。

Each one of us is a bucket of love

Some of us empty, some of us filled up

例によってここもモチーフはソートアルゴリズムで、バケツソート(Bucket sort)と呼ばれるものです。バケツソートの説明は以下のリンク先にあります:

http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/bucket-sort.html

コードの方を見てみると、ここでソートしているのは「愛しさ(Lovability)」という値です。(Millennium Mother 歌詞カード2枚目の1列目が丸ごとバケツソートのプログラムです)さまざまな物の「愛しさ」を比べ、最も愛しい物を取り出すためにバケツソートの要領で最も愛しいもの(=You)を探そうとする。その過程で、バケツのいくつかは空で、またバケツのいくつかは満ちています。

 

次で最後です。 

Cut us into pieces, break us down to the cell

Merge us back up, we have evolved now

 この部分はマージソート(Merge sort)と呼ばれるソートアルゴリズムが元です。例のごとく以下のサイトがわかりやすいです。

http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/merge-sort.html

マージソートでは、まず与えられた数字の並びを細かく区切り、並べ替えをしてから結合(merge)して元に戻します。イメージがつきにくいと思いますが、この操作をすると先述した挿入ソートやバブルソートより一段階速いソートができたりします。(蛇足)

そのために「細胞までみじん切りにして…結合して また進化する」と歌われています。また、この部分で先の「Loveliness」「Sweetiness」「Lovability」に該当する値は「Exp」とコードに書かれています。ちょっと不明瞭ですが、進化するので経験値のexpでしょうか。すると、歌詞の部分は進化するために経験値を求めている、というふうに読めます。

 

ひとまず以上です。wsyは書きたいことが多すぎて何度か挫折しているんですが、焦点を絞ったら思ったよりさくさく書けました。まだ内容が薄いのでしだいに加筆するつもりです。