What's the most efficient way of generating all possible combinations of skyrim (PC Game) potions?

后端 未结 3 1226
一个人的身影
一个人的身影 2021-01-12 01:38

So each ingredient has 4 effects http://www.uesp.net/wiki/Skyrim:Ingredients

If I combine two ingredients. The potions will have the bonus effects of where the two s

3条回答
  •  庸人自扰
    2021-01-12 02:23

    Sounds like a job for everybody's favorite programming language, R!

    library(XML)
    tables <- readHTMLTable('http://www.uesp.net/wiki/Skyrim:Ingredients', 
        stringsAsFactors=FALSE)
    potions <- tables[[1]]
    twoway <- data.frame(t(combn(potions$Name,2)))
    threeway <- data.frame(t(combn(potions$Name,3)))
    

    BAM!

    > head(twoway)
                   X1                  X2
    1 Abecean Longfin          Bear Claws
    2 Abecean Longfin                 Bee
    3 Abecean Longfin        Beehive Husk
    4 Abecean Longfin      Bleeding Crown
    5 Abecean Longfin         Blisterwort
    6 Abecean Longfin Blue Butterfly Wing
    > head(threeway)
                   X1         X2                  X3
    1 Abecean Longfin Bear Claws                 Bee
    2 Abecean Longfin Bear Claws        Beehive Husk
    3 Abecean Longfin Bear Claws      Bleeding Crown
    4 Abecean Longfin Bear Claws         Blisterwort
    5 Abecean Longfin Bear Claws Blue Butterfly Wing
    6 Abecean Longfin Bear Claws       Blue Dartwing
    

    Use the write.csv command to save the tables as csv files.

    /Edit: To explain what I'm doing: The XML package contains the readHTMLTable function, which pulls all the html tables from a website as data.frames and saves them as a list. The first table in this list is the one we want. The combn function finds all the 2-way, 3-way, and n way combinations of potion names, and returns the result as a matrix. I use the t function to transpose this matrix, so each combination is one row, and then convert it to a data frame. This easily extends to combinations of n ingredients.

    /Edit 2: I wrote a function to save the n-way table to a user-specified csv file. I also re-worked it a bit, because transposing huge matricies is computationally expensive. This version should allow you to calculate the 4-way table, although it takes a long time and I don't know if it's relevant to the game.

    nway <- function(n, filepath, data=potions) {
        nway <- combn(data$Name, n, simplify = FALSE)
        nway <- do.call(rbind,nway)
        write.csv(nway,filepath, row.names=FALSE)
    }
    nway(4,'~/Desktop/4way.csv')
    

    /Edit 3: Here's some code to find the actual working potions. It's not very efficient and can probably be greatly improved:

    #Given an ingredient, lookup effects
    findEffects <- function(Name) { #Given a name, lookup effects
        potions[potions$Name==Name,3:6]
    }
    
    #2-way potions
    intersectTwoEffects <- function(x) {
        Effects1 <- findEffects(x[1])
        Effects2 <- findEffects(x[2])
        Effects <- unlist(intersect(Effects1,Effects2))
        Effects <- c(x[1],x[2],Effects)
        length(Effects) <- 6
        names(Effects) <- NULL
        c(Effects,sum(is.na(Effects)))
    
    }
    twoway <- lapply(twoway,intersectTwoEffects)
    twoway <- do.call(rbind,twoway)
    twoway <- twoway[twoway[,7]<4,-7] #remove combos with no effect
    write.csv(twoway,'~/Desktop/twoway.csv',row.names=FALSE)
    
    #3-way potions
    intersectThreeEffects <- function(x) {
        Effects1 <- findEffects(x[1])
        Effects2 <- findEffects(x[2])
        Effects3 <- findEffects(x[3])
        Effects <- c(intersect(Effects1,Effects2),intersect(Effects1,Effects3),intersect(Effects2,Effects3))
        Effects <- unlist(unique(Effects))
        Effects <- c(x[1],x[2],x[3],Effects)
        length(Effects) <- 8
        names(Effects) <- NULL
        c(Effects,sum(is.na(Effects)))
    
    }
    threeway <- lapply(threeway,intersectThreeEffects)
    threeway <- do.call(rbind,threeway)
    threeway <- threeway[threeway[,9]<5,-9] #remove combos with no effect
    write.csv(threeway,'~/Desktop/threeway.csv',row.names=FALSE)
    

提交回复
热议问题