一歩ずつ簡単なjs版quineプログラムを書きます.


原文自転->ここです
朝にジャストjavacの大きな文章を見ました.javascriptのquineプログラムアップグレード版というプログラムの概念を調べてみました.
一つのquineはコンピュータプログラムで、入力は一切受け付けません.そして唯一の出力は自身のソースコードです.
面白いと思います.自分でjsで書いてみます.
まず、出力方式がコンソールであること、すなわちconsole.logを介して出力されることが決定される.
趣味(gao)を持つために、「自局ドメイン名を印刷する」「追加機能」から開始するつもりです.
console.log("perichr.org")
このコマンドは、制御バーで行perichr.orgをプリントすることができる.次に、quineの目標を達成するまで、このコマンドを一歩ずつ改造するつもりです.
まず上のコマンドを印刷してみます.
console.log('console.log("perichr.org")')
このようにして制御欄に行console.log("perichr.org")を印刷した.ソースコードには別の引用符が使われています.これは転義符を避けるためです.
そうだ、自分を実行する必要があることを忘れないでください.
console.log("perichr.org");console.log('console.log("perichr.org")')
とても良くて、このようにすぐ“余分な機能”を実行して、また自分のソースを印刷しました.自分のソースコードを印刷していませんよね.簡単に手に入れたら、ソースコードを全部印刷することを考えずに、まずどのように機能を実行しながら機能コードを印刷できますか?印刷したのは文字列で、実行したのはjsソースコードです.何を思い出しましたか?そうだ、eval!
p='console.log("perichr.org")';eval(p);console.log(p)
はい、今回はperichr.orgconsole.log("perichr.org")を完璧にプリントしました.注意したいのは、ここの変数pは声明をしていません.厳しいモードでは通じませんよ.
でも、まだまだ足りないです.少し調整します.
p='console.log("perichr.org");console.log(p)';eval(p)
見つけましたか?今回の出力はperichr.orgconsole.log("perichr.org");console.log(p)です.進化しました次に、まず巧妙にして、赋価表式を利用して、右の値に戻すという小テクニックでコードを簡略化します.コードが簡単になるほど、心理的ストレスが少なくなります.
eval(p='console.log("perichr.org");console.log(p)')
これからどうしますか??上のソースコードと出力コードを比べてみます.console.log("perichr.org");console.log(p)、実はすでに有木に近いです.出力コードはヘッドeval(p='とテール')が欠けています.さあ、間に合わせてください
eval(p='console.log("perichr.org");console.log("eval(p=\'"+p+"\')")')
補っている時にもう一つの問題に気づいたはずです.ここではもはや転義符は避けられない!出力コードを見てみます.eval(p='console.log("perichr.org");console.log("eval(p='"+p+"')")')いいですね.もう十分近いですよね.でも、ちょっと問題があります.間違いないです.出力時のソースコードの\''に変換されました.どうすればいいですか?テキストの'\'に反転します.どのように曲がりますか?このような方法は"'".replace(/'/g,"\\'")を使用することができる.テキストがpの割当時に変換されるべきであることを考慮すると、手動での反転が必要となる.次にそれをソースに挿入します.
eval(p='console.log("perichr.org");console.log("eval(p=\'"+p.replace(/\'/g,"\\\\\'")+"\')")')
ちょっと待ってください.何か間違いがありますか?先ほど大きな波に使えるバックスラッシュをソースコードに入れましたか?知っていてください.この商品も意味が変わりますよ.どうすればいいですか?いいですね.反転義コードを改造します.このタンブラーの引用符とバックスラッシュは全部反転します.'.replace(/\'/g,"\\\\\'")'、ここの.replace(/[\\']/g,"\\$&")はマッチした文字列を返します.手動反転の意味:$&、もう一回:
eval(p='console.log("perichr.org");console.log("eval(p=\'"+p.replace(/[\\\\\']/g,"\\\\$&")+"\')")')
コンソールで試してみます.成功しました.パーフェクト!強力です分も違わずに自分に帰りました.任務は円満に完成しました.
どうですか?大きく見えるものですが、入門は簡単ですよね?
このようなものを書くのに苦労している人がいますが、何の意味がありますか?まあ、この世界は「ある人の意味」のためにあるのではないです.世界の存在意義は「世界存在」という現象そのものにあります.このものを振り回している意味は、コードを振り回しているということ自体にあります.意味のあるものを得たと思います.どうですか?