eval無しで「ゆの in JavaScript」

2019年2月17日JavaScript,TECHNOLOGY

どーも、はどはど です。
今回は「ゆの 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 Ninjaの極意 ライブラリ開発のための知識とコーディング (Programmer's SELECTION)

John Resig, Bear Bibeault
3,580円(04/26 14:55時点)
Amazonの情報を掲載しています