{ }codelper
判定関数P0285

砂場の中に落ちたボール

公園に四角い砂場があり、砂場の四つの辺は横軸か縦軸に平行である。
一行目に砂場の向かい合う二つの頂点の座標 x1、y1、x2、y2 が空白一つずつで区切って与えられる。
二つの頂点のどちらが先に与えられるかは決まっていないので、x1 が x2 より大きいことも、y1 が y2 より大きいこともある。
二行目にボールの数 n が与えられ、続く n 行にボールが落ちた場所の座標 x、y が空白一つで区切って与えられる。
ボールごとに、砂場の中か縁の上に落ちたなら "はい"、砂場の外に落ちたなら "いいえ" を一行に出力せよ。
ボールの x が x1 と x2 の間にあり、y が y1 と y2 の間にあれば、中か縁の上である。
ここで「間」は両端の値を含む。
数 v が二つの数 a と b の間(両端を含む)にあるかを真偽値で返す関数を作り、横と縦に一回ずつ使おう。

入力
-1,000 ≤ x1, y1, x2, y2 ≤ 1,000、x1 ≠ x2、y1 ≠ y2、1 ≤ n ≤ 100、-1,000 ≤ x, y ≤ 1,000(すべて整数)
出力
n 行、各行に "はい" または "いいえ"
例 1 · stdin
8 1 2 5
5
2 5
5 3
9 3
5 0
0 9
stdout
はい
はい
いいえ
いいえ
いいえ
main.py
入力(stdin)

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

$ 準備完了

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

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

真偽値を返す関数は、条件式をそのまま返せば十分です。
if (条件) return true; else return false; とほどいて書く必要はありません。
返す型:Python bool、JS・TS boolean、Java boolean、C# bool、C++ bool、C は <stdbool.h> の bool、Craykon は 返す の後ろに条件式を書きます。
同じ関数を横と縦に一回ずつ呼び、&&(Python は and)でつなぎます。
落とし穴は四つ:① 数学の a ≤ v ≤ b をそのまま書けるのは Python だけです(low <= v <= high)。
JS は low <= v <= high をエラーなしで受け付けますが、(low <= v) <= high と読み、前の比較の結果(0 か 1)を high と比べます。
だから high が 1 以上ならいつも真になります。
C・C++ も同じ意味に読みますが、gcc はそのままコンパイルし(-Wall を付けてはじめて警告が出ます)、最近の clang はエラーで止めます。
Java と C# は boolean と数を比べられないとしてコンパイルせず、TS も TS2365 エラーで止め、Craykon も「比較を続けて書けない」と言って止めます。
これらの言語では low <= v && v <= high と二つに分けて書きます。
② 頂点は入れ替わった順で来ることがあるので、min(a, b) と max(a, b) で小さい側・大きい側を先に決めます(Craykon 数学.小さい方、数学.大きい方)。
例では x1 = 8 が x2 = 2 より大きいです。
③ 縁の上も中なので、< ではなく <= です。
④ 横と縦の両方が合わなければならないので、|| ではなく && です。

Pythonmain.py · 13 行
def between(v, a, b):    """v가 a와 b 사이(양 끝 포함)에 있으면 True. a와 b는 어느 쪽이 커도 된다."""    return min(a, b) <= v <= max(a, b)  x1, y1, x2, y2 = map(int, input().split())n = int(input())for _ in range(n):    x, y = map(int, input().split())    if between(x, x1, x2) and between(y, y1, y2):        print("はい")    else:        print("いいえ")
JavaScriptmain.js · 14 行
// v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다function between(v, a, b) {  return Math.min(a, b) <= v && v <= Math.max(a, b);} const lines = require("fs").readFileSync(0, "utf8").split("\n");const [x1, y1, x2, y2] = lines[0].trim().split(/\s+/).map(Number);const n = Number(lines[1]);const out = [];for (let i = 0; i < n; i++) {  const [x, y] = lines[2 + i].trim().split(/\s+/).map(Number);  out.push(between(x, x1, x2) && between(y, y1, y2) ? "はい" : "いいえ");}console.log(out.join("\n"));
TypeScriptmain.ts · 16 行
import { readFileSync } from "node:fs"; // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다function between(v: number, a: number, b: number): boolean {  return Math.min(a, b) <= v && v <= Math.max(a, b);} const lines: string[] = readFileSync(0, "utf8").split("\n");const [x1, y1, x2, y2]: number[] = lines[0].trim().split(/\s+/).map(Number);const n: number = Number(lines[1]);const out: string[] = [];for (let i = 0; i < n; i++) {  const [x, y]: number[] = lines[2 + i].trim().split(/\s+/).map(Number);  out.push(between(x, x1, x2) && between(y, y1, y2) ? "はい" : "いいえ");}console.log(out.join("\n"));
JavaMain.java · 20 行
import java.util.Scanner; public class Main {    // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다    static boolean between(int v, int a, int b) {        return Math.min(a, b) <= v && v <= Math.max(a, b);    }     public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int x1 = sc.nextInt(), y1 = sc.nextInt(), x2 = sc.nextInt(), y2 = sc.nextInt();        int n = sc.nextInt();        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            int x = sc.nextInt(), y = sc.nextInt();            out.append(between(x, x1, x2) && between(y, y1, y2) ? "はい" : "いいえ").append('\n');        }        System.out.print(out);    }}
C#Main.cs · 27 行
using System; class Program{    // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다    static bool Between(int v, int a, int b)    {        return Math.Min(a, b) <= v && v <= Math.Max(a, b);    }     static int[] ReadInts()    {        return Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);    }     static void Main()    {        int[] r = ReadInts();        int n = ReadInts()[0];        for (int i = 0; i < n; i++)        {            int[] ball = ReadInts();            bool inside = Between(ball[0], r[0], r[2]) && Between(ball[1], r[1], r[3]);            Console.WriteLine(inside ? "はい" : "いいえ");        }    }}
C++main.cpp · 17 行
#include <algorithm>#include <iostream> // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다bool between(int v, int a, int b) {    return std::min(a, b) <= v && v <= std::max(a, b);} int main() {    int x1, y1, x2, y2, n;    std::cin >> x1 >> y1 >> x2 >> y2 >> n;    for (int i = 0; i < n; i++) {        int x, y;        std::cin >> x >> y;        std::cout << (between(x, x1, x2) && between(y, y1, y2) ? "はい" : "いいえ") << '\n';    }}
Cmain.c · 20 行
#include <stdbool.h>#include <stdio.h> // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다bool between(int v, int a, int b) {    int low = a < b ? a : b;    int high = a < b ? b : a;    return low <= v && v <= high;} int main(void) {    int x1, y1, x2, y2, n;    if (scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &n) != 5) return 0;    for (int i = 0; i < n; i++) {        int x, y;        if (scanf("%d %d", &x, &y) != 2) return 0;        puts(between(x, x1, x2) && between(y, y1, y2) ? "はい" : "いいえ");    }    return 0;}
Craykonmain.cray · 20 行
// v가 a와 b 사이(양 끝 포함)에 있으면 참. a와 b는 어느 쪽이 커도 된다사이인가(v, a, b){    返す 数学.小さい方(a, b) <= v && v <= 数学.大きい方(a, b);} r = コンソール.数読み();n = コンソール.行読み().数に();繰り返す (i = 0; i < n; i++){    ball = コンソール.数読み();    もし (사이인가(ball[0], r[0], r[2]) && 사이인가(ball[1], r[1], r[3]))    {        コンソール.書く("はい");    }    でなければ    {        コンソール.書く("いいえ");    }}