Brzmi jak zadanie dla każdego ulubionego języka programowania, 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
Użyj polecenia write.csv
, aby zapisać tabele jako pliki CSV.
/Edytuj: Aby wyjaśnić, co robię: Pakiet XML zawiera funkcję readHTMLTable, która pobiera wszystkie tabele html ze strony internetowej jako dane.frames i zapisuje je jako listę. Pierwsza tabela na tej liście jest tą, której chcemy. Funkcja combn znajduje wszystkie nazwy dwukierunkowe, 3-drogowe i n-combinations nazw mikstur i zwraca wynik jako macierz. Używam funkcji t do transpozycji tej macierzy, więc każda kombinacja to jeden wiersz, a następnie przekształcenie go w ramkę danych. To łatwo rozciąga się na kombinacje n składników.
/Edytuj 2: napisałem funkcję, aby zapisać tabelę n-way do pliku csv określonego przez użytkownika. Trochę go też przerobiłem, ponieważ transpozycja ogromnych matriksów jest kosztowna pod względem obliczeniowym. Ta wersja powinna pozwolić ci obliczyć tabelę 4-stronną, chociaż zajmuje to dużo czasu i nie wiem, czy jest ona istotna dla gry.
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')
/Edytuj 3: Oto kod do znajdowania rzeczywistych mikstur roboczych. Nie jest to zbyt wydajne i można go znacznie poprawić:
#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) Nicea odpowiedzi. – chl
+1 za pomocną odpowiedź, ale czy generowanie każdej kombinacji jest skutecznym sposobem na znalezienie receptur działających eliksirów? –
@David B: Jak myślisz, co byłoby bardziej efektywnym podejściem? – Zach