{ }codelper
多分岐P0315

凧あげのお知らせ板

凧あげの会は、日ごとに風速 w、降水確率 p、気温 t を見て、お知らせ板に言葉を一つ書く。
最初の行に日数 n、続く n 行に日ごとの w, p, t がこの順に空白一つずつで区切って与えられる。
下の規則を上から順に調べ、最初に当てはまる規則の言葉を一つだけ書く。
規則 1:p が 70 以上なら "雨" である。
規則 2:w が 12 以上なら "強風" である。
規則 3:w が 3 未満なら "無風" である。
規則 4:t が 0 未満なら "寒さ" である。
規則 5:w が 8 以上なら "曲芸" である。
規則 6:上のどれにも当てはまらなければ "凧" である。
日ごとに一行ずつ、与えられた順にお知らせ板に書く言葉を出力せよ。

入力
1 ≤ n ≤ 1000、0 ≤ w ≤ 40、0 ≤ p ≤ 100、−30 ≤ t ≤ 45(すべて整数)
出力
n 行。
各行 rain・storm・calm・cold・stunt・kite のいずれか
例 1 · stdin
7
3 80 10
15 80 20
15 10 20
2 10 -5
9 10 -5
9 10 5
5 69 0
stdout
雨
雨
強風
無風
寒さ
曲芸
凧
main.py
入力(stdin)

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

$ 準備完了

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

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

いくつかの分かれ道から一つだけを選ぶ鎖を、Python は if … elif … else、C・C++・Java・C#・JS・TS は if … else if … else、Craykon は もし … でなければ もし … でなければ と書きます。
elif という別の語があるのは Python だけで、ほかは else のあとに if を続けたものです。
鎖は上から順に聞き、最初に当てはまった分かれ道だけを実行して残りを飛ばします。
一つ目の落とし穴は聞く順番です。
この問題は条件が重なっているので、順番がそのまま規則です。
風から聞くと 15 80 20 が rain ではなく storm になります。
風の条件をまとめようとして曲芸を寒さより先に聞くと、9 10 -5 が cold ではなく stunt になります。
二つ目の落とし穴は、else なしで if を別々に書くことです。
当てはまる条件がすべて出力されるので 15 80 20 に rain・storm・stunt の三行が出て、最後の else は直前の if だけに付くので 3 80 10 には rain のあとに kite まで出ます。
途中の一つだけを でなければ もし ではなく もし と書いても、鎖がそこで二つに切れます。
二つ目の条件をそう書くと、15 80 20 に rain と storm の二行が出ます。
出力する代わりに変数へ答えを上書きすると最後に当てはまったものが残り、2 10 -5 が calm ではなく cold になります。
三つ目の落とし穴は境界です。
以上は >=、未満は < です。
p > 70 と書くと降水確率がちょうど 70 の日を、w <= 3 と書くと風速がちょうど 3 の日を、t <= 0 と書くと気温がちょうど 0 の日を間違えます。
例の 5 69 0 は kite ですが、t <= 0 だと cold になります。
前の分かれ道ですでに絞られているので、後ろの条件に w >= 3 && w < 12 のように書き直す必要はありません。

