Merge branch 'emilybache:main' into main

This commit is contained in:
Shubhendu Pramanik 2022-06-15 08:40:02 +05:30 committed by GitHub
commit 956248c528
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 49 additions and 23 deletions

View File

@ -0,0 +1,22 @@
# Specyfikacja wymagań Pozłacanej Róży (Gilded Rose)
Cześć i witaj na pokładzie zespołu Pozłacanej Róży. Jak zapewne już wiesz, jesteśmy niewielką karczmą, która znajduje się w głównej części wspaniałego miasta i jest prowadzona przez przyjazną oberżystkę o imieniu Allison. Sprzedajemy i kupujemy tylko najlepsze towary. Niestety, przedmioty te tracą na jakości w miarę jak zbliża się ich termin sprzedaży. Korzystamy z systemu, który automatycznie aktualizuje stan naszego inwentarza. System ten został napisany przez rozsądnego typka o imieniu Leeroy, który postanowił poszukać nowych przygód. Twoim zadaniem jest dodanie nowej funkcjonalności do naszego systemu tak, abyśmy mogli rozpocząć sprzedaż nowego rodzaju przedmiotów. Pozwól, że najpierw zrobię ogólne wprowadzenie do systemu:
- Wszystkie przedmioty (`Item`) posiadają właściwość `SellIn`, która oznacza **liczbę dni pozostałych do upłynięcia terminu sprzedaży** przedmiotu
- Wszystkie przedmioty posiadają właściwość `Quality` (**jakość**), która wpływa na wartość przedmiotu
- Na koniec każdego dnia nasz system obniża wartość obu właściwości dla każdego przedmiotu
Dość proste, prawda? No cóż, teraz zrobi się bardziej interesująco:
- Po upływie daty sprzedaży, jakość spada dwukrotnie szybciej
- Jakość przedmiotu nigdy nie jest ujemna
- Jakość "Starego Brie" (`Aged Brie`) rośnie wraz z wiekiem
- Jakość przedmiotu nigdy nie przekracza 50
- Przedmiot legendarny `Sulfuras` nigdy nie musi być sprzedany, ani nie traci na jakości
- "Przepustka za kulisy" (`Backstage passes`), podobnie jak "Stary Brie", zyskują na jakości w miarę zbliżania się terminu sprzedaży; jakość wzrasta o 2, gdy jest 10 dni lub mniej i o 3, gdy jest 5 dni lub mniej, ale spada do 0 po koncercie (gdy `SellIn` < 0)
Niedawno podpisaliśmy z dostawcą kontrakt na wyczarowane przedmioty. Wymaga to wprowadzenia zmiany do naszego systemu:
- "Wyczarowane" (`Conjured`) przedmioty tracą na jakości dwa razy szybciej niż normalne przedmioty
Możesz wprowadzać dowolne zmiany w metodzie `UpdateQuality`, a także dodawać nowy kod, o ile wszystko nadal działa prawidłowo. Jednak nie zmieniaj klasy `Item` ani właściwości `Items`, które zostały napisane przez goblina w rogu, gdyż zaatakuje Cię on i zabije jednym strzałem, ponieważ nie wierzy we współdzielony kod (możesz zmienić metodę `UpdateQuality` oraz właściwość `Items` na statyczne, jeśli chcesz - będziemy Cię kryć!).
Dla jasności: jakość przedmiotu nie może przekroczyć 50, jednak dla przedmiotu legendarnego `Sulfuras` jakość jest stale na poziomie 80 i nigdy nie spada.

View File

@ -7,17 +7,21 @@ let package = Package(
products: [
.library(
name: "GildedRose",
targets: ["GildedRose"]),
targets: ["GildedRose"]
),
],
targets: [
.target(
name: "GildedRose",
dependencies: []),
dependencies: []
),
.target(
name: "GildedRoseApp",
dependencies: ["GildedRose"]),
dependencies: ["GildedRose"]
),
.testTarget(
name: "GildedRoseTests",
dependencies: ["GildedRose"]),
dependencies: ["GildedRose"]
),
]
)

View File

@ -1,13 +1,13 @@
public class GildedRose {
var items: [Item]
public init(items: [Item]) {
self.items = items
}
public func updateQuality() {
for i in 0 ..< items.count {
if items[i].name != "Aged Brie" && items[i].name != "Backstage passes to a TAFKAL80ETC concert" {
if items[i].name != "Aged Brie", items[i].name != "Backstage passes to a TAFKAL80ETC concert" {
if items[i].quality > 0 {
if items[i].name != "Sulfuras, Hand of Ragnaros" {
items[i].quality = items[i].quality - 1
@ -16,14 +16,14 @@ public class GildedRose {
} else {
if items[i].quality < 50 {
items[i].quality = items[i].quality + 1
if items[i].name == "Backstage passes to a TAFKAL80ETC concert" {
if items[i].sellIn < 11 {
if items[i].quality < 50 {
items[i].quality = items[i].quality + 1
}
}
if items[i].sellIn < 6 {
if items[i].quality < 50 {
items[i].quality = items[i].quality + 1
@ -32,11 +32,11 @@ public class GildedRose {
}
}
}
if items[i].name != "Sulfuras, Hand of Ragnaros" {
items[i].sellIn = items[i].sellIn - 1
}
if items[i].sellIn < 0 {
if items[i].name != "Aged Brie" {
if items[i].name != "Backstage passes to a TAFKAL80ETC concert" {

View File

@ -2,7 +2,7 @@ public class Item {
public var name: String
public var sellIn: Int
public var quality: Int
public init(name: String, sellIn: Int, quality: Int) {
self.name = name
self.sellIn = sellIn
@ -12,6 +12,6 @@ public class Item {
extension Item: CustomStringConvertible {
public var description: String {
name + ", " + String(sellIn) + ", " + String(quality);
name + ", " + String(sellIn) + ", " + String(quality)
}
}

View File

@ -10,21 +10,22 @@ let items = [
Item(name: "Backstage passes to a TAFKAL80ETC concert", sellIn: 10, quality: 49),
Item(name: "Backstage passes to a TAFKAL80ETC concert", sellIn: 5, quality: 49),
// this conjured item does not work properly yet
Item(name: "Conjured Mana Cake", sellIn: 3, quality: 6)]
Item(name: "Conjured Mana Cake", sellIn: 3, quality: 6),
]
let app = GildedRose(items: items);
let app = GildedRose(items: items)
var days = 2;
var days = 2
if CommandLine.argc > 1 {
days = Int(CommandLine.arguments[1])! + 1
}
for i in 0..<days {
print("-------- day \(i) --------");
print("name, sellIn, quality");
for i in 0 ..< days {
print("-------- day \(i) --------")
print("name, sellIn, quality")
for item in items {
print(item);
print(item)
}
print("");
app.updateQuality();
print("")
app.updateQuality()
}

View File

@ -2,7 +2,6 @@
import XCTest
class GildedRoseTests: XCTestCase {
func testFoo() throws {
let items = [Item(name: "foo", sellIn: 0, quality: 0)]
let app = GildedRose(items: items)