2018-03-24T14:42:39.000+09:00

Kotlinで逆ポーランド記法四則計算機

真面目じゃない方のブログでやっているプログラミング学び直し日記シリーズ。Kotlin (Kotlin/JVM) で逆ポーランド記法 (Reverse Polish Notation) 計算機の実装。自然数による四則計算のみ対応。少数とか使えない。

import kotlin.text.Regex
import java.util.Stack

enum class Oprs(val str: String, val exec: (x: Int, y: Int) -> Int) {
    Add("+", { x, y -> x + y}),
    Sub("-", { x, y -> x - y}),
    Mul("*", { x, y -> x * y}),
    Div("/", { x, y -> x / y})
}

fun main(args: Array<String>) {
    val xs = args[0].split(Regex("\\s+"))
    val ret = Stack<String>()

    for (x in xs) {
        when {
            Regex("\\d+").matches(x) -> {
                ret.push(x)
            }
            Oprs.values().map { it.str }.contains(x) -> {
                val snd = Integer.parseInt(ret.pop())
                val fst = Integer.parseInt(ret.pop())

                ret.push(Integer.toString(
                    when (x) {
                        Oprs.Add.str -> Oprs.Add.exec(fst, snd)
                        Oprs.Sub.str -> Oprs.Sub.exec(fst, snd)
                        Oprs.Mul.str -> Oprs.Mul.exec(fst, snd)
                        Oprs.Div.str -> Oprs.Div.exec(fst, snd)
                        else -> throw IllegalArgumentException()
                    }
                ))
            }
            else -> throw IllegalArgumentException()
        }
    }

    if (ret.size != 1) throw IllegalArgumentException()

    System.out.println(ret.pop())
}