Skip to content

Instantly share code, notes, and snippets.

@tice0-2
Created November 6, 2018 02:16
Show Gist options
  • Save tice0-2/192f0383177482bac6e2bd336f1f96b2 to your computer and use it in GitHub Desktop.
Save tice0-2/192f0383177482bac6e2bd336f1f96b2 to your computer and use it in GitHub Desktop.
class Dice
def [](value)
raise 'unimplemented'
end
def apply(value = nil)
self[value].floor
end
class << self
def define_semigroup sym
define_method sym do |rhs|
if (rhs.is_a? Fixnum)
rhs = K.new(rhs)
end
Semigroup.new(sym, self, rhs)
end
end
end
[:+, :-, :*, :/, :**].each do |sym|
define_semigroup sym
end
def d(rhs)
if (rhs.is_a? Fixnum)
rhs = K.new(rhs)
end
Semigroup.new(:*, self, Dn.new(rhs))
end
end
class Dice::K < Dice
def [](value)
@k
end
def initialize k
@k = k
end
def to_s
@k.to_s
end
end
class Dice::Dn < Dice
def initialize n
@n = n
end
def [](value)
rand(@n[value]) + 1
end
def to_s
"d#{@n}"
end
end
class Dice::Percent < Dice
def initialize percent
@percent = percent
end
def [](v)
v * @percent / 100.0
end
def to_s
"#{@percent}%"
end
end
class Dice::Semigroup < Dice
def initialize op, lhs, rhs
@op = op
@lhs = lhs
@rhs = rhs
end
def [](v)
@lhs[v].send(@op, @rhs[v])
end
def to_s
if @op == :* && @rhs.is_a?(Dn)
"#{@lhs}#{@rhs}"
else
"#{@lhs} #{@op} #{@rhs}"
end
end
end
class DiceeContext < BasicObject
class << self
def define_kdice k
define_method "_#{k}" do
Dice::K.new(k)
end
end
end
for i in 1..99 do
define_kdice i
end
end
def dicee &block
c = DiceeContext.new
c.instance_exec &block
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment