第77回【JavaScript】タイルの敷き詰め、積の最小化

現在取り組んでいるのは、paiza ラーニング問題集「条件分岐メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

JavaScript をゼロから勉強してみよう、のコーナー 77 回目です。

ここのところいろいろと試行錯誤していたアプリが一応の完成を見せました。まぁ、社内のみの自己満足アプリなんですけれど。やり始めると凝り始めて、なかなかのものになったと思います。ここで得た知見から、新しいサービスに繋げることが出来ればなぁ。

それでは、今日も頑張ってみようと思います。

タイルの敷き詰め (paizaランク C 相当)

高さH、幅Wの箱( 0 ≦ H, W ≦ 10^9 )があります。この箱を 1 つ以上の高さ 2 、幅 2 の四角いタイルで敷き詰めます。箱に隙間なくタイルを敷き詰めることはできますか?


入力される値

H W

入力値最終行の末尾に改行が1つ入ります。


期待する出力

箱に隙間なくタイルを敷き詰めることができる場合はYESを、そうではない場合はNOを出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。

YES

または

NO

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ H, W は 0 以上 10^9 以下の整数


入力例

6 2

出力例

YES

2 の倍数ならいいか、と思ったらひっかかる。タイルが 1 枚も敷けないこともある。高さと幅が 0 のこともあるかもしれない。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const [h,w] = lines[0].split(/\s/).map(Number);
  if (h < 2 || w < 2) {
      console.log('NO');
  } else if (h % 2 == 0 && w % 2 == 0) {
      console.log('YES');
  } else {
      console.log('NO');
  }
});
Python
H,W = map(int,input().split())
if H < 2 or W < 2:
    print("NO")
elif H % 2 == 0 and W % 2 == 0:
    print("YES")
else:
    print("NO")

積の最小化 (paizaランク C 相当)

-1,000 ≦ A ≦ B ≦ 1,000 を満たす 2 つの整数 A, B が与えられます。A 以上 B 以下である 2 つの整数 X, Y を適当に選んだとき、X * Y の取り得る値の最小値を出力してください。なお、X と Y は同じ値でもよいものとします。
たとえば A が 3, B が 5 の場合について考えます。これは X と Y を両方とも 3 にしたときが最小で、 X * Y が 9 となります。


入力される値

A B

入力値最終行の末尾に改行が1つ入ります。


期待する出力

答えとなる数値Nを出力してください。

N

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ A, B は -1,000 以上 1,000 以下の整数
・ A ≦ B


入力例

3 5

出力例

9

3 パターンについて、それぞれ考えてみれば解けるやつ。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const [a,b] = lines[0].split(/\s/).map(Number);
  if (a <= 0 && b >= 0) {
      if (Object.is(a * b, -0)) {
        console.log(0);
      } else {
        console.log(a * b);
      }
  } else if (a > 0) {
      console.log(a * a);
  } else {
      console.log(b * b);
  }
});
Python
A,B = map(int,input().split())
if A <= 0 and B >= 0:
    # A が負の数 B が正の数
    print(A * B)
elif A > 0:
    # A も B も正の数
    print(A * A)
else:
    # A も B も負の数
    print(B * B)

最後に

大きな罠が隠されてました。JavaScript では、負の数 * 0 は、-0 って表示されるんですね。恥ずかしながら知りませんでした。Object.is を利用した調べ方が正しいかどうかはわからないです。

一番、スムーズに書く方法としては、正しい気がしてますが、なんかもっと素敵な書き方もあるのかもしれない。どなたか素敵な書き方を教えてください。

引き続き、よろしくお願いいたします!

Python の第77回はこちら