あらすじ
最近 JavaScript を学び始めた知り合いが、JavaScript は暗黒の言語であるという話をどこかで聞いてきたらしい。
この言語を愛して止まない私としては「そうだね」以外の言葉が出てこなかったので、開き直って暗黒面を育む問題集をひっそりと作り始めたのであった。
想定対象
「JavaScript、だいたいわかります」という諸氏に遊んでいただければ幸い。
初学者にとっては混乱を招く内容にしかならないので、避けたほうが良いように思う。
前提条件
- ES2020 (Standard ECMA-262 11th edition) に従う。
- strict モード ("use strict" 指定) で実行される。
- 組み込みのオブジェクトを変更してはならない。
- ブラウザの機能等、環境依存の API を用いてはならない。
問題
全 10 問
時間制限はない
解は複数存在し得る
問1. 私は私ではない
以下の関数 q1
が true
を返すような値 x
を与えよ。
function q1(x) {
return x !== x;
}
問2. 直観に反する
以下の関数 q2
が true
を返すような値の組 a
, b
を与えよ。
function q2(a, b) {
return a == b && a != b;
}
問3. さよなら推移律
以下の関数 q3
が true
を返すような値の組 a
, b
, c
を与えよ。
function q3(a, b, c) {
return a == b && b == c && a != c;
}
問4. 同じトコロに違うモノ
以下の関数 q4
が true
を返すような値 x
を与えよ。
function q4(x) {
const a = [0, 1];
return x == x + x && a[x] != a[x + x];
}
問5. 実例の実例
以下の関数 q5
が true
を返すような値 x
を与えよ。
function q5(x) {
return x instanceof x;
}
問6. 入ってます
以下の関数 q6
が true
を返すような値 x
を与えよ。
function q6(x) {
return x in x;
}
問7. いちたりない
以下の関数 q7
が true
を返すような値 x
を与えよ。
function q7(x) {
return Array.isArray(x) &&
!Array.prototype.some.call(x, v => v) &&
x.length === 7 &&
new Set(x).size === 7 &&
Array.prototype.reduce.call(x, i => i + 1, 0) === 6;
}
問8. おおきすぎる
以下の関数 q8
が、必ず true
を返すような関数 f
を与えよ。
function q8(f) {
const n = 4294967297;
const i = Math.floor(Math.random() * n);
const x = f(n);
return x[i] === i;
}
問9. 見慣れない構文
以下の関数 q9
が、必ず true
を返すような値 each
を与えよ。
function q9(each) {
const array = new Array(10);
for (let i = 0; i < 10; i++) {
array[i] = Math.floor(Math.random() * 10);
}
const total = array.reduce((x, y) => x + y, 0);
for (each.item of array);
return each.sum === total;
}
問10. 次の日は別の人
以下の非同期関数 q10
が、最終的に true
を返すような関数 f
を与えよ。
async function q10(f) {
const x = await f();
const y = await x;
return !Object.is(x, y);
}
// q10(answer).then(value => console.log(value)); // true
解答例
(解答例) JavaScript 暗黒問題集 - Qiita
ネタバレになりそうなコメントは、解答記事の方にしていただけると助かります。