生成天际(PC 游戏)药水的所有可能组合的最有效方法是什么?组合、药水、最有效、天际

2023-09-08 08:31:17 作者:有种自恋叫小贤

所以每种成分都有 4 种效果http://www.uesp.net/wiki/Skyrim:Ingredients

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

如果我结合两种成分.药水将具有两组相交处的额外效果.我不能两次使用相同的成分.为了生成所有 2 种成分的可能性,我刚刚列出了成分对效果的列表.我取出列表的头部并将其与列表中每个元素的列表的其余部分进行比较,每次迭代都删除头部.这样可以避免上当.

If I combine two ingredients. The potions will have the bonus effects of where the two sets intersect. I can't use the same ingredient twice. To generate all 2 ingredient possibilities I just made a list of ingredient to effect pairs. I take the head of the list and compare it to the rest of the list for each element in the list deleting the head every iteration. That avoids dupes.

但我被困住了.我不知道如何在没有欺骗的情况下生成 3 种成分组合.有什么建议吗?

I'm stuck though. I don't know how to generate 3 ingredient combinations without dupes. Any suggestions?

推荐答案

听起来像是每个人都喜欢的编程语言的工作,R!

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)))

砰!

> 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

使用 write.csv 命令将表格保存为 csv 文件.

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

/解释我在做什么:XML 包包含 readHTMLTable 函数来自网站的所有 html 表格作为 data.frames 并将它们保存为列表.此列表中的第一个表是我们想要的.combn 函数找到所有 2-way、3-way 和 n 路组合的药水名称,并将结果作为矩阵.我用t函数来转置这个矩阵,所以每个组合都是一行,然后转换成一个数据框.这很容易扩展到 n 种成分的组合.

/ 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:我编写了一个函数来将 n 路表保存到用户指定的 csv 文件中.我还对其进行了一些修改,因为转置巨大的矩阵在计算上是昂贵的.这个版本应该可以让你计算4-way table,虽然时间比较长,不知道跟游戏有没有关系.

/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:这里有一些代码可以找到真正的药水.效率不是很高,可能还可以大大改进:

/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)