Skip to content

Instantly share code, notes, and snippets.

@kozake
Last active August 29, 2015 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kozake/d1b7b8093acd58232d75 to your computer and use it in GitHub Desktop.
Save kozake/d1b7b8093acd58232d75 to your computer and use it in GitHub Desktop.
Kotlin Advent Calendar 2014 のソース(Main)
package syobochim.kotlin
import java.math.BigDecimal
import kotlin.math.*
inline val String.bd : BigDecimal get() = BigDecimal(this)
data class 可能性<T> (val 選択肢 : T, val 確率 : BigDecimal)
enum class しょぼちむ {
バイトの女の子
ようおっさん
二年目女子SE
おまえ誰だ
まじレッドキング
class object {
fun とは() : List<可能性<しょぼちむ>> =
listOf(
可能性(バイトの女の子, "0.6".bd ),
可能性(ようおっさん, "0.2".bd ),
可能性(二年目女子SE, "0.1".bd ),
可能性(おまえ誰だ, "0.09".bd ),
可能性(まじレッドキング, "0.01".bd )
)
}
}
enum class 支払い {
おごるよ
ごちになります
割り勘
class object {
fun どうする(しょぼちむの正体: 可能性<しょぼちむ>) : List<可能性<支払い>> {
val (選択肢, 確率) = しょぼちむの正体
return when(選択肢) {
しょぼちむ.バイトの女の子 ->
// かわいい!!
listOf(
可能性(おごるよ, "0.9".bd * 確率),
可能性(割り勘, "0.1".bd * 確率)
)
しょぼちむ.ようおっさん ->
// おっさん乙
listOf(
可能性(ごちになります, "0.9".bd * 確率),
可能性(おごるよ, "0.1".bd * 確率)
)
しょぼちむ.二年目女子SE ->
// 若い!!
listOf(
可能性(おごるよ, "0.7".bd * 確率),
可能性(割り勘, "0.3".bd * 確率)
)
しょぼちむ.まじレッドキング ->
// おごるどうこうの問題ではない
listOf()
else ->
// お前誰だ?
listOf(可能性(割り勘, "1.0".bd * 確率))
}
}
}
}
enum class おこづかい(val value : String) {
金欠 : おこづかい("金欠だ~ヽ(;▽;)ノ")
金ならあるんだ : おこづかい("金ならあるんだ!!(((o(*゚▽゚*)o)))")
override fun toString() : String {
return value
}
class object {
fun のこるの(おごり: 可能性<支払い>) : List<可能性<おこづかい>> {
val (選択肢, 確率) = おごり
return when(選択肢) {
支払い.おごるよ ->
listOf(
可能性(金欠, "0.9".bd * 確率),
可能性(金ならあるんだ, "0.1".bd * 確率)
)
支払い.ごちになります ->
listOf(
可能性(金欠, "0.1".bd * 確率),
可能性(金ならあるんだ, "0.9".bd * 確率)
)
支払い.割り勘 ->
listOf(
可能性(金欠, "0.7".bd * 確率),
可能性(金ならあるんだ, "0.3".bd * 確率)
)
else -> listOf(可能性(金欠, "1.0".bd * 確率))
}
}
}
}
fun main(args: Array<String>) {
val l = しょぼちむ.とは()
.flatMap { 正体 -> 支払い.どうする(正体) }
.flatMap { おごり -> おこづかい.のこるの(おごり) }
.groupBy { t -> t.選択肢 }
.map { e ->
e.key to (e.value.fold ( BigDecimal.ZERO, { (a, n) -> a + n.確率 } )) }
println(l)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment