yhara.jp

Recent Posts

TRICK2018応募作

2018-07-05
Tech

TRICK 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でした!

More posts

Posts

(more...)

Articles

(more...)

Category

Ads

About

About the author