文字・数字リテラル使わずにHelloWorld...自分には解けず
Twitter の自分のタイムラインに何度か CodeIQ からのプロモーションが流れてて、「文字リテラル、数字リテラルを使わずに Hello World を出力せよ」というお題があった。
Restricted Words
https://codeiq.jp/ace/cielavenir/q431
おもしろそうではあったが、頭の固い自分ではどう解いて良いかパッとは思いつくことができず。
「きっとなんか難しいことやって、文字コードゴニョゴニョするんだろうなぁ」とだけ想像し、結局解けずにいた。
(難易度=初級で、しかも「当該領域で、基礎的なことができれば解けると思われるレベル」とのことだったので、なかなかに自分は残念なレベルだと、Code 2013 in 定山渓での JavaScript コードゴルフ以来、改めて思い知らされたが、さておき。)
解答例見てようやくひらめいた(但しズル)
しかしながら CodeIQ の締め切りがすぎてぼちぼちと解答例がネット上に現れ始めて、なるほど、こうやって解くのか、と感心して見ていたところ、ふと自分にも JavaScript での解答例が思いついた。
すでに締め切りは過ぎているが、余興ということでここに書いてみる。
console.log(
(function(){/*Hello World*/}).toString().match(/\*(.+)\*/).pop()
)
ブログ掲載上、改行したが、基本、ワンライナーだ。
おそらくは出題の意図とは異なるであろう、ズルい解法ではあるが...。
念のため解説
いくつか抜け道のポイントがある。
まずは「正規表現リテラルは、文字ないしは文字列リテラルじゃないよね...?」という点。
同様に「コメントも、文字ないしは文字列リテラルじゃないよね...?」という点である。
以上2点が許されるならば、以下のように実装できる。
まず、JavaScript では、ユーザー定義の関数は toString によって定義の全文が文字列で返される。
"定義の全文" である。
定義中に書かれたコメントとて例外ではない。
そこで関数定義中にコメントで「Hello World」と書いてしまい、これを toString() して文字列として手に入れたあと、正規表現で /* ~ */ の中の部分を取り出して返すわけだ。
まとめ
繰り返しになるが、出題者が問いたかったスキルに対する応えになっていない、出題文面の揚げ足を取ったような、ひねくれた解法だとは思う。
ただ、まぁ、「JavaScript だとコメントも取り出せちゃうね!」という余興として楽しむということでご容赦の程。
なお、回答者が500名以上もいらっしゃって、すでに上記解法も既出かもしれない。
かるくネットを検索してみたが、いろいろヒットしすぎて探すのもあきらめた。