Fun Package

library(fun)
mine_sweeper()

gomoku()

playedlist <- NULL
i <- 0
repeat {
    for (j in 1:2) {
        repeat {
            l <- locator(1)
            l$x <- min(n, max(1, round(l$x)))
            l$y <- min(n, max(1, round(l$y)))
            xy <- paste(l, collapse = ":")
            if (!is.element(xy, playedlist)) 
                break
        }
        playedlist <- c(playedlist, xy)
        points(l, cex = 3, pch = c(19, 21)[j], bg = c("black", 
                                                      "white")[j])
        i <- i + 1
        if (i >= n^2) 
            break
    }
    if (i >= n^2) 
        break
}

tower_of_hanoi(4)

move.hanoi <- function(k, from, to, via)
{
    if (k > 1)
    {
        move.hanoi(k - 1, from, via, to)
        move.hanoi(1, from, to, via)
        move.hanoi(k - 1, via, to, from)
    }
    else
    {
        cat("Move ", tower[[from]][1], 
            " from ", LETTERS[from], 
            " to ", LETTERS[to], "\n")
        
        tower[[to]] <<- c(tower[[from]][1], tower[[to]])
        tower[[from]] <<- tower[[from]][-1]
        draw.hanoi()
        Sys.sleep(0.5)
    }
}

Other Games

library(ompr)
library(dplyr)
n <- 9      # 9 cells per square, row and column
model <- MIPModel() %>%
    # The number k stored in position i,j
    add_variable(x[i, j, k], i=1:n, j=1:n, k=1:n, type="binary") %>%
    # no objective
    set_objective(0) %>%
    # only one number can be assigned per cell
    add_constraint(sum_expr(x[i, j, k], k=1:n) == 1, i=1:n, j=1:n) %>%
    # each number is exactly once in a row
    add_constraint(sum_expr(x[i, j, k], j=1:n) == 1, i=1:n, k=1:n) %>%
    # each number is exactly once in a column
    add_constraint(sum_expr(x[i, j, k], i=1:n) == 1, j=1:n, k=1:n) %>% 
    # each 3x3 square must have all numbers
    add_constraint(sum_expr(x[i, j, k], i=1:3 + sx, j=1:3 + sy) == 1, 
                   sx=seq(0, n - 3, 3), sy=seq(0, n - 3, 3), k=1:n)

model
Mixed linear integer optimization problem
Variables:
  Continuous: 0 
  Integer: 0 
  Binary: 729 
Model sense: maximize 
Constraints: 324 

modelFixed <- model %>% 
    add_constraint(x[1, 2, 3] == 1) %>% add_constraint(x[1, 4, 6] == 1) %>% 
    add_constraint(x[1, 5, 2] == 1) %>% add_constraint(x[1, 8, 7] == 1) %>% 
    add_constraint(x[1, 9, 9] == 1) %>% add_constraint(x[2, 1, 6] == 1) %>% 
    add_constraint(x[2, 6, 5] == 1) %>% add_constraint(x[3, 5, 3] == 1) %>% 
    add_constraint(x[3, 7, 5] == 1) %>% add_constraint(x[4, 2, 6] == 1) %>% 
    add_constraint(x[4, 3, 3] == 1) %>% add_constraint(x[4, 8, 9] == 1) %>% 
    add_constraint(x[4, 9, 2] == 1) %>% add_constraint(x[5, 4, 8] == 1) %>% 
    add_constraint(x[5, 6, 6] == 1) %>% add_constraint(x[6, 1, 7] == 1) %>% 
    add_constraint(x[6, 2, 4] == 1) %>% add_constraint(x[6, 7, 8] == 1) %>% 
    add_constraint(x[6, 8, 5] == 1) %>% add_constraint(x[7, 3, 7] == 1) %>% 
    add_constraint(x[7, 5, 8] == 1) %>% add_constraint(x[8, 4, 1] == 1) %>% 
    add_constraint(x[8, 9, 3] == 1) %>% add_constraint(x[9, 1, 3] == 1) %>% 
    add_constraint(x[9, 2, 9] == 1) %>% add_constraint(x[9, 5, 6] == 1) %>% 
    add_constraint(x[9, 6, 4] == 1) %>% add_constraint(x[9, 8, 2] == 1)