Pythonmain.py · 16 行
n = int(input())for _ in range(n):    w, p, t = map(int, input().split())    # 위에서부터 차례로 묻는다. 먼저 맞은 하나만 고른다    if p >= 70:        print("雨")    elif w >= 12:        print("強風")    elif w < 3:        print("無風")    elif t < 0:        print("寒さ")    elif w >= 8:        print("曲芸")    else:        print("凧")
JavaScriptmain.js · 22 行
const [n, ...v] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];for (let i = 0; i < n; i++) {  const w = v[3 * i];  const p = v[3 * i + 1];  const t = v[3 * i + 2];  // 위에서부터 차례로 묻는다. 먼저 맞은 하나만 고른다  if (p >= 70) {    out.push("雨");  } else if (w >= 12) {    out.push("強風");  } else if (w < 3) {    out.push("無風");  } else if (t < 0) {    out.push("寒さ");  } else if (w >= 8) {    out.push("曲芸");  } else {    out.push("凧");  }}console.log(out.join("\n"));
TypeScriptmain.ts · 23 行
import { readFileSync } from "node:fs";const [n, ...v]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: string[] = [];for (let i = 0; i < n; i++) {  const w: number = v[3 * i];  const p: number = v[3 * i + 1];  const t: number = v[3 * i + 2];  // 위에서부터 차례로 묻는다. 먼저 맞은 하나만 고른다  if (p >= 70) {    out.push("雨");  } else if (w >= 12) {    out.push("強風");  } else if (w < 3) {    out.push("無風");  } else if (t < 0) {    out.push("寒さ");  } else if (w >= 8) {    out.push("曲芸");  } else {    out.push("凧");  }}console.log(out.join("\n"));
JavaMain.java · 30 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            int w = sc.nextInt();            int p = sc.nextInt();            int t = sc.nextInt();            // 위에서부터 차례로 묻는다. 먼저 맞은 하나만 고른다            if (p >= 70) {                out.append("雨");            } else if (w >= 12) {                out.append("強風");            } else if (w < 3) {                out.append("無風");            } else if (t < 0) {                out.append("寒さ");            } else if (w >= 8) {                out.append("曲芸");            } else {                out.append("凧");            }            out.append('\n');        }        System.out.print(out);    }}
C#Main.cs · 45 行
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        var sb = new StringBuilder();        for (int i = 0; i < n; i++)        {            string[] s = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            int w = int.Parse(s[0]);            int p = int.Parse(s[1]);            int t = int.Parse(s[2]);            // 위에서부터 차례로 묻는다. 먼저 맞은 하나만 고른다            if (p >= 70)            {                sb.Append("雨");            }            else if (w >= 12)            {                sb.Append("強風");            }            else if (w < 3)            {                sb.Append("無風");            }            else if (t < 0)            {                sb.Append("寒さ");            }            else if (w >= 8)            {                sb.Append("曲芸");            }            else            {                sb.Append("凧");            }            sb.Append('\n');        }        Console.Write(sb);    }}
C++main.cpp · 24 行
#include <iostream> int main() {    int n;    std::cin >> n;    for (int i = 0; i < n; i++) {        int w, p, t;        std::cin >> w >> p >> t;        // 위에서부터 차례로 묻는다. 먼저 맞은 하나만 고른다        if (p >= 70) {            std::cout << "雨" << "\n";        } else if (w >= 12) {            std::cout << "強風" << "\n";        } else if (w < 3) {            std::cout << "無風" << "\n";        } else if (t < 0) {            std::cout << "寒さ" << "\n";        } else if (w >= 8) {            std::cout << "曲芸" << "\n";        } else {            std::cout << "凧" << "\n";        }    }}
Cmain.c · 25 行
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        int w, p, t;        scanf("%d %d %d", &w, &p, &t);        /* 위에서부터 차례로 묻는다. 먼저 맞은 하나만 고른다 */        if (p >= 70) {            puts("雨");        } else if (w >= 12) {            puts("強風");        } else if (w < 3) {            puts("無風");        } else if (t < 0) {            puts("寒さ");        } else if (w >= 8) {            puts("曲芸");        } else {            puts("凧");        }    }    return 0;}
Craykonmain.cray · 33 行
n = コンソール.行読み().数に();繰り返す (i = 0; i < n; i++){    날 = コンソール.数読み();    w = 날[0];    p = 날[1];    t = 날[2];    // 위에서부터 차례로 묻는다. 먼저 맞은 하나만 고른다    もし (p >= 70)    {        コンソール.書く("雨");    }    でなければ もし (w >= 12)    {        コンソール.書く("強風");    }    でなければ もし (w < 3)    {        コンソール.書く("無風");    }    でなければ もし (t < 0)    {        コンソール.書く("寒さ");    }    でなければ もし (w >= 8)    {        コンソール.書く("曲芸");    }    でなければ    {        コンソール.書く("凧");    }}