Vigenere Cypher Grid
Excel BI’s Excel Challenge #302— solved in R
Introduction
Today’s Excel BI puzzle is available here. It is pure generational work today. We have to create from scratch so called Vigenere grid. Exercise file today is purely for comparison reason: file.
Defining the Puzzle
The puzzle in question revolves around the Vigenere Cipher Grid, a cryptographic tool. The objective is to generate this grid, which appears to be a matrix of letters shifted in various ways.
Loading data from Excel
As I already mention we need test data only today.
library(tidyverse)
library(readxl)
test = read_excel(“Vigenere Cipher Grid.xlsx”, range = “A2:AA28”)
%>% column_to_rownames(‘…1’)
Tidyverse Approach
df <- tibble(base = LETTERS)
vigenere_grid <- bind_cols(df, map_dfc(0:24, ~ {
shifted <- LETTERS[(seq_along(LETTERS) + .x) %% 26 + 1]
tibble(!!LETTERS[.x + 1] := shifted)
}))
rownames(vigenere_grid) <- LETTERS
colnames(vigenere_grid) <- LETTERS
vigenere_grid = as.data.frame(vigenere_grid)
Base R Approach
vigenere_grid_base <- matrix(NA, 26, 26)
rownames(vigenere_grid_base) <- LETTERS
colnames(vigenere_grid_base) <- LETTERS
for (i in 1:26) {
vigenere_grid_base[i,] <- LETTERS[(seq_along(LETTERS) + (i — 2)) %% 26 + 1]
}
vigenere_grid_base = as.data.frame(vigenere_grid_base)
Data.table Approach
library(data.table)
vigenere_grid_dt <- data.table(base = LETTERS)
for (i in 0:24) {
shifted <- LETTERS[(seq_along(LETTERS) + i) %% 26 + 1]
vigenere_grid_dt[, LETTERS[i + 1] := shifted]
}
setDT(vigenere_grid_dt)[, LETTERS := LETTERS]
vigenere_grid_dt = as.data.frame(vigenere_grid_dt) %>%
column_to_rownames(“LETTERS”)
colnames(vigenere_grid_dt) <- LETTERS
Validating Solutions
identical(vigenere_grid, test)
# [1] TRUE
identical(vigenere_grid_base, test)
# [1] TRUE
identical(vigenere_grid_dt, test)
# [1] TRUE
Tips for possible optimization
Approach 1: Tidyverse with purrr
- Avoiding Repetitive Operations
- Vectorize
Approach 2: Base R
- Vectorize
- Avoid Growing Objects
Approach 3: Data.table
- Use
.SD
and.SDcols
- Use
set
Function - Avoid Copying
Thank you for taking the time to explore these methodologies with me! I’d love to hear your thoughts on the puzzle, the solutions provided, or any optimizations you might have in mind. Feel free to share your solutions and insights!