{ }codelper
文字列の比較P0056

二つの単語を辞書順で比べる

一行目に質問の数 q が与えられる。
続く q 行に、英単語二つ a、b が空白一つで区切って与えられる。
質問ごとに a が b より前なら -1、同じなら 0、後ろなら 1 を一行に出力せよ。
前後は文字コード(ASCII)で決める:先頭の文字から順に比べ、最初に違う文字のコードが小さいほうが前である。
この規則では大文字(A〜Z、65〜90)はすべて小文字(a〜z、97〜122)より前なので、"Zoo" は "apple" より前である。
一方の単語がもう一方の先頭部分と同じなら("app" と "apple")、短いほうが前である。

入力
1 ≤ q ≤ 1,000。
単語は英大文字・小文字、長さ 1〜20
出力
q 行、質問ごとに -1、0、1 のどれか
例 1 · stdin
4
apple banana
app apple
Zoo apple
same same
stdout
-1
-1
-1
0
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

文字列の大小比較:Python・JS・TS・C++・Craykon は a < b をそのまま使います(どれも文字コード順)。
Java a.compareTo(b)、C strcmp(a, b)、C++ a.compare(b)、C# string.Compare(a, b, StringComparison.Ordinal) は負・0・正を返しますが、**-1 と 1 という約束はありません。
** Java の compareTo は最初に違う文字のコードの差("a" と "c" なら -2)か長さの差を返し、C の strcmp も実装によっては文字の差を返します。
なので Integer.signum・Math.Sign・(r > 0) - (r < 0) で符号だけ残します。
Python には三方向比較の関数がないので (a > b) - (a < b) で作ります。
大文字・小文字の落とし穴:C# の string.Compare(a, b)(StringComparison なし)はカルチャの規則なので "a" が "B" より前になり、JS の a.localeCompare(b) も同じです。
文字コード順にしたいなら C# は Ordinal、JS は < を使います。

Pythonmain.py · 4 行
q = int(input())for _ in range(q):    a, b = input().split()    print((a > b) - (a < b))
JavaScriptmain.js · 7 行
const [q, ...lines] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out = [];for (let i = 0; i < Number(q); i++) {  const [a, b] = lines[i].split(" ");  out.push(a < b ? -1 : a > b ? 1 : 0);}console.log(out.join("\n"));
TypeScriptmain.ts · 8 行
import { readFileSync } from "node:fs";const [q, ...lines]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out: number[] = [];for (let i = 0; i < Number(q); i++) {  const [a, b]: string[] = lines[i].split(" ");  out.push(a < b ? -1 : a > b ? 1 : 0);}console.log(out.join("\n"));
JavaMain.java · 16 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int q = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < q; i++) {            String[] p = br.readLine().trim().split(" ");            // compareTo는 -1/1이 아니라 "차이"를 돌려주므로 부호만 남긴다            out.append(Integer.signum(p[0].compareTo(p[1]))).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 18 行
using System;using System.Text; class Program{    static void Main()    {        int q = int.Parse(Console.ReadLine());        var out_ = new StringBuilder();        for (int i = 0; i < q; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            // 글자 코드로 비교하려면 Ordinal(기본 string.Compare는 문화권 규칙을 따른다)            out_.Append(Math.Sign(string.Compare(p[0], p[1], StringComparison.Ordinal))).Append('\n');        }        Console.Write(out_);    }}
C++main.cpp · 13 行
#include <iostream>#include <string> int main() {    std::ios::sync_with_stdio(false);    int q;    std::string a, b;    std::cin >> q;    for (int i = 0; i < q; i++) {        std::cin >> a >> b;        std::cout << (a < b ? -1 : a > b ? 1 : 0) << '\n';    }}
Cmain.c · 14 行
#include <stdio.h>#include <string.h> int main(void) {    int q;    char a[32], b[32];    if (scanf("%d", &q) != 1) return 0;    for (int i = 0; i < q; i++) {        scanf("%31s %31s", a, b);        int r = strcmp(a, b);  /* 부호만 정해져 있다: 음수, 0, 양수 */        printf("%d\n", (r > 0) - (r < 0));    }    return 0;}
Craykonmain.cray · 19 行
q = コンソール.行読み().数に();繰り返す (i = 0; i < q; i++){    words = コンソール.行読み().分ける();    a = words[0];    b = words[1];    もし (a < b)    {        コンソール.書く(-1);    }    でなければ もし (a > b)    {        コンソール.書く(1);    }    でなければ    {        コンソール.書く(0);    }}