gracetory’s blog

東池袋にある合同会社グレストリのエンジニアブログです

【小ネタ】いろは順でソートする

f:id:grnishi:20190228011526p:plain

はじめに

サーバサイドエンジニアのgrnishiです。すっかり如月も末日です。明日からは弥生ですね。花粉が大暴れしているようですが、花粉症の皆様はいかがでしょうか?

私はまだ花粉症にはなっていませんので元気はつらつです。

本題

表題の通りですが、いろは順でソートしたいなと思って(3分ぐらい)調べてみるとC#、JavaScript、CommonLisp、Excelのソースが見つかりました。

pronama.jp

var.blog.jp

numb86-tech.hatenablog.com

denthor.exblog.jp

しかし、PHPが見つからなかったので作ってみました。

といっても他の言語から移植しただけで、自分で何かを考えたわけではありません。

というのは今回の目的は「いろは順のプログラムを書く」という事ではなく、ある重要な事柄を調べるという事でした。

目的

さて、私はクイズが好きです。

クイズにはベタ問という、ベタベタに手垢が付くほど何度も使われた問題というものがあります。

一例として、

「目には目を、歯には歯を」の一文で知られるバビロニアの法典は何?」A.ハンムラビ法典

「645年に定められた、日本初とされる元号は何?」A.大化

といった問題です。こういった問題の場合、クイズ慣れしている人は最初の数文字だけで答えたりします。

さて、そんなベタ問の中に下記のような問題があります。

「日本の市を50音順に並べた場合、一番最初に来る市は?」

答えは相生市(あいおいし、兵庫県)なわけですが、全ての市の名前が頭に入っているわけではなく、最初は相生市と覚えているだけです。

ちなみに、50音順に並べて二番目は愛西市(あいさいし、愛知県)、最後は蕨市(わらびし、埼玉県)です。

この辺は覚えているので良いですが、ふと「いろは順に並べて一番早いのはどこだろう?」と思いまして、

飯田市(いいだし、長野県)?じゃあ最後は鈴鹿市(すずかし、三重県)?このあたりどうなのかわからなかったのでいろは順に並べてみようとなったわけです。

コード

<?php
    mb_internal_encoding("UTF-8");

    function jpTradSort($a, $b) {
        $order = "いぃろはばぱにほぼぽへべぺとどちぢりぬるをわゎかヵがよょただれそぞつづっねならむうぅゐのおぉくぐやまけヶげふぶぷこごえぇてであぁさざきぎゆゅめみしじゑひびぴもせぜすずん";
        $a_len = mb_strlen($a);
        $b_len = mb_strlen($b);
        if ($a_len > $b_len) {
            $length = $b_len;
        } else {
            $length = $a_len;
        }

        for ($i = 0; $i < $length; $i++) {
            $a_pos = mb_strpos($order, mb_substr($a, $i, 1));
            $b_pos = mb_strpos($order, mb_substr($b, $i, 1));
            if ($a_pos < $b_pos) return -1;
            if ($a_pos > $b_pos) return 1;
        }
        if ($a_len < $b_len) return -1;
        if ($a_len > $b_len) return 1;
        return 0;
    }

    // 並べ替えたいデータを
    $dataset = array(
    );

    usort($dataset, "jpTradSort");

var_dump($dataset);

市のデータについては下記のサイトから拝借いたしました。

jusyo.jp

で答えは?

いろは順に並べた場合、一番最初に来るのは飯田市(いいだし、長野県)でした。

最後に来るのは、「市」を入れるならば珠洲市(すずし、いしかわけん)、「市」を入れないのであれば鈴鹿市(すずかし、三重県)でした。

これで早押しクイズはばっちりです。