Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Excel BI’s Excel Challenge #317 — solved in R

### Defining the Puzzle:

Today we are move single letters from starts to end of words. But with some exceptions.

Swap the first and last letter of each words in given names. But if either first or last letter or both are vowels, then don’t swap for that word.
Ex. Barack Obama
In first word, B and k will be swapped. In second word, O and a both are vowels, hence swapping will not be done for this word.
Hence, answer would be Karacb Obama.

We need to load data and libraries.

```library(tidyverse)aa

input = read_excel(“Swap First and Last Letter in Words.xlsx”, range = “A1:A10”)
test = read_excel(“Swap First and Last Letter in Words.xlsx”, range = “B1:B10”)```

### Approach 1: Tidyverse with purrr

```switch_consonants <- function(word) {
vowels <- c(“a”, “e”, “i”, “o”, “u”, “A”, “E”, “I”, “O”, “U”)

words <- str_split(word, “\\s+”)[[1]]
new_words <- map_chr(words, function(w) {
if (str_detect(w, “^\\w\\.\$”)) {
return(w)
}

first_char <- str_sub(w, 1, 1)
last_char <- str_sub(w, nchar(w), nchar(w))

if (!(first_char %in% vowels) && !(last_char %in% vowels)) {
w <- paste0(last_char, str_sub(w, 2, nchar(w)-1), first_char)
}
return(w)
})

result = new_words %>%
paste(collapse = “ “) %>%
str_to_lower() %>%
str_to_title()

return(result)
}

result = input %>%
mutate(`Answer Expected` = map_chr(Names, switch_consonants)) %>%
select(-Names)```

### Approach 2: Base R

```switch_consonants <- function(word) {
vowels <- c(“a”, “e”, “i”, “o”, “u”, “A”, “E”, “I”, “O”, “U”)

words <- unlist(strsplit(word, “\\s+”))
new_words <- sapply(words, function(w) {
if (grepl(“^\\w\\.\$”, w)) {
return(w)
}

first_char <- substr(w, 1, 1)
last_char <- substr(w, nchar(w), nchar(w))

if (!(first_char %in% vowels) && !(last_char %in% vowels)) {
w <- paste0(last_char, substr(w, 2, nchar(w)-1), first_char)
}
return(w)
})

result <- paste(new_words, collapse = “ “)
result <- tolower(result)
result <- tools::toTitleCase(result)

return(result)
}

input <- input[ , !(names(input) %in% ‘Names’)]  %>% data.frame(`Answer Expected` = .)```

### Data.table approach:

It would change only by method of calling, so forgive me that I am not taking it.

### Validation:

```identical(result, test)
#> [1] TRUE

#> [1] TRUE```

If you like my publications or have your own ways to solve those puzzles in R, Python or whatever tool you choose, let me know.

Swap first and last… letter was originally published in Numbers around us on Medium, where people are continuing the conversation by highlighting and responding to this story.