ソースコードという名前のエンジニア向け日本酒が発売、ラベルにコードが書いてある…のをBingのAIチャットに解読してもらった。基本、JavaScriptを難読化していて、+!![]は1、~~[]は0、joinで数字をまとめてfromCodePointでUnicode文字にして出力している。
エンジニア向け日本酒「ソースコード」発売 ラベルには“ソースコード”で隠しメッセージ
という記事を見た。なんだこのラベル…JavaScriptであるということだけはわかるが…
ということでBingのAIチャットに聞いてみた。
javasciriptのこのコードの解説をしてください。
console.log(String.fromCodePoint([!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],].join("")))
こんにちは、これはCopilotです。JavaScriptのコードについてお尋ねですね。😊
このコードは、次のような処理を行っています。
!![]
は、空の配列を論理否定演算子!
で二回否定することで、true
に変換します。true
は数値に変換すると1
になります。したがって、!![]+!![]+!![]+!![]+!![]+!![]
は1+1+1+1+1+1
と同じで、6
になります。- 同様に、
!![]+!![]+!![]+!![]+!![]+!![]+!![]
は1+1+1+1+1+1+1
と同じで、7
になります。 [!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],]
は、[6,7]
という配列を作ります。.join("")
は、配列の要素を文字列に変換して、引数で指定した文字列(この場合は空文字列)で連結します。したがって、[6,7].join("")
は"67"
という文字列になります。String.fromCodePoint
は、引数で指定したコードポイントに対応する文字列を返します。コードポイントとは、文字を表す数値のことです。例えば、String.fromCodePoint(65)
は"A"
という文字列になります。- このコードでは、
String.fromCodePoint("67")
という引数を渡しています。この場合、"67"
は数値に変換されて67
になります。そして、コードポイント67
に対応する文字は"C"
です。 console.log
は、引数で指定した値をコンソールに出力します。コンソールとは、ブラウザの開発者ツールにある画面のことです。- したがって、
console.log(String.fromCodePoint([!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],].join("")))
は、"C"
という文字列をコンソールに出力します。
このコードは、JavaScriptの特徴を利用して、わざと分かりづらく書かれたものです。実際には、console.log("C")
と書けば同じ結果になります。
ではこのコードを解説してください。
console.log(String.fromCodePoint([+!![],+!![],~~[],].join("")))
このコードも前のコードと同様に、JavaScriptの特徴を利用して、わざと分かりづらく書かれたものです。次のような処理を行っています。
+!![]
は、空の配列を論理否定演算子!
で二回否定することで、true
に変換し、さらに単項プラス演算子+
で数値に変換します。したがって、+!![]
は1
になります。~~[]
は、空の配列をビット単位の否定演算子~
で二回否定することで、0
に変換します。ビット単位の否定演算子は、数値を32ビットの符号付き整数に変換してから、ビットを反転します。空の配列は数値に変換すると0
になり、そのビットを反転しても0
になります。[+!![],+!![],~~[],]
は、[1,1,0]
という配列を作ります。.join("")
は、配列の要素を文字列に変換して、引数で指定した文字列(この場合は空文字列)で連結します。したがって、[1,1,0].join("")
は"110"
という文字列になります。String.fromCodePoint
は、引数で指定したコードポイントに対応する文字列を返します。このコードでは、String.fromCodePoint("110")
という引数を渡しています。この場合、"110"
は数値に変換されて110
になります。そして、コードポイント110
に対応する文字は"n"
です。console.log
は、引数で指定した値をコンソールに出力します。- したがって、
console.log(String.fromCodePoint([+!![],+!![],~~[],].join("")))
は、"n"
という文字列をコンソールに出力します。
このコードは、console.log("n")
と書けば同じ結果になります。
なるほど…というかこれメッセージが現れるだけなのか?とりあえず最初の5文字だけは見えた。瓶がじゃまで…
Congr
追記:
Pythonでこの難読JavaScriptのコードを再現するコードを書いて(何をしていることやら)
ラベルと見比べた結果、
Congratulations!
を繰り返してるな…
…いや違う!
ネタバレは避けるがまだ先があった!
ソースコードという名前の日本酒。
— tomo (@tonagai) February 9, 2024
ラベルに難読JavaScriptが書いてあって、Congratulations!
だと推定したが違ってた!実はわざと間違っていて、それを公式ページのあるところのコンソール画面を解読するとどこかをクリックするように指示され…
最終的にお得に。https://t.co/If4UyledLJ https://t.co/BHiDiWPI3x pic.twitter.com/wuJTY6aNuy
ヒントはこれ。
ソースコードという名前の日本酒の隠しメッセージのヒントを同じ難読JavaScriptで書いてみた。 pic.twitter.com/udonqQDNk1
— tomo (@tonagai) February 13, 2024
« 富の分布(最初に同じお金を持っていて、任意の2人でじゃんけんで勝った人が負けた人から1つもらうとだんだん指数分布になる)をPythonでGIFアニメにしてみた。 | トップページ | Pythonの高周波用ライブラリscikit-rfを含んだコードをPyinstallerでEXE化するときFileNotFoundError が出て動かない…が何とかなった。がファイルサイズがでかい…あとspecファイルにonefileしようとしてこれもハマる(option(s) not allowed)が、これは完全に勘違いしていた。 »
「パソコン・インターネット」カテゴリの記事
- 高周波回路シミュレータQucsStudioがuSimmicsに名称変更し、バージョンも4.8.3から5.8にアップデートされた。Qucsと区別するためだそうだ。また、Pythonの高周波用ライブラリscikit-rfもv1.5.0にバージョンアップされていた(2024.12.04)
- MATLAB OnlineのSimulinkでローレンツ方程式をode8で計算してみる。Interface 2025年1月号でMATLAB Onlineの半年ライセンスがついてきたので。Simulinkを使うのは初めてだったが、わかりやすいSimulink入門コースを修了したのですぐできた。(2024.12.04)
- Interface2025年1月号はMATLABで1ニューロンから手作り 数学&図解でディープ・ラーニング。初歩からAlexNetの転移学習、CNNまで話題が豊富で、なんとMatlab Onlineの半年ライセンスがついてくる。Simulinkや各種toolboxも使える。早速MATLAB入門オンラインコース修了した。(2024.12.03)
「日記・コラム・つぶやき」カテゴリの記事
- 高周波回路シミュレータQucsStudioがuSimmicsに名称変更し、バージョンも4.8.3から5.8にアップデートされた。Qucsと区別するためだそうだ。また、Pythonの高周波用ライブラリscikit-rfもv1.5.0にバージョンアップされていた(2024.12.04)
- 日経サイエンス2025年1月号の特集 和算再発見の佐藤賢一さんの記事「算聖 関孝和の実像」に出てきた矢高に対する円弧の2乗の近似式をカシオの高精度計算サイトkeisan.casio.jpの自作式として作った。ものすごい精度であることがよくわかる。(2024.12.03)
- MATLAB OnlineのSimulinkでローレンツ方程式をode8で計算してみる。Interface 2025年1月号でMATLAB Onlineの半年ライセンスがついてきたので。Simulinkを使うのは初めてだったが、わかりやすいSimulink入門コースを修了したのですぐできた。(2024.12.04)
« 富の分布(最初に同じお金を持っていて、任意の2人でじゃんけんで勝った人が負けた人から1つもらうとだんだん指数分布になる)をPythonでGIFアニメにしてみた。 | トップページ | Pythonの高周波用ライブラリscikit-rfを含んだコードをPyinstallerでEXE化するときFileNotFoundError が出て動かない…が何とかなった。がファイルサイズがでかい…あとspecファイルにonefileしようとしてこれもハマる(option(s) not allowed)が、これは完全に勘違いしていた。 »
コメント