0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TIPSAdvent Calendar 2023

Day 5

【Lua】Quine

Last updated at Posted at 2023-12-04

業務で使えない技術です。

コードと解説

local quine = "local quine = %q; print(quine:format(quine))"; print(quine:format(quine))

実行すると、実行したのと同じコードが出力されます。

quine:format(quine)

このコードのミソです。

string.format(quine, quine)

と同じで、文字列 quine の変換指示句を quine に置き換えます。有限長のコードで「出力のコードを実行する」という操作が無限回行えるからくりです。

%q 指示句

Lua ソースコード上に展開しても正しく読まれるようにエスケープして置き換える指示句です。例えば、"hogehoge" で置換させようとすると \"hogehoge\" で置換されます。これは print すれば "hogehoge" になります。

反対に、%s を置換すると "hogehoge"hogehoge として置換しますので、print するとダブルクォートが抜けてしまいます。

構造

変数 s の宣言部を A、出力部を B として、以下のような構造になっています。

A"A%qB"B

出力時、%q"を含むダブルクォートの中身に置き換えられますので全く同じ構造が現れることがわかります。

おわりに

ChatGPT 3.5 に「Quine 作って!」とお願いしたら出てきたコードです。
https://github.com/MakeNowJust/quine/blob/main/quine.lua
ここが学習元かな。。。と思っています。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?