CODE Polyglot / 入門 / 第5回

並べ替え — 文字の順番は、言語の既定で変わる

受け取った言葉を並べ替えて、1行に1つずつ出します。この回では「文字コードの順」を正解にしています。C# の既定の並べ替えや、「𠮷」のような文字では、言語によって順番が変わります。

画面にこう出れば正解

どの言語で書いても、同じ入力なら画面に出る文字は1文字も違わない、というのが正解の決め方です(例は Python で動かしたときのコマンドです)。

ひらがな

$ python3 sort.py みかん りんご いちご
いちご
みかん
りんご

英字の大文字と小文字

$ python3 sort.py banana Apple cherry
Apple
banana
cherry

ひらがな・カタカナ・漢字

$ python3 sort.py バナナ りんご 林檎
りんご
バナナ
林檎

めずらしい漢字と半角カナ

$ python3 sort.py アイス 𠮷野家 吉野家
吉野家
アイス
𠮷野家

数字の文字

$ python3 sort.py 10 9 100
10
100
9

10言語のプログラム

どれもそのまま保存して動かせます。毎朝、上の正解の例をすべて実際に動かして確かめています。

sort.php8.4.26 で 5 / 5 件の出力が正解と一致

<?php
// 受け取った言葉を、文字コードの順に並べ替えて1行ずつ出す
$words = array_slice($argv, 1);
// 何も指定しない sort は、"10" と "9" のような数字の文字列を数として比べる。SORT_STRING で文字として比べる
sort($words, SORT_STRING);
foreach ($words as $w) {
    echo $w . "\n";
}

動かし方(ファイルを保存したフォルダで) ・ PHP を入れる

$ php sort.php みかん りんご いちご

言語でつまずきやすいところ

初心者がよく書く形(各言語で最初に習う書き方をそのまま使ったもの)を、同じ正解表で動かした結果です。言語を出した答えごとにまとめ、赤い字はその言語が実際に出した間違った行です。

入力初心者がよく書く形の答え(10言語)
ひらがなみかん りんご いちご

✓10言語すべて正解

英字の大文字と小文字banana Apple cherry

✓10言語すべて正解

ひらがな・カタカナ・漢字バナナ りんご 林檎

✓10言語すべて正解

めずらしい漢字と半角カナアイス 𠮷野家 吉野家
  • JavaScript・Java・C#・Kotlin𠮷野家
    アイス
  • PHP・Python・Go・Rust・Ruby・Swift✓ 正解
数字の文字10 9 100
  • PHP9
    10
    100
  • Python・Go・JavaScript・Java・C#・Rust・Ruby・Kotlin・Swift✓ 正解

この回でやること

  • 並び(配列・リスト)を並べ替える関数を使う
  • 「何の順か」を決める

解説

文字コードの順

この回の正解は、文字を表す番号(Unicode のコードポイント)の小さい順です。

  • 大文字(A〜Z)は、小文字(a〜z)より前
  • ひらがな → カタカナ → 漢字 の順
  • 数字の「10」「100」「9」は、文字として比べるので「10」「100」「9」の順(数の大小ではない)

言語によって既定の順が違う

  • C# の Array.Sort や OrderBy は、既定では「言語の慣習に沿った順(カルチャ)」で比べます。そのため、動かすパソコンの設定で順番が変わります。Mac で動かすと「バナナ・りんご・林檎」のように並びましたが、この検証の Linux(カルチャの情報を持たない設定)では文字コードの順になりました。どこでも同じ順にするには、比べ方を自分で指定します
  • JavaScript・Java・Kotlin(と、上の Linux の C#)は、文字列を UTF-16 の単位で比べます。「𠮷」(UTF-16 では 2つの単位)は、半角カナの「ア」より前に来てしまいます
  • Python・Go・Rust・Ruby・Swift は、文字コードの順(または UTF-8 のバイト順。同じ結果になります)で比べます
  • PHP の sort() は、数字だけの文字列を「数」として比べるので、「9・10・100」の順になります。文字として比べるには sort($a, SORT_STRING) と指定します

数として並べたいとき

「9」「10」「100」を数の大小で並べたいときは、先に数に変えてから並べ替えます。

練習

  1. 逆順(大きい順)に並べ替えてみましょう
  2. 数字の言葉だけを、数の小さい順に並べ替えてみましょう