## Wolves with a Collective Memory A Wolf pack in R Yet untested (i am very unfamiliar with the java machinery). The idea of this wolf pack is that it keeps in memory (in a file called collective_memory.txt) who's alive or dead, check what the dead wolves and the alive wolves used as attacks and change the choice probability accordingly. Here is the R code: repeat{ input <- readLines(file("stdin"),1) type <- substr(input,1,1) id <- substr(input,2,3) f <- "collective_memory.txt" if(nchar(input)>3){info <- substr(input,4,nchar(input))}else{info <- NULL} attack <- function(id,info,f){ if(info%in%c("B","L")){choice <- "S"} if(info=="S"){choice <- "P"} if(info=="W"){ if(file.exists(f)){ memory <- read.table(f,sep="\t",header=TRUE) dead <- memory$ID[memory$Status=="Dead"] veteran <- memory[memory$Attack!="" & !is.na(memory$Attack), ] if(nrow(veteran[!is.na(veteran[,1]),])>0){ deadvet <- table(factor(veteran$Attack[veteran$ID%in%dead],levels=c("R","P","S",""))) livevet <- table(factor(veteran$Attack[!veteran$ID%in%dead],levels=c("R","P","S",""))) probR <- (1+livevet['R'])/(1+livevet['R']+deadvet['R']) probS <- (1+livevet['S'])/(1+livevet['S']+deadvet['S']) probP <- (1+livevet['P'])/(1+livevet['P']+deadvet['P']) choice <- sample(c("S","P","R"),1,prob=c(probS,probP,probR)) memory <- rbind(memory, data.frame(ID=id, Status="Alive", Attack=choice)) }else{ choice <- sample(c("S","P","R"),1) memory <- rbind(memory, data.frame(ID=id, Status="Alive", Attack=choice)) } }else{ choice <- sample(c("S","P","R"),1) memory <- data.frame(ID=id, Status="Alive", Attack=choice) } write.table(memory,file=f,sep="\t",row.names=FALSE, col.names=TRUE) } paste(choice,id,sep="") } move <- function(id,info){ choice <- "H" paste(choice,id,sep="") } initialize <- function(id,f){ if(file.exists(f)){ memory <- read.table(f,sep="\t",header=TRUE) memory <- rbind(memory,data.frame(ID=id,Status="Alive",Attack="")) }else{memory <- data.frame(ID=id,Status="Alive",Attack="")} confirmed_dead <- memory$ID[memory$Status=="Dead"] last_seen <- memory[!memory$ID%in%confirmed_dead,] last_seen <- last_seen[last_seen$Attack=="",] lid <- table(last_seen$ID) turns <- max(lid) dead <- lid[lid<(turns-1)] if(length(dead)>0){ dead_id <- names(dead) for(i in dead_id){ memory <- rbind(memory, data.frame(ID=i, Status="Dead", Attack="")) } } write.table(memory,file=f,sep="\t",row.names=FALSE, col.names=TRUE) paste("K",id,sep="") } result <- switch(type,"A"=attack(id,info,f),"M"= move(id,info),"S"=initialize(id,f)) cat(result,"\n",sep="") flush(stdout()) } It uses @ProgrammerDan wrapper (thank you!), with WolfCollectiveMemory as custom name and "Rscript WolfCollectiveMemory.R" as invocation.