Swap first and last… letter

Numbers around us
Numbers around us
Published in
2 min readNov 6, 2023

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.

Loading Data from Excel:

We need to load data and libraries.

library(tidyverse)aa
library(readxl)

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$`Answer Expected` <- sapply(input$Names, switch_consonants)
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

identical(input$Answer.Expected, test$`Answer Expected`)
#> [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.

--

--

Numbers around us
Numbers around us

Self developed analyst. BI Developer, R programmer. Delivers what you need, not what you asked for.