1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ポエム】PythonにもJavaScriptにも解釈可能なコード

Posted at

備忘録なので乱文です。
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というそうです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?