Not Quine.js 28B いった

Not Quine.js の 28B を取った。満点。

Shmiddty さんは 30B を取得しているが、名義を以下のようにわけている。

  • Shmiddty
  • Shmiddty (read)

おしりに (read) がついているほうの回答では 31B だ。この read とは、きっと間違いなく「read 関数を使用している」という意味である。

例えば Quine.js では、teebee さんが以下のコードで最短を出している。

putstr(read("test.js"))

Not Quine.js でも、こういった read の応用が効く。実際に、昨日投稿した 31B のコードでは read を使用した。

おしりに (read) がついていないほうの Shmiddty さんの回答は、30B である。read がついていないということは、きっと「read 関数を使用していない」という意味であろう。おそらくそうに違いない。なぜならば、仮に、read を使用したコードで 30B まで短くできたとしよう。それを間違えて (read) なしの名義で投稿したとする。この時点では、あたかも、30B は read 未使用のコードであるように見える。しかし、仮にそんなミスをしたとしても、改めて (read) 名義で 30B の投稿を行うはずである。2 つの名義を使っているのに、どちらも同じコードなのは幻惑的であるが、名義に (read) が含まれていないからといって read を使っていないという宣言にはならない。わざわざ名義をわけるという、ていねいなプレイしているのだから、ていねいにケアするはずである。

つまり、Shmiddty さんの名義わけヒントは信用に値するということである。ゆえに、30B のコードでは read 関数を使用していないことがほぼ明らかである。

FizzyTea さんも同様である。(read) 名義のほうでは 36B だが、そうでないほうでは 28B である。28B のコードには read 関数が使われていないことがほぼ明らかである。

現時点で満点の 28B を取っているのは leonid さん、FizzyTea さん、0mg である。この三者の Statistics は全て同じ数値となっている。すなわち、「0B / 14B / 12B」である。このことから、28B のコードは全て同じ構造をしていると考えて問題なさそうだ。

以上のことから、28B のコードを知らずとも、導き出せるヒントは以下である。

  • read を使用せずに 28B 取れる
  • 3 者の 28B コードは全て同じ構造をしている
  • 0mg は read を使用せずに 28B 取った

ネタバレ(spoiler)は重大なマナー違反だが、ヒントも、人によっては興ざめとなりうる。なので、もうすでにオープンである上記のヒント以外のヒントを、参加者の目に留まりうるこのブログ記事に書くわけにはいかない。

だが、もうすでにオープンであるヒントを噤むことに価値はない。ゆえに、書く。28B のコードでは read 関数を使っていない、と。

あんな方法でいけるとは思わなかった。さぐりさぐり何度も投稿しながら試していたら、偶然、通った。よくもまあ、あんなコードが、うまいこと通る出力になるもんだなあ、というのが感想である。