どーも、はどはど です。
今回は「ゆの in Language」に挑戦してみました。
「ゆの in Language」とは?
プログラムのハック遊び。 X / _ / X < 来週も見てくださいね! といったアスキーアートを含む一文を 演算子オーバーロードなどを用いて 実行可能なプログラムとして解釈させ ひだまりスケッチ×365 来週も見てくださいね! とコンソールに出力させる。 (ただし、前提や出力を厳密に定めているわけはない)
引用:ゆの in languageとは – はてなキーワード
JavaScriptで書く
上の引用元には、JavaScriptによる例が2つ載ってますが、
2つとも「eval」の使用を許していました。
evalが使えちゃうと、何でもできてしまう感があるので、
今回、eval禁止で「ゆの in JS」が書けるのか試してみました。
できたのがこちら
const X=1,_=2739e-6,T="ひだまりスケッチ×",$=()=> X / _ / X << "来週も見てくださいね!" console.log(`${T}${$()} ${([]+$).slice(-12,-1)}`);
はい、「<」ではなく「<<」を使ってしまいました。
まあ細かいことは気にしない方向で・・・
とりあえず解説
ひとまず、わかりやすくバラしてみます。
const X = 1, _ = 2739e-6, T = "ひだまりスケッチ×", $ = () => X / _ / X << "来週も見てくださいね!" console.log(`${ T // "ひだまりスケッチ×" }${ $() // 365 } ${ // "来週も見てくださいね!" ( [] + $ ).slice(-12, -1) }`);
まずはこれ。
+ const X = 1, + _ = 2739e-6, T = "ひだまりスケッチ×", + $ = () => X / _ / X << "来週も見てくださいね!" console.log(`${ T // "ひだまりスケッチ×" }${ $() // 365 } ${ // "来週も見てくださいね!" ( [] + $ ).slice(-12, -1) }`);
変数「 _ 」に入っている「 2739e-6 」は 「 0.002739 」です。
「X / _ / X」すなわち、「 1 ÷ 0.002739 ÷ 1 」の答えは、
「 365.0967506389193 」となります。
そしてフキダシを「<<」にしているのは、
「数値型 << 文字列型」のようにすると、
小数点以下を切り捨てることができるからです。
なので「 X / _ / X << “来週も見てくださいね!” 」の答えは
小数点以下が切り捨てられた「 365 」になります。
つまり、この計算で「ひだまりスケッチ×365」の数字を作ったわけです。
次はこれ
const X = 1, _ = 2739e-6, T = "ひだまりスケッチ×", + $ = () => X / _ / X << "来週も見てくださいね!" console.log(`${ T // "ひだまりスケッチ×" }${ $() // 365 } ${ + // "来週も見てくださいね!" + ( [] + $ ).slice(-12, -1) }`);
なぜ変数「 $ 」を関数型にしたのかというと、
関数の内容を文字列として扱うからです。
わざわざ難しく「 [] + $ 」と書いてますが、
これは単純に「 $.toString() 」と処理は同じです。
この1行では、「 来週も見てくださいね! 」という文字列を、
関数の処理内容が書かれた文字列から切り出しています。
以上が、このコードの解説です。
おわりに
本当は「<」を使って何とかできないか考えてみましたが、
なかなか思いつかなかったので「<<」を使って書いてみました。
「ゆの in language」はとても奥が深い遊びなので、
よかったら皆さんも得意な言語でチャレンジしてみては
JavaScript Ninjaの極意 ライブラリ開発のための知識とコーディング (Programmer's SELECTION)
いちばんやさしいJavaScriptの教本 第2版 ECMAScript 2017(ES8)対応 人気講師が教えるWebプログラミング入...
コメント