modelFixed
Mixed linear integer optimization problem
Variables:
  Continuous: 0 
  Integer: 0 
  Binary: 729 
Model sense: maximize 
Constraints: 352 

library(ompr.roi)
library(ROI.plugin.glpk)
result <- solve_model(modelFixed, with_ROI(solver="glpk", verbose=TRUE))
<SOLVER MSG>  ----
GLPK Simplex Optimizer, v4.47
352 rows, 729 columns, 2944 non-zeros
      0: obj =  0.000000000e+000  infeas = 3.520e+002 (352)
    500: obj =  0.000000000e+000  infeas = 2.222e+000 (104)
*   681: obj =  0.000000000e+000  infeas = 1.572e-012 (89)
OPTIMAL SOLUTION FOUND
GLPK Integer Optimizer, v4.47
352 rows, 729 columns, 2944 non-zeros
729 integer variables, all of which are binary
Integer optimization begins...
+   681: mip =     not found yet <=              +inf        (1; 0)
+   692: >>>>>  0.000000000e+000 <=  0.000000000e+000   0.0% (1; 0)
+   692: mip =  0.000000000e+000 <=     tree is empty   0.0% (0; 1)
INTEGER OPTIMAL SOLUTION FOUND
<!SOLVER MSG> ----

result
Status: optimal
Objective value: 0

solution <- result %>% 
    get_solution(x[i,j,k]) %>%
    filter(value > 0) %>%  
    select(i, j, k)

head(solution, 8)
  i j k
1 3 1 1
2 7 2 1
3 6 3 1
4 8 4 1
5 2 5 1
6 4 6 1
7 1 7 1
8 5 8 1

RXKCD::getXKCD('653')

plot(1:10, type="b", bty="l", col="paleturquoise3", lty=2, lwd=2)

comic
{ plot(1:10, type = "b", bty = "l", col = "paleturquoise3", family = "Permanent Marker", lty = 2, lwd = 2) }

plays <- readxl::read_excel(file.path(dataDir, 'football', 
                                      '2016 NFL Play-by-Play Data.xlsx'))

topPassers <- plays %>% 
    filter(`Play Type` == "Pass") %>% 
    group_by(Passer) %>% 
    summarize(n.obs=length(`Play Type`)) %>% 
    arrange(desc(n.obs)) %>% 
    slice(1:10) %>% 
    magrittr::extract2('Passer')

passType <- plays %>% 
    filter(`Play Type` == "Pass" & Passer %in% topPassers) %>% 
    mutate(PassDistance=factor(`Pass Distance`, levels=c("Short", "Deep"))) %>%
    mutate(Passer=factor(Passer, levels=topPassers)) %>% 
    dplyr::rename(PassLocation=`Pass Location`, PassResult=`Pass Result`) %>% 
    group_by(Passer, PassLocation, PassDistance) %>% 
    summarize(share=(sum(PassResult == "Complete") / length(PassResult)), 
              n.obs=length(PassResult)) %>%
    filter(n.obs > 5)

library(crosstalk)
all_shared <- SharedData$new(data=talks, key=~ShareKey, group=groupMeetup)
details_shared <- SharedData$new(data=eventDetails, key=~ShareKey, group=groupMeetup)

# custom filter
topicFilter <- filter_select_multikey(id='TopicSelector', label='Choose a Topic',
                                      sharedData1=all_shared,
                                      sharedData2=details_shared,
                                      col1='PresentationTopics', key1='ShareKey',
                                      col2='EventMeetupTopics', key2='ShareKey')

# custom datatable funcion
makeDatatable(talks_shared, 
              colsToHide=c('ShareKey'), 
              scrollX=FALSE, width='100%', scrollY=200, height=200,
              order=list(list(1, 'desc')),
              elementID='PresentationsTable',
              scrollCollapse=FALSE
)

Jared P. Lander