1. Qiita
  2. 投稿
  3. Ruby

ズンドコキヨシオートマトン with Ruby

  • 4
    いいね
  • 0
    コメント

ズンドコキヨシマシン

ズンズンズンズンドコ状態になると「キ・ヨ・シ♡」でクラッシュする

zundoko.png

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இ ァ  / タイチョー% ヤバイ
∈ミ;ノ,ノ   \コマンド%

その他のキヨシ