ズンドコキヨシマシン
ズンズンズンズンドコ状態になると「キ・ヨ・シ♡」でクラッシュする
図
require 'gviz'
Graph do
route :Silent => [:Zun, :Doko]
route :Zun => [:ZunZun, :Doko]
route :Doko => [:Zun, :Doko]
route :ZunZun => [:ZunZunZun, :Doko]
route :ZunZunZun => [:ZunZunZunZun, :Doko]
route :ZunZunZunZun => [:ZunZunZunZun, :ZunZunZunZunDoko]
save(:zundoko, :png)
end
実装
class Silent
def zun
Zun.new
end
def doko
Doko.new
end
end
class Zun
def zun
ZunZun.new
end
def doko
Doko.new
end
end
class Doko
def zun
Zun.new
end
def doko
Doko.new
end
end
class ZunZun
def zun
ZunZunZun.new
end
def doko
Doko.new
end
end
class ZunZunZun
def zun
ZunZunZunZun.new
end
def doko
Doko.new
end
end
class ZunZunZunZun
def zun
ZunZunZunZun.new
end
def doko
ZunZunZunZunDoko.new
end
end
class ZunZunZunZunDoko
def initialize
raise 'キ・ヨ・シ♡'
end
end
class ZunOp
def call(state)
puts 'ズン'
state.send(:zun)
end
end
class DokoOp
def call(state)
puts 'ドコ'
state.send(:doko)
end
end
class RandomZundokoProgram
include Enumerable
def each
loop { yield [ZunOp, DokoOp].sample.new }
end
end
class ZunDokoMachine
def initialize
@state = Silent.new
end
def run(program)
program.each do |op|
@state = op.call(@state)
end
end
end
machine = ZunDokoMachine.new
program = RandomZundokoProgram.new.lazy
machine.run(program)
実行例
_╰╰, /バショ % ~/tmp
_/o ŏァ / タイチョー% ヤバイ
∈ミ;ノ,ノ \コマンド% ruby zundoko.rb
ドコ
ズン
ドコ
ズン
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ズン
ズン
ドコ
ドコ
ズン
ズン
ズン
ドコ
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ドコ
zundoko.rb:63:in `initialize': キ・ヨ・シ♡ (RuntimeError)
from zundoko.rb:57:in `new'
from zundoko.rb:57:in `doko'
from zundoko.rb:77:in `call'
from zundoko.rb:96:in `block in run'
from zundoko.rb:85:in `block in each'
from zundoko.rb:85:in `loop'
from zundoko.rb:85:in `each'
from zundoko.rb:95:in `each'
from zundoko.rb:95:in `run'
from zundoko.rb:103:in `<main>'
_╰╰, /バショ % ~/tmp
_/oஇ ァ / タイチョー% ヤバイ
∈ミ;ノ,ノ \コマンド%