Skip to content

Instantly share code, notes, and snippets.

@sandinist
Last active March 20, 2016 20:53
Show Gist options
  • Save sandinist/f2cf17e49da4bed99daf to your computer and use it in GitHub Desktop.
Save sandinist/f2cf17e49da4bed99daf to your computer and use it in GitHub Desktop.
DogTeam自動販売機@dddニセコ合宿
import Darwin
class うちら {
var だらせん : 硬貨
init () {
だらせん = 硬貨()
}
func 所持金() -> Int {
return だらせん.おいくら()
}
func だらせん使う(支払い: 硬貨) -> 硬貨 {
だらせん = だらせん - 支払い
return 支払い
}
// おおざっぱなひとなので一番大きい足りる硬貨を使う
func 小銭あるかな(金額: Int) -> 硬貨? {
print("\(金額)円あるかな")
var 残り金額 = 金額
let しはらい = 硬貨()
if 金額 >= だらせん.おいくら() {
print("たりないわー")
return nil;
}
if 残り金額 <= だらせん.五百円玉 * 500 {
しはらい.五百円玉 = (残り金額 / 500) + 1
return しはらい
} else {
しはらい.五百円玉 = だらせん.五百円玉
残り金額 -= だらせん.五百円玉 * 500
}
if 残り金額 <= だらせん.百円玉 * 100 {
しはらい.百円玉 = (残り金額 / 100) + 1
return しはらい
} else {
しはらい.百円玉 = だらせん.百円玉
残り金額 -= だらせん.百円玉 * 100
}
if 残り金額 <= だらせん.五十円玉 * 50 {
しはらい.五十円玉 = (残り金額 / 50) + 1
return しはらい
} else {
しはらい.五十円玉 = だらせん.五十円玉
残り金額 -= だらせん.五十円玉 * 50
}
if 残り金額 <= だらせん.十円玉 * 10 {
しはらい.十円玉 = (残り金額 / 10) + 1
return しはらい
}
return nil
}
}
// のみもの
func ==(lhs: のみもの, rhs: のみもの) -> Bool {
return lhs.hashValue == rhs.hashValue
}
class のみもの : Hashable, Equatable {
internal var hashValue: Int = 0
var おねだん = 150
var あったかーい = false
func のむ() {
print("ごくごく")
}
}
class レッドブル : のみもの {
override init() {
super.init()
hashValue = 1
おねだん = 210
}
override func のむ() {
super.のむ()
print("つばさをさずかった!")
}
}
class ポカリ : のみもの {
override init() {
super.init()
hashValue = 2
}
override func のむ() {
super.のむ()
print("うるおい、ON")
}
}
class コーラ : のみもの {
override init() {
super.init()
hashValue = 3
}
override func のむ() {
super.のむ()
print("爽やかになるひととき")
print("(確実にげっぷがでる)")
}
}
class いろはす : のみもの {
override init() {
super.init()
hashValue = 4
おねだん = 110
}
override func のむ() {
super.のむ()
print("ペットボトルくしゃ")
}
}
class おしるこ : のみもの {
override init() {
super.init()
hashValue = 5
おねだん = 130
あったかーい = true
}
override func のむ() {
super.のむ()
print("あまーい")
}
}
// おかね
class おかね {
func おいくら() -> Int {
return 0
}
}
func +(lhs: 硬貨, rhs: 硬貨) -> 硬貨 {
let val = 硬貨()
val.十円玉 = lhs.十円玉 + rhs.十円玉
val.五十円玉 = lhs.五十円玉 + rhs.五十円玉
val.百円玉 = lhs.百円玉 + rhs.百円玉
val.五百円玉 = lhs.五百円玉 + rhs.五百円玉
return val
}
func -(lhs: 硬貨, rhs: 硬貨) -> 硬貨 {
let val = 硬貨()
val.五百円玉 = lhs.五百円玉 - rhs.五百円玉
val.百円玉 = lhs.百円玉 - rhs.百円玉
val.五十円玉 = lhs.五十円玉 - rhs.五十円玉
val.十円玉 = lhs.十円玉 - rhs.十円玉
return val
}
class 硬貨 {
var 十円玉 : Int = 0
var 五十円玉 : Int = 0
var 百円玉 : Int = 0
var 五百円玉 : Int = 0
init() { }
init(十円: Int, 五十円: Int, 百円: Int, 五百円: Int) {
十円玉 = 十円
五十円玉 = 五十円
百円玉 = 百円
五百円玉 = 五百円
}
func おいくら() -> Int {
return 十円玉 * 10 +
五十円玉 * 50 +
百円玉 * 100 +
五百円玉 * 500
}
func 内訳() -> String {
return ("五百円玉\(五百円玉)枚、百円玉\(百円玉)枚、五十円玉\(五十円玉)枚、十円玉\(十円玉)枚")
}
}
// 自動販売機
class じはんき {
var きんがく: Int
var ざいこ: [のみもの: Int]
var とりだしぐち: のみもの?
init() {
きんがく = 0
ざいこ = [
コーラ(): 15,
レッドブル(): 1,
いろはす(): 15,
ポカリ(): 15
]
とりだしぐち = nil
}
func おかねを入れる(だらせん: 硬貨) {
きんがく += だらせん.おいくら()
print("チャリン、チャリン")
}
func のみものえらぶ(えらんだの: のみもの) {
print("\(えらんだの) の在庫は \(ざいこ[えらんだの]!)")
guard ざいこ[えらんだの] != 0 else {
print("売り切れ…だと…")
return
}
if えらんだの.おねだん <= きんがく {
きんがく -= えらんだの.おねだん
ざいこ[えらんだの] = ざいこ[えらんだの]! - 1
とりだしぐち = えらんだの
print("ガチャン")
}
}
func のみものとる() -> のみもの?{
guard let でてくるもの = とりだしぐち else {
print("ざんねん、取り出し口はからっぽだ")
return nil
}
print(でてくるもの)
defer { とりだしぐち = nil }
if でてくるもの.あったかーい {
print("あったまーる")
} else {
print("ひえてーる")
}
return でてくるもの
}
func おつりとる() -> 硬貨 {
let おつり = 硬貨()
var 残額 = きんがく
おつり.五百円玉 += (残額 / 500)
残額 -= おつり.五百円玉 * 500
おつり.百円玉 += (残額 / 100)
残額 -= おつり.百円玉 * 100
おつり.五十円玉 += (残額 / 50)
残額 -= おつり.五十円玉 * 50
おつり.十円玉 += (残額 / 10)
きんがく = 0
return おつり
}
}
// main
let じぶん = うちら()
じぶん.だらせん = 硬貨(十円: 3, 五十円: 0, 百円: 5, 五百円: 0)
print("\(じぶん.所持金())円もってるよ")
print("内訳は\(じぶん.だらせん.内訳())")
let じはん = じはんき()
var こぜに = じぶん.小銭あるかな(レッドブル().おねだん)
guard let _: 硬貨 = こぜに else{
exit(0)
}
print("\(こぜに!.おいくら()) 円いれるよ")
じはん.おかねを入れる(じぶん.だらせん使う(こぜに!))
print("\(じぶん.所持金())円もってるよ")
じはん.のみものえらぶ(レッドブル())
じはん.のみものとる()?.のむ()
var おつり = じはん.おつりとる()
print("おつりは\(おつり.内訳())")
じぶん.だらせん = じぶん.だらせん + おつり
print("\(じぶん.所持金())円もってるよ")
print("「もういっぽん!」")
こぜに = じぶん.小銭あるかな(レッドブル().おねだん)
guard let _: 硬貨 = こぜに else{
exit(0)
}
print("\(こぜに!.おいくら()) 円いれるよ")
じはん.おかねを入れる(じぶん.だらせん使う(こぜに!))
print("\(じぶん.所持金())円もってるよ")
print("内訳は\(じぶん.だらせん.内訳())")
じはん.のみものえらぶ(レッドブル())
じはん.のみものとる()?.のむ()
// じぶん.だらせん = じぶん.だらせん + じはん.おつりとる()
print("\(じぶん.所持金())円もってるよ")
print("「仕方がない、コーラにしよう」")
じはん.のみものえらぶ(コーラ())
じはん.のみものとる()?.のむ()
じぶん.だらせん = じぶん.だらせん + じはん.おつりとる()
print("\(じぶん.所持金())円もってるよ")
print("「水も買って帰ろう」")
こぜに = じぶん.小銭あるかな(いろはす().おねだん)
guard let _: 硬貨 = こぜに else{
exit(0)
}
print("\(こぜに!.おいくら()) 円いれるよ")
じはん.おかねを入れる(じぶん.だらせん使う(こぜに!))
print("\(じぶん.所持金())円もってるよ")
print("内訳は\(じぶん.だらせん.内訳())")
じはん.のみものえらぶ(いろはす())
let おもちかえり = じはん.のみものとる()
じぶん.だらせん = じぶん.だらせん + じはん.おつりとる()
print("(家に帰る)")
おもちかえり?.のむ()
530円もってるよ
内訳は五百円玉0枚、百円玉5枚、五十円玉0枚、十円玉3枚
210円あるかな
300 円いれるよ
チャリン、チャリン
230円もってるよ
レッドブル の在庫は 1
ガチャン
レッドブル
ひえてーる
ごくごく
つばさをさずかった!
おつりは五百円玉0枚、百円玉0枚、五十円玉1枚、十円玉4枚
320円もってるよ
「もういっぽん!」
210円あるかな
250 円いれるよ
チャリン、チャリン
70円もってるよ
内訳は五百円玉0枚、百円玉0枚、五十円玉0枚、十円玉7枚
レッドブル の在庫は 0
売り切れ…だと…
ざんねん、取り出し口はからっぽだ
70円もってるよ
「仕方がない、コーラにしよう」
コーラ の在庫は 15
ガチャン
コーラ
ひえてーる
ごくごく
爽やかになるひととき
(確実にげっぷがでる)
170円もってるよ
「水も買って帰ろう」
110円あるかな
120 円いれるよ
チャリン、チャリン
50円もってるよ
内訳は五百円玉0枚、百円玉0枚、五十円玉0枚、十円玉5枚
いろはす の在庫は 15
ガチャン
いろはす
ひえてーる
(家に帰る)
ごくごく
ペットボトルくしゃ
@sandinist
Copy link
Author

小銭のみ、1円玉、5円玉なし。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment