Skip to content

Commit 2c9fc26

Browse files
committed
add colab
1 parent b874a8a commit 2c9fc26

File tree

4 files changed

+196
-0
lines changed

4 files changed

+196
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
|title(link)|code|
3131
|---|---|
3232
|[技育プロジェクト](https://github.com/m3dev/crazy_programming/tree/main/quiz/javascript/geek)|`[_='GEEK'.small()[2]]+[-~_._\|2];`|
33+
|[TypeTypeType](https://github.com/m3dev/crazy_programming/tree/main/quiz/typescript/typetypetype)|`let type = "type";...`|
34+
|[Colab](https://github.com/m3dev/crazy_programming/tree/main/quiz/javascript/colab)|`((_,$=[].push(_,_))=>...`|
3335

3436
</details>
3537

quiz/javascript/colab/.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
25.2.1

quiz/javascript/colab/README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Colab
2+
3+
Author: [@vaaaaanquish](https://github.com/vaaaaanquish)
4+
5+
サポーターズ株式会社が運営するColab Conf 2025に向けて作成した問題です。
6+
7+
```javascript
8+
console.log(((_,$=[].push(_,_))=>`${(typeof $)[$]}${String($/$.$).length}`)("Colab"));
9+
```
10+
11+
## 実行
12+
13+
```sh
14+
nvm use
15+
node -e "console.log(((_,$=[].push(_,_))=>`${(typeof $)[$]}${String($/$.$).length}`)("Colab"));"
16+
```
17+
18+
## 解説
19+
20+
`explanation.md`で解説しています
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# 解説
2+
3+
```bash
4+
node -e "console.log(((_,$=[].push(_,_))=>`${(typeof $)[$]}${String($/$.$).length}`)(\"Colab\"));"
5+
```
6+
7+
このクイズコードがなぜ `m3` を出力するのか、ステップごとに解説します。
8+
9+
---
10+
11+
## 全体の構造
12+
13+
中身だけ抜き出すと、こういう形です。
14+
15+
```javascript
16+
((_,$=[].push(_,_)) => `${(typeof $)[$]}${String($/$.$).length}`)("Colab")
17+
```
18+
19+
* 即時実行関数(IIFE)
20+
* 第1引数:`_``"Colab"` が渡される
21+
* 関数本体の戻り値を `console.log` で出力している
22+
23+
---
24+
25+
## 1. 引数とデフォルト値
26+
27+
```javascript
28+
(_,$=[].push(_,_)) => ...
29+
```
30+
31+
ここでのポイントは `$` の初期化です。
32+
33+
```javascript
34+
$ = [].push(_,_)
35+
```
36+
37+
* `[]` は空配列
38+
* `[].push(_, _)`
39+
40+
* 配列に 2 つ要素を追加し
41+
* 戻り値として「新しい配列の長さ」を返す
42+
43+
したがって、
44+
45+
```javascript
46+
$ === 2
47+
```
48+
49+
となります。
50+
ここで渡した `_("Colab")` の中身そのものは、「値としては」どこでも直接使われていません(あくまで「2 個 push するため」に使っているだけ)。
51+
52+
---
53+
54+
## 2. `(typeof $)[$]``'m'` を取り出す
55+
56+
次の部分を見ます。
57+
58+
```javascript
59+
(typeof $)[$]
60+
```
61+
62+
* さきほどの計算で `$ === 2`
63+
* `typeof $`
64+
65+
```javascript
66+
typeof 2 // "number"
67+
```
68+
69+
となるので、これは
70+
71+
```javascript
72+
"number"[2]
73+
```
74+
75+
と同じです。
76+
77+
文字列 `"number"` を配列のようにインデックスアクセスすると、
78+
79+
* `"number"[0]``'n'`
80+
* `"number"[1]``'u'`
81+
* `"number"[2]``'m'`
82+
83+
したがって、
84+
85+
```javascript
86+
(typeof $)[$] === "m"
87+
```
88+
89+
になります。
90+
91+
---
92+
93+
## 3. `String($/$.$).length``3` を取り出す
94+
95+
次の部分はこちらです。
96+
97+
```javascript
98+
String($ / $.$).length
99+
```
100+
101+
### 3-1. `$ / $.$` の中身
102+
103+
* `$` は数値 `2`
104+
* `$.$` は「数値 2 のプロパティ `.$`」ですが、そんなプロパティは存在しないので `undefined`
105+
106+
したがって、
107+
108+
```javascript
109+
$ / $.$ // 2 / undefined → NaN
110+
```
111+
112+
`NaN`(Not-a-Number)が得られます。
113+
114+
### 3-2. `String(NaN).length`
115+
116+
次にそれを `String(...)` で文字列化し、長さを取っています。
117+
118+
```javascript
119+
String(NaN) // "NaN"
120+
String(NaN).length // 3
121+
```
122+
123+
よって、
124+
125+
```javascript
126+
String($/$.$).length === 3
127+
```
128+
129+
です。
130+
131+
---
132+
133+
## 4. テンプレートリテラルで結合 → `"m3"`
134+
135+
最終的な戻り値はテンプレートリテラルで作られています。
136+
137+
```javascript
138+
`${(typeof $)[$]}${String($/$.$).length}`
139+
```
140+
141+
ここにこれまでの結果を代入すると、
142+
143+
* `(typeof $)[$]``"m"`
144+
* `String($/$.$).length``3`
145+
146+
なので、
147+
148+
```javascript
149+
`${...}${...}`"m3"
150+
```
151+
152+
になります。
153+
この文字列が `console.log` に渡されるため、最終的な出力は
154+
155+
```text
156+
m3
157+
```
158+
159+
となります。
160+
161+
---
162+
163+
## まとめ
164+
165+
このワンライナーのポイントは:
166+
167+
1. `[].push(_, _)` の戻り値で「2」を作る
168+
2. `typeof 2``"number"` からインデックス `[2]``"m"` を抜き出す
169+
3. `2 / undefined``NaN` を作り、`String(NaN).length``3` を取り出す
170+
4. それらをテンプレートリテラルで `"m3"` に結合する
171+
172+
という、「型名 `number``NaN` の文字列表現を利用した」かなりきれいな難読パターンになっています。
173+

0 commit comments

Comments
 (0)