TRICK2018応募作
2018-07-05
TechTRICK 2018に応募した作品です。
解説はまた後ほど…
SVG Graph Generator
グラフ構造をDSLで記述すると、そのようなSVG画像を生成するプログラムです。
$n={};$e=[];class Array;def -@;self;end;def -(o);$n[self]=1
$n[o]=1;$e<<[self,o];end;end;at_exit{a=['<?xml version="1'+
'.0" standalone="no"?>','<!DOCTYPE svg PUBLIC "-//W3C//DT'+
'D SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/s'+
'vg11.dtd">','<svg xmlns="http://www.w3.org/2000/svg" xml'+
'ns:xlink="http://www.w3.org/1999/xlink">'];$n.each_key{|x,
y|a<<"<circle cx='#{x}' cy='#{y}' r='5' fill='red'/>"}; $e.
each{|(x,y),(z,w)|a<<"<line x1='#{x}' y1='#{y}' x2='#{z}'"+
" y2='#{w}' stroke='red'/>"};a<<"</svg>";puts a.join("\n")}
a = [10, 60]
b = [60, 10]
c = [150, 10]
d = [200, 60]
e = [105, 180]
a ---- b
b ---- c
c ---- d
d ---- a
a ---- e
b ---- e
c ---- e
d ---- e
実行結果
Two Rectangles
Ruby25周年を記念した連作です。
その1
class O;def ~;@a<<[];self
end;def+@;@a||=[[]];@a[-1
]<<1;self;end;def-o;puts(
o.s)end;def-@;@a[-1]<<000
self;end;def s;@a.map{|a|
a.join.to_i(2).chr}.join;
end;end||TRICK;(_=O.new)-
-+-+~-++++++~-----+~---+-
++~--+-+++~+-+-++~-+--++~
-----+~+--++++~-+---++~+-
+-+++~-+--+-+~-----+~++--
+++~--+-+++~+----++~-+--+
++~+++--++~-+++-++~++++-+
+~++----+~-----+~-++++++_
実行結果
~ Congrats Ruby 25th ~
その2
I=Integer;O=[ObjectSpace, 1042168250852542240864495
].first;s=10**24;at_exit{ 5348222601280368651569634
a,=O.each_object(I).sort, 4780579399978966787453143
e=s*10;b=a.select{|n|0<=> 7807076270124060079384842
s<n&&n<e}.map{|n| n.to_s{ 1001849981903442212561686
}.slice 1,25}.join.to_i|| 4544119307892328259442112
$><<["%x"%b].pack('H*')}; 3990956024951047161425313
実行結果
~ Congratulations Ruby 25th ~
TRICK FINAL in RubyKaigi2018 Sendai
Self-descriptive Program
入賞作。実行するとこのプログラム自体が出力されます。
ソースコード中に日本語が書いてありますが、コメントでも文字列リテラルでもありません。
def method_missing(n);$*<<n.to_s.bytesize
n[-1]=="!" and eval$*.map(&:chr).join;end
*自己言及的なプログラム.
これは「自己に言及」したQuineプログラムです.
動かすには普通に無引数で実行してください.
MRIの最新の安定版で動作確認を行っています.
*冒頭の2行が日本語プログラミングのDSLを提供します.
Rubyはピリオドまでの部分がメソッド名であると解釈します.
そのままではNoMethodErrorになります.
それをmethod_missingを使って検知しメソッド名のbytesizeをASCIIコードとして文字にします.
メソッド名が半角の!で終わる場合、記憶した文字たちをjoinしてevalします.
これにより任意のRubyプログラムを日本語により記述することができます.
このプログラムの場合はこのファイルをreadし出力するようになっています.
*Note:文の長さは注意が必要.
UTF_8の日本語は1文字が3bytes.
端数が丁度になるよう英語を入れる.
以上、自己言及的programでした!