Untitled

 avatar
unknown
r
3 years ago
1.9 kB
5
Indexable
library(rjson)
words <- fromJSON(file="words.json")
words <- words$solutions

rng <- 1:5

guess <- function(words)
{
  # Frequency by position
  freq_in_pos <- lapply(
    rng,
    function(n) table(
      factor(unlist(lapply(strsplit(words, ""), function(x) x[n])), levels=letters)
    )
  )
  
  freq_all <- table(unlist(strsplit(words, "")))
  
  freq_out_pos <- lapply(
    rng,
    function(n) (freq_all[[n]] - freq_in_pos[[n]]) / 4
  )
  
  weight <- Vectorize(function(word)
  {
    contents <- strsplit(word, "")[[1]] 
    sum(sapply(rng, function(n) freq_in_pos[[n]][contents[n]] + 
                                freq_out_pos[[n]][contents[n]])) 
  })
  
  result <- data.frame(row.names = NULL, word=words, weight=weight(words))
  result[order(result$weight, decreasing = TRUE),1]
}

cmd = ''
while(cmd != 'q')
{
  suggested <- guess(words)
  cat("Best guess: '", suggested[1], "' 1 of ", length(words), " possible\n", sep='')
  
  if(length(words) <= 1) {cmd <- 'q'; next;}
  
  cat("\nCommands are\n  'p' : print possible list.\n  'gyxxx' : 5 characters showing results of guess.\n  'q' : quit.\n\n")
  cmd <- readline("* ")
  
  if(cmd == 'q') next;
  if(cmd == 'p') {print(suggestedp); next;}
  if(!grepl("^[gyx]{5}$", "gyxxx", perl=TRUE)) {cat("Unrecognized command.\n\n"); next;}
  
  pieces <- strsplit(suggested[1], "")[[1]]
  results <- strsplit(cmd, "")[[1]]
  
  for(i in 1:5)
  {
    # Remaining dictionary must contain the letter in this position
    if(results[i] == 'g')
      words <- words[substr(words, i, i) == pieces[i]]
    
    # Remaining dictionary must not contain this letter at all
    if(results[i] == 'x')
      words <- words[!grepl(pieces[i], words)]
    
    # Remaining dictionary must contain the letter in a different position
    if(results[i] == 'y')
      words <- words[grepl(pieces[i], words) &
                     !substr(words, i, i) == pieces[i]]
  }
}
Editor is loading...