Last active
March 20, 2016 20:53
-
-
Save sandinist/f2cf17e49da4bed99daf to your computer and use it in GitHub Desktop.
DogTeam自動販売機@dddニセコ合宿
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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("(家に帰る)") | |
おもちかえり?.のむ() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
ガチャン | |
いろはす | |
ひえてーる | |
(家に帰る) | |
ごくごく | |
ペットボトルくしゃ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
小銭のみ、1円玉、5円玉なし。