画面にこう出れば正解
どの言語で書いても、同じ入力なら画面に出る文字は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
910言語のプログラム
どれもそのまま保存して動かせます。毎朝、上の正解の例をすべて実際に動かして確かめています。
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 みかん りんご いちご
sort.py3.14.7 で 5 / 5 件の出力が正解と一致
# 受け取った言葉を、文字コードの順に並べ替えて1行ずつ出す
import sys
# Python の sorted は、文字列を文字コード(コードポイント)の順に比べる
for w in sorted(sys.argv[1:]):
print(w)
動かし方(ファイルを保存したフォルダで) ・ Python を入れる
$ python3 sort.py みかん りんご いちご
sort.go1.27.2 で 5 / 5 件の出力が正解と一致
// 受け取った言葉を、文字コードの順に並べ替えて1行ずつ出す
package main
import (
"fmt"
"os"
"sort"
)
func main() {
words := os.Args[1:]
// sort.Strings は UTF-8 のバイトの順に比べる。これは文字コードの順と同じ結果になる
sort.Strings(words)
for _, w := range words {
fmt.Println(w)
}
}
動かし方(ファイルを保存したフォルダで) ・ Go を入れる
$ go run sort.go みかん りんご いちご
sort.js24.15.0 で 5 / 5 件の出力が正解と一致
// 受け取った言葉を、文字コードの順に並べ替えて1行ずつ出す
const words = process.argv.slice(2);
// 何も指定しない sort は UTF-16 の単位で比べるので、「𠮷」が「ア」より前に来てしまう。
// UTF-8 のバイト列にして比べると、文字コードの順になる
words.sort((a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)));
for (const w of words) {
console.log(w);
}
動かし方(ファイルを保存したフォルダで) ・ JavaScript を入れる
$ node sort.js みかん りんご いちご
Sort.java21.0.12 で 5 / 5 件の出力が正解と一致
// 受け取った言葉を、文字コード(Unicode のコードポイント)の小さい順に並べ替えて出す
import java.util.Arrays;
public class Sort {
public static void main(String[] args) {
// Arrays.sort の既定は UTF-16 の単位で比べるので「𠮷」が「ア」より前に来る。コードポイントの並びどうしで比べる
Arrays.sort(args, (a, b) -> Arrays.compare(a.codePoints().toArray(), b.codePoints().toArray()));
for (String s : args) {
System.out.println(s);
}
}
}
動かし方(ファイルを保存したフォルダで) ・ Java を入れる
$ java Sort.java みかん りんご いちご
sort.cs10.0.402 で 5 / 5 件の出力が正解と一致
// 受け取った言葉を、文字コード(Unicode のコードポイント)の小さい順に並べ替えて出す
using System.Text;
// Array.Sort の既定はカルチャの順、StringComparer.Ordinal は UTF-16 の単位の順で「𠮷」が「ア」より前に来る。
// UTF-8 のバイトの並びで比べると、コードポイントの順と同じになる
Array.Sort(args, (a, b) => Encoding.UTF8.GetBytes(a).AsSpan().SequenceCompareTo(Encoding.UTF8.GetBytes(b)));
foreach (string s in args)
{
Console.WriteLine(s);
}
動かし方(ファイルを保存したフォルダで) ・ C# を入れる
$ dotnet run sort.cs -- みかん りんご いちご
sort.rs1.99.0 で 5 / 5 件の出力が正解と一致
// 受け取った言葉を、文字コード(Unicode のコードポイント)の小さい順に並べ替えて出す
fn main() {
let mut words: Vec<String> = std::env::args().skip(1).collect();
// Rust の文字列は UTF-8 のバイトの順で比べる。これはコードポイントの順と同じになる
words.sort();
for w in words {
println!("{w}");
}
}
動かし方(ファイルを保存したフォルダで) ・ Rust を入れる
$ rustc sort.rs && ./sort みかん りんご いちご
sort.rb4.0.7 で 5 / 5 件の出力が正解と一致
# 受け取った言葉を、文字コードの順に並べ替えて1行ずつ出す # Ruby の sort は、文字列を UTF-8 のバイトの順に比べる。これは文字コードの順と同じ結果になる ARGV.sort.each do |w| puts w end
動かし方(ファイルを保存したフォルダで) ・ Ruby を入れる
$ ruby sort.rb みかん りんご いちご
sort.kt2.4.21 で 5 / 5 件の出力が正解と一致
// 受け取った言葉を、文字コード(Unicode のコードポイント)の小さい順に並べ替えて出す
fun main(args: Array<String>) {
// sorted() の既定は UTF-16 の単位で比べるので「𠮷」が「ア」より前に来る。コードポイントの並びどうしで比べる
val sorted = args.sortedWith { a, b -> java.util.Arrays.compare(a.codePoints().toArray(), b.codePoints().toArray()) }
for (s in sorted) {
println(s)
}
}
動かし方(ファイルを保存したフォルダで) ・ Kotlin を入れる
$ kotlinc sort.kt -include-runtime -d sort.jar && java -jar sort.jar みかん りんご いちご
sort.swift6.3.3 で 5 / 5 件の出力が正解と一致
// 受け取った言葉を、文字コード(Unicode のコードポイント)の小さい順に並べ替えて出す
let words = CommandLine.arguments.dropFirst()
// Swift の < は文字を正規化してから比べるので、コードポイントの順と違うことがある。Unicode の文字(unicodeScalars)の並びで比べる
let sorted = words.sorted { $0.unicodeScalars.lexicographicallyPrecedes($1.unicodeScalars) }
for w in sorted {
print(w)
}
動かし方(ファイルを保存したフォルダで) ・ Swift を入れる
$ swift sort.swift みかん りんご いちご
言語でつまずきやすいところ
初心者がよく書く形(各言語で最初に習う書き方をそのまま使ったもの)を、同じ正解表で動かした結果です。言語を出した答えごとにまとめ、赤い字はその言語が実際に出した間違った行です。
| 入力 | 初心者がよく書く形の答え(10言語) |
|---|---|
ひらがなみかん りんご いちご | ✓10言語すべて正解 |
英字の大文字と小文字banana Apple cherry | ✓10言語すべて正解 |
ひらがな・カタカナ・漢字バナナ りんご 林檎 | ✓10言語すべて正解 |
めずらしい漢字と半角カナアイス 𠮷野家 吉野家 |
|
数字の文字10 9 100 |
|
この回でやること
- 並び(配列・リスト)を並べ替える関数を使う
- 「何の順か」を決める
解説
文字コードの順
この回の正解は、文字を表す番号(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」を数の大小で並べたいときは、先に数に変えてから並べ替えます。
練習
- 逆順(大きい順)に並べ替えてみましょう
- 数字の言葉だけを、数の小さい順に並べ替えてみましょう