Skip to content

Instantly share code, notes, and snippets.

@rayfix
Created April 21, 2018 22:32
Show Gist options
  • Save rayfix/6c3a43494a530c9d373dead64ac345d8 to your computer and use it in GitHub Desktop.
Save rayfix/6c3a43494a530c9d373dead64ac345d8 to your computer and use it in GitHub Desktop.
Gilded Rose
import Foundation
typealias Quality = Int
typealias SellIn = Int
typealias UpdateRule = (Item) -> Item
struct Item {
enum Kind: String {
case normal
case conjured
case sulfuras
case brie
case backstage
}
var name: String
var kind: Kind
var sellIn: SellIn
var quality: Quality
var updateRule: UpdateRule {
switch kind {
case .normal:
return { item in Item(name: self.name, kind: self.kind,
sellIn: self.sellIn-1,
quality: self.quality-1)
}
case .conjured:
return { item in Item(name: self.name, kind: self.kind,
sellIn: self.sellIn-1,
quality: self.quality-2)
}
case .sulfuras:
return { _ in self }
case .brie:
return { item in Item(name: self.name, kind: self.kind,
sellIn: self.sellIn-1,
quality: self.quality+1)
}
case .backstage:
return { item in
let newQuality: Quality
switch self.sellIn {
case ...0:
newQuality = 0
case ...5:
newQuality = self.quality+3
case ...10:
newQuality = self.quality+2
case _:
newQuality = self.quality+1
}
return Item(name: self.name, kind: self.kind,
sellIn: self.sellIn-1,
quality: newQuality)
}
}
}
init(name: String, kind: Item.Kind, sellIn: Int, quality: Int) {
self.name = name
self.kind = kind
self.sellIn = max(sellIn,0)
self.quality = min(max(quality, 0), 50)
}
mutating func update() {
self = updated()
}
func updated() -> Item {
return updateRule(self)
}
}
extension Item: CustomStringConvertible {
public var description: String {
return [name, kind.rawValue, String(sellIn), String(quality)].joined(separator: ", ")
}
}
var items = [
Item(name: "+5 Dexterity Vest", kind: .normal, sellIn: 10, quality: 20),
Item(name: "Aged Brie", kind: .brie, sellIn: 2, quality: 0),
Item(name: "Elixir of the Mongoose", kind: .normal, sellIn: 5, quality: 7),
Item(name: "Sulfuras, Hand of Ragnaros", kind: .sulfuras, sellIn: 10, quality: 80),
Item(name: "Sulfuras, Hand of Ragnaros", kind: .sulfuras, sellIn: -1, quality: 80),
Item(name: "Backstage passes to a TAFKAL80ETC concert", kind: .backstage, sellIn: 15, quality: 20),
Item(name: "Backstage passes to a TAFKAL80ETC concert", kind: .backstage, sellIn: 10, quality: 49),
Item(name: "Backstage passes to a TAFKAL80ETC concert", kind: .backstage, sellIn: 5, quality: 49),
Item(name: "Conjured Mana Cake", kind: .conjured, sellIn: 3, quality: 6)
]
let days = 100
for day in 0 ..< days {
print("-------- day \(day) --------")
for item in items {
print(item)
}
print("")
for index in items.indices {
items[index].update()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment