Âm thanh như một công việc cho ngôn ngữ lập trình yêu thích của mọi người, 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
Sử dụng lệnh write.csv
để lưu bảng dưới dạng tệp csv.
/Chỉnh sửa: Để giải thích những gì tôi đang làm: Gói XML chứa hàm readHTMLTable, kéo tất cả các bảng html từ trang web dưới dạng data.frames và lưu chúng dưới dạng danh sách. Bảng đầu tiên trong danh sách này là bảng chúng tôi muốn. Hàm combn tìm tất cả các cách 2 chiều, 3 chiều và n combinations của các tên potion và trả về kết quả dưới dạng ma trận. Tôi sử dụng hàm t để chuyển đổi ma trận này, do đó, mỗi kết hợp là một hàng và sau đó chuyển đổi nó thành một khung dữ liệu. Điều này dễ dàng mở rộng đến sự kết hợp của các thành phần n.
/Chỉnh sửa 2: Tôi đã viết một hàm để lưu bảng n-way vào tệp csv do người dùng chỉ định. Tôi cũng đã làm việc lại một chút, bởi vì việc chuyển đổi các ma trận lớn là tốn kém tính toán. Phiên bản này sẽ cho phép bạn tính toán bảng 4 chiều, mặc dù phải mất một thời gian dài và tôi không biết liệu nó có liên quan đến trò chơi hay không.
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')
/Chỉnh sửa 3: Dưới đây là một số mã để tìm potions làm việc thực tế. Nó không phải là rất hiệu quả và có thể có thể được cải thiện rất nhiều:
#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)
(+1) đẹp phản ứng. – chl
+1 cho một câu trả lời hữu ích, nhưng là tạo ra tất cả các kết hợp thực sự là một cách hiệu quả để tìm công thức nấu ăn làm việc potion? –
@David B: Bạn nghĩ gì sẽ là một cách tiếp cận hiệu quả hơn? – Zach