Skip to content

Instantly share code, notes, and snippets.

@snelson
Created April 15, 2020 12:41
Show Gist options
  • Save snelson/3753b411ae626ba6138b93d2d44aa0b0 to your computer and use it in GitHub Desktop.
Save snelson/3753b411ae626ba6138b93d2d44aa0b0 to your computer and use it in GitHub Desktop.
Implementation of Gilded Rose
module GildedRose
def self.new(name:, days_remaining:, quality:)
item_class = case name
when "Aged Brie"
AgedItem
when "Sulfuras, Hand of Ragnaros"
LegendaryItem
when "Backstage passes to a TAFKAL80ETC concert"
BackstagePass
when "Conjured Mana Cake"
ConjuredItem
else
NormalItem
end
item_class.new(name: name, days_remaining: days_remaining, quality: quality)
end
class BaseItem
MAX_QUALITY = 50
attr_reader :name, :days_remaining, :quality
def initialize(name:, days_remaining:, quality:)
@name = name
@days_remaining = days_remaining
@quality = quality
end
def tick
raise "not implemented"
end
private
def decrease_days_remaining
@days_remaining -= 1
end
def before_sell_date?
@days_remaining > 0
end
def decrease_quality(n)
@quality.tap do
@quality = @quality - n
@quality = 0 if @quality < 0
end
end
def increase_quality(n)
@quality.tap do
@quality = @quality + n
@quality = MAX_QUALITY if @quality > MAX_QUALITY
end
end
end
class NormalItem < BaseItem
def tick
if before_sell_date?
decrease_quality(1)
else
decrease_quality(2)
end
decrease_days_remaining
end
end
class AgedItem < BaseItem
def tick
if before_sell_date?
increase_quality(1)
else
increase_quality(2)
end
decrease_days_remaining
end
end
class BackstagePass < BaseItem
def tick
if days_remaining <= 0
@quality = 0
elsif days_remaining <= 5
increase_quality(3)
elsif days_remaining <= 10
increase_quality(2)
elsif days_remaining > 10
increase_quality(1)
end
decrease_days_remaining
end
end
class ConjuredItem < BaseItem
def tick
if before_sell_date?
decrease_quality(2)
else
decrease_quality(4)
end
decrease_days_remaining
end
end
class LegendaryItem < BaseItem
QUALITY = 80
def tick
# no-op
end
def quality
@quality = QUALITY
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment