備忘録なので乱文です。
YouTubeのトップ画面でサジェストされてきた動画がPythonの"""
をコメント扱いしていたのでカッとなって制作しました。
ちなみに、このようなコードをPolyglotというそうです。
コード全文
code.js
True//((d:=[])or(g:=[x for x in"""
=b=+!![];;;;;;for(i=a=b-b,e=b+b,f=e+e,g=f+f,j=g-b,c=escape("<")[e],l=String["from"+c+"har"+c+"ode"],d=[],h="4597DBCFA71A0546D5F6BDD4DB5E8A3BEA7B5C38CCF69380F0A4BB5422192A72EEDA241AD6777BBDDE67B33FB5E8A47F2CD317B4CCA27F4CB213BCCDB2FAACCA37FCCB233B4DDB37B4CCA17FAC3F1781E56498872A4D6BCD561BB735ABC3DEE3F654669FBBD2A5D875224785E2A5D8752A739BC2AE2B8CDBD67958EE9844BB43F0DE2679DD76A3A779E55F4D9AD3975D363AC5E27D67DD38785E3F272DD4741AD53767A7C5645A959E59A35EA93C9D96A3A442A49B4E56B795E3F23A25E25FB3DE6498449269897C337A85B6F9F4DCA5BFC782198652E59935CA5BFC782198655E59835D575B3C0749EB7E3D7905221DA4CBA2FAEC9A45AAFBB1FBDD3F73BBCE26FBFC822BB6ECE4F8BC8A03B8CE2679DD76A3AF56E4DA0DB22BB6ECE4F8BC822BB8D567F99E8E799359ADDEE5F219844963380F0A4BBF40B89C664BA9DE68BC505834261D87AE6A2CE62F61526D5F2DE6A3AE47279AFD9673A28B5D9EA51BE6A8513B5A25167397B467581E0F2BB9C8A13A5E82C792623C5A256E7BC148705ADD8213B4CFA75C4683698F5FA89D6683A1B4CFA71A07A25DD259AEA9FD270501496738EBFD47B1EF693DFBF54D92D4F2BC9EFE73B7E7A49B4C16AF81D5623AECCAB5AAB167391586D5F8D5673A8C9A7DB869A0BB9C028BC3DE6A3A454EDAE0DD569AECC25197B86D57953F23CB77A35AED2705C25";i<h.length;i+=j){d+=l(...[k=parseInt(h.slice(i,i+j).split("").reverse().join(""),b<<f),k>>j,k>>(""+b+f),k>>(""+e+b)].map(z=>z%(""+b+e+g)))};console.log(d.slice(a,d.length/f)+h+d.slice(d.length/f));;//"""if x in'0123456789ABCDEF'])and[(b:=int(''.join(A[::-1]),16))and[d.append(chr(x%128))for x in(b,b//128,b//16384,b//(8**7))]for A in __import__('itertools').batched(g,7)]and(h:=len(d)//4)and print(*d[:h],*g,*d[h:],sep='')or 1)
code.py
True//((d:=[])or(g:=[x for x in"""
=b=+!![];;;;;;for(i=a=b-b,e=b+b,f=e+e,g=f+f,j=g-b,c=escape("<")[e],l=String["from"+c+"har"+c+"ode"],d=[],h="4597DBCFA71A0546D5F6BDD4DB5E8A3BEA7B5C38CCF69380F0A4BB5422192A72EEDA241AD6777BBDDE67B33FB5E8A47F2CD317B4CCA27F4CB213BCCDB2FAACCA37FCCB233B4DDB37B4CCA17FAC3F1781E56498872A4D6BCD561BB735ABC3DEE3F654669FBBD2A5D875224785E2A5D8752A739BC2AE2B8CDBD67958EE9844BB43F0DE2679DD76A3A779E55F4D9AD3975D363AC5E27D67DD38785E3F272DD4741AD53767A7C5645A959E59A35EA93C9D96A3A442A49B4E56B795E3F23A25E25FB3DE6498449269897C337A85B6F9F4DCA5BFC782198652E59935CA5BFC782198655E59835D575B3C0749EB7E3D7905221DA4CBA2FAEC9A45AAFBB1FBDD3F73BBCE26FBFC822BB6ECE4F8BC8A03B8CE2679DD76A3AF56E4DA0DB22BB6ECE4F8BC822BB8D567F99E8E799359ADDEE5F219844963380F0A4BBF40B89C664BA9DE68BC505834261D87AE6A2CE62F61526D5F2DE6A3AE47279AFD9673A28B5D9EA51BE6A8513B5A25167397B467581E0F2BB9C8A13A5E82C792623C5A256E7BC148705ADD8213B4CFA75C4683698F5FA89D6683A1B4CFA71A07A25DD259AEA9FD270501496738EBFD47B1EF693DFBF54D92D4F2BC9EFE73B7E7A49B4C16AF81D5623AECCAB5AAB167391586D5F8D5673A8C9A7DB869A0BB9C028BC3DE6A3A454EDAE0DD569AECC25197B86D57953F23CB77A35AED2705C25";i<h.length;i+=j){d+=l(...[k=parseInt(h.slice(i,i+j).split("").reverse().join(""),b<<f),k>>j,k>>(""+b+f),k>>(""+e+b)].map(z=>z%(""+b+e+g)))};console.log(d.slice(a,d.length/f)+h+d.slice(d.length/f));;//"""if x in'0123456789ABCDEF'])and[(b:=int(''.join(A[::-1]),16))and[d.append(chr(x%128))for x in(b,b//128,b//16384,b//(8**7))]for A in __import__('itertools').batched(g,7)]and(h:=len(d)//4)and print(*d[:h],*g,*d[h:],sep='')or 1)
JavaScript側の解説
一行目。まず未定義変数のTrue
が現れますが、このあと1
が代入されるので心配はいりません。//
以降はコメントです。
二行目。変数h
に長大な文字列リテラルが代入されていますがPolyglot的には本質ではありません。いろいろ処理してconsole.log
したら再度コメントが開始されます。
Python側の解説
一行目。True
はPythonにとっては定数で、同じく//
は割り算して小数点以下を切り捨てる演算子です。これ以降のすべてのコードが演算子//
の右側を計算するものです。で、一行目の終わりに"""
が入っていますが、これは文字列リテラルの開始を意味します。コメントではないです。
二行目。まだ文字列リテラルが終了していません。で、末尾に//
がくっついていますがこれも文字列リテラルの一部です。そのあとにPythonコードがくっついています(改行をしたくないため、トリッキーな書き方をしています。:=
がかなり便利です)。最後のor 1)
で、ようやく一行目の演算子//
の右側が終了します。
余談
ソースコード自身を出力するコードをQuineというそうです。