diff --git a/README.md b/README.md index 079e457..610890c 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ |Python|[M3 Python Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/python)| |Python|[出力が動くFukuoka採用Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/python)| |Ruby|[M3 Ruby Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/ruby)| +|Ruby|[M3 Logo Ruby Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/ruby)| |Scala|[M3 Scala Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/scala)| |Swift|[M3 Swift Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/swift)| |Swift|[M3 Swift Quine: iOSDC Japan 2025 edition](https://github.com/m3dev/crazy_programming/tree/main/quine/swift)| diff --git a/quine/ruby/README.md b/quine/ruby/README.md index 241471d..82dc61d 100644 --- a/quine/ruby/README.md +++ b/quine/ruby/README.md @@ -2,20 +2,41 @@ Rubyで作成したQuine +- M3 Ruby Quine + - Author: [@ma2gedev](https://github.com/ma2gedev) - M3 Logo Ruby Quine - Author: [@ma2gedev](https://github.com/ma2gedev) -## 実行 +## M3 Ruby Quine / quine.rb -### m3_logo_quine.rb +### 実行 ```sh -ruby m3_logo_quine.rb +ruby quine.rb ``` -## 解説 +次のバージョンで動作確認しています。 + +- ruby 3.3.10 (2025-10-23 revision 343ea05002) [arm64-darwin24] +- ruby 3.4.8 (2025-12-17 revision 995b59f666) +PRISM [arm64-darwin24] +- ruby 4.0.0 (2025-12-25 revision 553f1675f3) +PRISM [arm64-darwin24] + +### 解説 + +アニメーション時にコード部分が削られていますが、誤り訂正を行っているのでどのフレームで切り取っても Quine として実行することが可能です。 +誤り訂正は tompng さんの [TRICK 2022 受賞作品](https://github.com/tric/trick2022/tree/bb9bc225ed0c1a4122b2ea8131f091162175d1ba/01-tompng)で使われている手法をベースにしています。誤り訂正をするコードが非常に短いコードで実現されていて驚きです。 + +-a オプションでコード部分を全て出力することもできます。 + +## M3 Logo Ruby Quine / m3_logo_quine.rb + +### 実行 + +```sh +ruby m3_logo_quine.rb +``` -### m3_logo_quine.rb +### 解説 画像のビットマップデータを Base64 エンコードしたものをコードに埋め込み、それを元にビットマップを復元して自身のコードをビットを元に当てはめて出力しています。 ロゴ画像中の文字を描画する箇所が少なく、zlib や 36 進数にするなどの圧縮ではコードに収まりきらないため、 diff --git a/quine/ruby/quine.rb b/quine/ruby/quine.rb new file mode 100644 index 0000000..1e03ea6 --- /dev/null +++ b/quine/ruby/quine.rb @@ -0,0 +1,26 @@ +eval((s=%w'm=1;Integer.class_eval{define_method(:quo){|n|self*n.pow(87,89)%89};define_method(:abs){s +elf%89}};require"matrix";u=*?"..?};u-=[?@,92.chr,?`];39.times{|i|t=(0..54).map{u.index(d[i+39*_1])}; +a=[];b=[];22.times{|i|b<<0;a<<[];t.zip(1..).each{|w,j|c=j.pow(i,89);(w)?b[-1]+=-w*c:a[-1]<T zqHFQ5Fez.KUuH-R'IFuX-^*yL>CFb( za+xw:3] +y0vLSHH}qkj65X _#g4qKR x ane)^F jOTNM{Bg[;);S}B8,*ioni=jSiKDID}j ZatE#Xdq +Djob9_49U3VVi GU,O927K y#tSWYdp N[[Soapmj^4[7apop0f*_=k7.wa.iBw W)$-MM-d +/>]Lc?MvpwTXh ?h49A(3b6 4XP]H67)t jwiyX^Ih?0I#s3'woKou"WKe*l.QlZ c*YlGW7R +YMuS*?BCJw|36 Mg&z{[B3#. $)ube];4w0 gx$,k2RAcN iam'Z'X+89? E9>s7DIbn&M{uC7 '3JIo2'%_n N-N]-#;nyr +vP|xONm2 Uz&zSPR #8$'iwD l]fPCNS*GJ EEmVAiewQkTE +6O4Y|=2J FC667[f" AYJE=_T% Pf'6X&3;h[%} nnv}u02{EvJy_Ef +{8k$%+