fork download
  1. library(stringr)
  2. library(dplyr)
  3. library(purrr)
  4.  
  5. count <- function(x) {
  6. little <- str_extract_all(x, "[A-Z][a-z]")[[1]]
  7. ones <- str_replace_all(x, "[A-Z][a-z]?[0-9]+", "")
  8. if(ones != "") {
  9. notones <- str_extract_all(x, "[A-Z][a-z]?[0-9]+")[[1]]
  10. for(i in seq_along(notones))
  11. x <- str_replace(x, notones[i], tolower(notones[i]))
  12. ones <- str_extract_all(ones, "[A-Z][a-z]?")[[1]]
  13. one <- map_chr(ones, function(x) return(str_c(x, "1")))
  14. for(i in seq_along(ones))
  15. x <- str_replace(x, ones[i], tolower(one[i]))
  16. x <- toupper(x)
  17. for(i in seq_along(little))
  18. x <- str_replace(x, toupper(little[i]), little[i])
  19. }
  20. repeat {
  21. paren <- str_extract(x, "[\\(][A-Za-z0-9]+[\\)][0-9]+")
  22. if(is.na(paren))
  23. break
  24. noparen <- str_replace_all(paren, "\\(|\\)", "")
  25. noparen <- str_sub(noparen, 1, -2)
  26. num <- as.numeric(str_extract_all(paren, "[0-9]+")[[1]])
  27. num2 <- num[-length(num)] * num[length(num)]
  28. num <- as.character(num); num2 <- as.character(num2)
  29. for(i in seq_along(num2))
  30. noparen <- str_replace(noparen, num[i], num2[i])
  31. paren <- str_replace_all(paren, c("\\(" = "\\\\(", "\\)" = "\\\\)"))
  32. x <- str_replace(x, paren, noparen)
  33. }
  34. x <- str_extract_all(x, "([A-Z][a-z]?)|([0-9]+)")[[1]]
  35. x <- data.frame(matrix(x, ncol = 2, byrow = T), stringsAsFactors = F)
  36. x[,2] <- as.numeric(x[,2])
  37. x %<>% group_by(X1) %>% summarise(sum(X2))
  38. return(invisible(apply(x, 1, cat, sep = c(":\t", ""), "\n")))
  39. }
  40.  
  41. count("C6H12O6"); cat("\n")
  42. count("CCl2F2"); cat("\n")
  43. count("NaHCO3"); cat("\n")
  44. count("C4H8(OH)2"); cat("\n")
  45. count("PbCl(NH3)2(COOH)2"); cat("\n")
Success #stdin #stdout #stderr 0.41s 198976KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Error in library(purrr) : there is no package called ‘purrr’
Execution halted