Problem 89

ローマ数字を書き直し、文字数をどれだけ減らせるかという問題。
390ms。Problem 88に比べたら全然簡単。

roman <- read.table(file="roman.txt",stringsAs=F)[[1]]
roman.t <- c(CM = "900 ",   CD = "400 ",
              M = "1000 ",   D = "500 ",
             XC = "90 ",    XL = "40 ",
              C = "100 ",    L  = "50 ",
             IX = "9 ",     IV = "4 ",
              X = "10 ",     V  = "5 ",
              I = "1 ")
r2n <- function(ro){
  for(i in 1:13) ro <- gsub(names(roman.t[i]), roman.t[i], ro)
  sum(as.numeric(unlist(strsplit(ro, " "))))
}
rom.min <- c(1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
rom.chc <- c(   1,   2,   1,   2,   1,  2,  1,  2,  1, 2, 1, 2, 1)
n2cc <- function(n){
  cc <- 0
  for(i in 1:13){
    while(n >= rom.min[i]){
      n <- n - rom.min[i]
      cc <- cc+rom.chc[i]
    }
  }
  cc
}
cutcn <- function(ro){
  ori <- length(unlist(strsplit(ro, "")))
  newr <- n2cc(r2n(ro))
  ori - newr
}
sum(mapply(cutcn, roman))

まあ多少強引な気もするけど。