{ }codelper
比較P0227

三日間の気温の流れ

三日間の最高気温を見て、気温の流れを書き留める。
一行目に記録の数 n、続く n 行に記録ごとに一日目・二日目・三日目の気温 a, b, c が順に空白一つずつで区切って与えられる。
記録ごとに一行に、a < b < c なら "上昇"、a > b > c なら "下降"、それ以外なら "混在" を出力せよ。
二日以上同じ気温なら、だんだん上がったのでも下がったのでもないので "混在" である(例:3 3 5)。
上がってから下がる、下がってから上がるのも "混在" である。

入力
1 ≤ n ≤ 1,000、−50 ≤ a, b, c ≤ 50(整数)
出力
n 行、各行 up・down・mixed のいずれか
例 1 · stdin
4
3 8 12
12 8 3
5 9 2
4 4 6
stdout
上昇
下降
混在
混在
main.py
入力(stdin)

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

$ 準備完了

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

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

数学のように a < b < c と書けるかどうかは言語ごとに違います。
これを a < b and b < c と読んでくれるのは Python だけです。
JS ではエラーなしに (a < b) < c として計算され、C・C++ も gcc ではそのままコンパイルされてそう計算します(-Wall を付けたときだけ警告が出ます。
最近の clang は既定でエラーで止めます)。
前の比較の true・false が 1・0 になって c と比べられるので、5 9 2 のように上がってから下がった記録も c が 1 より大きければ up になります。
Java・C# は boolean と int は比べられないというコンパイルエラーを出し、TS も boolean と number は比べられないという型エラーで止めてくれます。
Craykon は実行する前に「'a < b && b < c' のように二つに分けて書きます」と教えてくれます。
なので Python 以外では a < b && b < c のように二つに分けて書きます。
二つ目の落とし穴は境界です。
< の代わりに <= を使うと 3 3 5 が up になります。
三つ目の落とし穴は、読んだ文字列を数に変えないことです。
Python input().split() や JS split(" ") で分けた値は文字列なので、比較が文字順になり "9" < "10" が偽になります。
Python int、JS・TS Number、Craykon 数に で変えてから比べます。

Pythonmain.py · 10 行
n = int(input())for _ in range(n):    a, b, c = map(int, input().split())    # Python은 a < b < c를 a < b and b < c로 읽는다    if a < b < c:        print("上昇")    elif a > b > c:        print("下降")    else:        print("混在")
JavaScriptmain.js · 11 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const out = [];for (let i = 1; i <= n; i++) {  const [a, b, c] = lines[i].trim().split(/\s+/).map(Number);  // a < b < c는 (a < b) < c가 되어 true/false를 c와 비교한다. 둘로 나눠 쓴다  if (a < b && b < c) out.push("上昇");  else if (a > b && b > c) out.push("下降");  else out.push("混在");}console.log(out.join("\n"));
TypeScriptmain.ts · 12 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const out: string[] = [];for (let i = 1; i <= n; i++) {  const [a, b, c]: number[] = lines[i].trim().split(/\s+/).map(Number);  // TS는 a < b < c를 타입 오류로 막는다(boolean과 number를 비교). 둘로 나눠 쓴다  if (a < b && b < c) out.push("上昇");  else if (a > b && b > c) out.push("下降");  else out.push("混在");}console.log(out.join("\n"));
JavaMain.java · 22 行
import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.StringTokenizer; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            StringTokenizer st = new StringTokenizer(br.readLine());            int a = Integer.parseInt(st.nextToken());            int b = Integer.parseInt(st.nextToken());            int c = Integer.parseInt(st.nextToken());            // a < b < c는 컴파일 오류다(boolean과 int는 비교할 수 없다)            if (a < b && b < c) out.append("上昇\n");            else if (a > b && b > c) out.append("下降\n");            else out.append("混在\n");        }        System.out.print(out);    }}
C#Main.cs · 21 行
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine().Trim());        var sb = new StringBuilder();        for (int i = 0; i < n; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            int a = int.Parse(p[0]), b = int.Parse(p[1]), c = int.Parse(p[2]);            // a < b < c는 컴파일 오류다. 둘로 나눠 &&로 잇는다            if (a < b && b < c) sb.Append("上昇\n");            else if (a > b && b > c) sb.Append("下降\n");            else sb.Append("混在\n");        }        Console.Write(sb);    }}
C++main.cpp · 15 行
#include <iostream> int main() {    std::ios::sync_with_stdio(false);    int n;    std::cin >> n;    for (int i = 0; i < n; i++) {        int a, b, c;        std::cin >> a >> b >> c;        // a < b < c도 컴파일되지만 (a < b)의 true/false를 c와 비교한다        if (a < b && b < c) std::cout << "上昇\n";        else if (a > b && b > c) std::cout << "下降\n";        else std::cout << "混在\n";    }}
Cmain.c · 15 行
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        int a, b, c;        scanf("%d %d %d", &a, &b, &c);        /* a < b < c도 컴파일되지만 (a < b)의 1이나 0을 c와 비교한다 */        if (a < b && b < c) puts("上昇");        else if (a > b && b > c) puts("下降");        else puts("混在");    }    return 0;}
Craykonmain.cray · 21 行
n = コンソール.行読み().数に();繰り返す (i = 0; i < n; i++){    p = コンソール.行読み().空白除去().分ける(" ");    a = p[0].数に();    b = p[1].数に();    c = p[2].数に();    // a < b < c는 (a < b)의 참거짓을 c와 비교한다. 둘로 나눠 &&로 잇는다    もし (a < b && b < c)    {        コンソール.書く("上昇");    }    でなければ もし (a > b && b > c)    {        コンソール.書く("下降");    }    でなければ    {        コンソール.書く("混在");    }}