真偽値を返す関数は、条件式をそのまま返せば十分です。 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])) { コンソール.書く("はい"); } でなければ { コンソール.書く("いいえ"); }}