whileD'iary

日記とか

JS記号プログラミングをやって思ったこと

はじめに

adventar.org

の24日目の記事です

アドベントカレンダーが始まってから24日も経つんですね、はやい

さて今回は、最近JavaScript記号プログラミングをやっていたので、それについて思ったことを書こうと思います

JavaScript 記号プログラミングについて

次のコードを見ていただくと、雰囲気はわかると思います

配列から数値が生成できたり、配列から文字列が作成できる。 しかも次のコードから関数オブジェクトが作成できるので、実質なんでもできます。

[]["constructor"]"constructor"

1 //1
-~[] //1

// constructorと出力
([][$_=([]+{})[-~-~-~-~-~[]]+([]+{})[-~[]]+([][[]]+[])[-~[]]+(![]+[])[-~-~-~[]]+((!![]+[])[-[]])+((!![]+[])[-~[]])+([][[]]+[])[-[]]+([]+{})[-~-~-~-~-~[]]+(!![]+[])[-[]]+([]+{})[-~[]]+(!![]+[])[-~[]]][$_]((([]+{})[-~-~-~-~-~[]]+([]+{})[-~[]]+([][[]]+[])[-~[]]+(![]+[])[-~-~-~[]]+([]+{})[-~[]]+(![]+[])[-~-~[]]+(![]+[])[-~-~-~-~[]])+'.'+(![]+[])[-~-~[]]+([]+{})[-~[]]+(([]+[])[$_]+[])[-~-~-~-~-~-~-~-~-~-~-~-~-~-~[]]+([][$_]+[])[(-~[]<<-~-~-~-~[])+(~-~[])]+"'"+$_+"'"+([][$_]+[])[(-~[]<<-~-~-~-~[])+(~[])]))() 

// constructorと出力
(function(){console.log('constructor')})()

思ったこととか

  • 文字数が少ないほど見にくくなっていい感じになる
    • 使える文字数が増えるにつれ便利になっていくので推測しやすい
  • =や,などの推測可能な文字はできるだけ避けた方がいい
    • 上記のconstructorの例だとわかりやすいが、変数っぽく見える
    • <<などのシフト演算なども避けたほうがいい
  • 改行はしないほうがいい

だいたい以上のリスト通りやるとみにくくなるんじゃないかと思います

シンプルなほどわかりにくいってのはBrainf*ckやwhitespaceが教えてくれている

短く難読化しようとすると、以外にも法則が見つかってしまうので、ここが悩ましいところ

個人的にはダブルクォーテーションや、シングルクォーテーションなど、一発で文字列とわかってしまうのはあまり使いたくなかったのですが、時間なかったのでこれでやってしまった

あと記号プログラミングは先輩がやっていたからやってみたのですが、最初は敬遠していたものの、案外パズルみたいで楽しいですねこれ

皆さんもやってヤバイコード見つけて教えてください

明日のアドベントカレンダー最後の記事を飾るのはかったーさんです