Skip to content

Instantly share code, notes, and snippets.

@cannorin cannorin/a.md
Last active Apr 1, 2018

Embed
What would you like to do?
FGO 複数の素材を集める際の効率ランキング

FGO 複数の素材を集める際の効率ランキング

最終更新: 2018年4月2日 0:00:08 (1時間ごとに更新)

算出方法

素材 X が最も多く出るクエストでの AP 効率を A_best(X) 、あるクエスト C での素材 X の AP 効率を A_C(X) とおくと、

クエスト C のお得度は、 C でドロップする可能性のあるそれぞれの素材 X に対して A_best(X) / A_C(X) (素材単体でのお得度) を計算して和を取ることで計算される。

ピース・モニュメント・種火などは計算対象外。

凡例

クエスト名が

  • 太字 ... サンプル数が 1000 以上
  • 普通 ... サンプル数が 100 〜 999
  • 斜体 ... サンプル数が 100 未満

素材名が

  • 太字 ... 素材単体でのお得度が 0.66 以上
  • 普通 ... 素材単体でのお得度が 0.34 以上 0.66 未満
  • 斜体 ... 素材単体でのお得度が 0.34 未満

お得度ランキング

クエスト 素材 お得度
野営地 種, 羽根, 幼角 2.07947
聖都市街 証, 八連, 2.04913
新宿二丁目 , 涙石 2
荒川の原 塵, 勾玉, 胆石 1.95404
土気城 塵, 勾玉, 神酒 1.90802
塵, 種, 勾玉 1.80249
剣上級 , , , 羽根, 歯車, 貝殻, 1.60924
裏山 塵, 八連, 勾玉 1.60363
カーター家 鉄杭, 心臓 1.58899
砂嵐の砂漠 , スカラベ 1.58593
大神殿 鎖, スカラベ 1.58108
留置所 牙, ランプ 1.53557
ニップル 毒針, 逆鱗 1.5138
剣超級 , , , 羽根, 歯車, 貝殻, 1.5128
北の断崖 鎖, 1.49023
シャーロット 証, 1.48792
地底平原 牙, 1.47978
新宿御苑 髄液, 心臓 1.47384
合戦場 骨, 塵, 勾玉 1.4711
デモイン , , 1.45506
エビフ山 種, 胆石 1.44966
剣初級 , 骨, , , 歯車, 貝殻 1.4354
鮮血神殿 種, 産毛 1.43092
高原 毒針, 種 1.41902
東の村 牙, 幼角 1.39988
新宿四丁目 髄液, 1.39716
田んぼ , ランタン 1.38335
山裾の密林 , , 羽根 1.38073
弓超級 , , , 羽根, 蹄鉄, 涙石 1.3699
川辺の町 , 羽根 1.3533
ウル 種, 1.34602
北壁 毒針, 産毛 1.3441
地底大河 種, 羽根 1.33827
隠れ村 鎖, ランプ 1.33393
湿原 毒針, 蛇玉 1.32497
ハイドパーク 骨, 1.31186
竜宮城 , 神酒 1.29532
ラボック , 脂 1.28707
牧草地 鉄杭, 1.28152
弓初級 , 骨, , , 蹄鉄 1.27983
パーティ会場 塵, 髄液, 歯車 1.27567
ランタン, 勾玉 1.26824
タワー最上階 歯車, 1.24976
王城 , 勲章 1.24921
北の高台 種, 1.24339
殺初級 , 塵, ランタン, 歯車 1.24204
槍初級 , 骨, , ホム 1.24184
槍超級 , , , 羽根, ホム, 幼角 1.23521
槍上級 , , , 羽根, ホム, 幼角 1.22679
術初級 塵, 蛇玉, 1.22458
弓中級 , , , , , 羽根, 蹄鉄 1.21519
殺上級 , , , ランタン, 歯車, 1.20694
術上級 , 蛇玉, 頁, 心臓 1.19253
空き家 鉄杭, 羽根 1.18919
地図に記された島 , 塵 1.17934
郊外の屋敷 鎖, 鉄杭 1.16709
カーニー 証, 幼角 1.1645
アレクサンドリア 証, 涙石 1.15718
サザーク , ホム 1.15196
術超級 , 蛇玉, 頁, 心臓 1.1443
国道20号 塵, 髄液 1.14387
波止場 鎖, 羽根 1.14239
黒い杉の森 , 産毛 1.14148
オルレアン 骨, 牙, 塵 1.13599
クラーケンウェル 骨, 歯車 1.12784
弓上級 , , , 羽根, 蹄鉄, 涙石 1.11282
隠れ家 , 羽根 1.10294
殺超級 , , , ランタン, 歯車, 1.0797
海賊島 , 1.07815
剣中級 , , , 歯車, 貝殻 1.07371
X-E(教会) , 1.07064
リバートン 証, 塵 1.06499
X-F(校舎) 骨, 塵 1.05758
術中級 , 蛇玉, 1.05566
歌舞伎町 塵, 歯車 1.03567
ティエール 牙, 塵 1.03075
ガリア 証, , 八連 1.02876
不夜城 塵, 鎖 1.02593
ワシントン 証, 根 1.01373
ガローの丘 鉄杭 1
ウェイトリー家 ホム 1
公会堂 羽根 1
城下町 勾玉 1
大地の裂け目 蛇玉 1
桃源郷 八連 1
バレルタワー 歯車 1
新宿駅 髄液 1
クタ ランタン 1
葦の原 毒針 1
観測所 貝殻 1
廃都バビロン 1
無の大地 蹄鉄 1
死の荒野 1
デミング 1
海賊船 1
X-C(大橋) 1
騎超級 , , 蹄鉄, 逆鱗 0.977982
暗礁海域 骨, 蛇玉 0.975726
翼竜の島 0.97482
明けの砂丘 蛇玉, ランプ 0.972744
豊かな海 , 羽根 0.9717
ジュラ , 塵, 0.971122
殺中級 , , , ランタン, 歯車 0.96954
槍中級 , , , , ホム 0.96762
円卓の砦 証, 勲章 0.964595
モントゴメリー , 0.961719
マッシリア , 塵 0.961695
騎上級 牙, , 蹄鉄, 逆鱗 0.945403
ゲルマニア , 0.937388
エルドラド , 種 0.93631
聖都正門 勲章 0.936066
X-G(燃え盛る森) 0.935897
群島(静かな入り江) , , 塵 0.930669
晩鐘廟 ランタン 0.90223
X-D(港) 0.897541
アッビア街道 , 0.896724
シカゴ 歯車 0.891051
静寂な森 0.861842
パリ , , 0.859972
リヨン 証, 0.857392
騎中級 牙, , 蹄鉄 0.856372
群島(隠された島) 貝殻 0.854895
マルセイユ 0.852321
イース , 塵 0.850533
狂中級 , , 八連, 0.834585
エリドゥ 0.828746
X-B(爆心地) 0.820225
ソーホー , 歯車, ホム 0.815868
ダラス 0.808
騎初級 牙, , 蹄鉄 0.798137
嵐の海域 ランタン 0.781575
アルカトラズ 証, 0.778244
潮目の海 証, 八連 0.767582
狂上級 , , 八連, 0.766295
カルデラの島 種, 蹄鉄 0.754208
西の村跡 0.741176
ウェストミンスター , ホム 0.73011
アトラス院 歯車, 0.711092
形ある島 骨, 0.707027
変動座標点0号(大空洞) 牙, 塵 0.696184
ラ・シャリテ , 牙 0.693926
狂超級 , , 八連, 0.68755
メディオラヌム 0.664474
王の住まう島 証, 0.663902
フロレンティア 0.662295
デンバー , 歯車 0.660327
狂初級 , , 八連 0.641965
連合首都 , , 八連 0.604816
エトナ火山 ランタン 0.603904
代々木二丁目 髄液 0.579525
ヴォークルール , 牙 0.57218
ボルドー 0.556657
ホワイトチャペル , 歯車 0.553524
X-A(屋敷跡) 0.544776
ドンレミ 0.51269
ローマ 0.470862
ブラックヒルズ 歯車 0.433712
リージェントパーク 歯車, 0.412248
シティ・オブ・ロンドン ホム 0.402046
ブリタニア 0.380445
オールドストリート 歯車 0.348819
(*
The X11 License
fgo.fsx - generates FQ farming ranking for Fate/GrandOrder
Copyright(c) 2018 cannorin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*)
open System
open System.IO
let deps = [
"FSharp.Data";
]
// ------------------------------- paket setup ------------------------------------
Environment.CurrentDirectory <- __SOURCE_DIRECTORY__
if not (File.Exists "paket.exe") then
let url = "https://github.com/fsprojects/Paket/releases/download/4.8.8/paket.exe"
use wc = new Net.WebClient()
let tmp = Path.GetTempFileName()
wc.DownloadFile(url, tmp)
File.Move(tmp, Path.GetFileName url)
#r "paket.exe"
open Paket
if not (File.Exists "paket.dependencies") then
Dependencies.Init()
if not (deps |> List.forall (Directory.Exists << sprintf "packages/%s")) then
let dep = Dependencies.Locate(__SOURCE_DIRECTORY__)
for d in deps do
dep.Add d
dep.Install false
#I "packages/"
// --------------------------------------------------------------------------------
#r "FSharp.Data/lib/net45/FSharp.Data.dll"
open System.Globalization
open FSharp.Data
printfn "# FGO 複数の素材を集める際の効率ランキング";
printfn ""
DateTime.Now.ToString("F", new CultureInfo("ja-JP")) |> printfn "最終更新: %s (1時間ごとに更新) "
printfn ""
let inline (?|) x y = defaultArg x y
let kgGet sheetName range =
// 効率劇場楽屋's key
let kgKey = "1DxFVWa1xsBh-TJVVTrJf7ttVxf7msCHhxuZyM-shPx0" in
let genExportUrl key sheetName format range =
let u = sprintf "https://docs.google.com/spreadsheets/d/%s/gviz/tq?tqx=out:%s&headers=1&range=%s" key format sheetName in
range |> Option.map (fun x -> sprintf "%s!%s" u x) ?| u
in
let load key sheetName format range =
CsvFile.Load(genExportUrl key sheetName format range)
in
load kgKey sheetName "csv" (Some range)
// (item_name, best_quest, best_ap)
// Col.I: best ap (do not edit)
// Row.171: 神酒_5
let items =
let dat = (kgGet "AP効率Best5" "B2:I171") in
let ranks = [ for r in dat.Rows -> (r.[1], (r.[0], r.[3], r.[7])) ] in
ranks |> List.filter (fst >> ((=) "1"))
|> List.map snd
|> List.map (fun (n, q, a) -> (n, q, double a))
// (quest_name, (item_name * ap option) list)
// Col.AL: 神酒
// Row.174: セイレム 留置所
let quests =
let dat = kgGet "AP効率表" "B3:AL174" in
let items = dat.Headers |> Option.map (Seq.skip 3) ?| seq [] in
let quests = [ for r in dat.Rows -> (r.[0], r.[2], r.Columns |> Seq.skip 3) ] in
let inline zipItemAndAp items aps =
let inline toAp s =
try Some (double s)
with _ -> None
in
let z = Seq.zip items (aps |> Seq.map toAp) in
z |> Seq.filter (fst >> (not << String.IsNullOrEmpty)) |> Seq.toList
in
quests |> List.map (fun (name, sc, aps) -> (name, sc, zipItemAndAp items aps))
|> List.filter (fun (name, _, _) -> not (String.IsNullOrEmpty name || name = "クエスト名"))
|> List.map (fun (name, sc, ais) -> (name, int sc, ais))
let getAvailableItems iaps =
iaps |> List.choose (function (item, Some _) -> Some item | _ -> None)
let printTable header xs =
let columns = List.length header
printfn "| %s |" (header |> String.concat " | ");
printfn "|%s" (":---:|" |> String.replicate columns)
for x in xs do
printfn "| %s |" (x |> String.concat " | ")
printfn """
## 算出方法
素材 X が最も多く出るクエストでの AP 効率を ```A_best(X)``` 、あるクエスト C での素材 X の AP 効率を ```A_C(X)``` とおくと、
クエスト C のお得度は、 C でドロップする可能性のあるそれぞれの素材 X に対して ```A_best(X) / A_C(X)``` (素材単体でのお得度) を計算して和を取ることで計算される。
ピース・モニュメント・種火などは計算対象外。
## 凡例
### クエスト名が
- **太字** ... サンプル数が 1000 以上
- 普通 ... サンプル数が 100 〜 999
- *斜体* ... サンプル数が 100 未満
### 素材名が
- **太字** ... 素材単体でのお得度が 0.66 以上
- 普通 ... 素材単体でのお得度が 0.34 以上 0.66 未満
- *斜体* ... 素材単体でのお得度が 0.34 未満
## お得度ランキング
"""
let calc (qname, sc, iaps) =
let z = List.zip items iaps
|> List.choose (function ((item, _, bestAp), (_, Some questAp)) -> Some (item, (bestAp, questAp)) | _ -> None)
in
let inline getValue (best, quest) = best / quest in
let nm =
match sc with
| x when x < 100 -> sprintf "*%s*" qname
| x when x >= 1000 -> sprintf "**%s**" qname
| _ -> qname
in
let values = z |> List.map (snd >> getValue) in
let ais = getAvailableItems iaps
|> List.zip values
|> List.map (function
| (v, i) when v < 0.34 -> sprintf "*%s*" i
| (v, i) when v < 0.66 -> i
| (_, i) -> sprintf "**%s**" i
)
|> String.concat ", "
in
let sum = List.sum values in
(nm, ais, sum)
quests |> List.map calc
|> List.sortBy (fun (_, _, v) -> v)
|> List.rev
|> List.map (fun (n, a, v) -> [n; a; sprintf "%g" v])
|> printTable [ "クエスト"; "素材"; "お得度" ]
printfn ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.