程序员如何为女朋友做迪士尼攻略
身为一个程序员,我们每天大多时间对着计算机没有交际应酬,更不懂得浪漫与体贴。我能为女朋友做点什么呢?我是不是能用我的专业来帮女票做点事情。刚好女票生日计划去迪士尼玩,做攻略的重任就落到了我的身上。
我利用数据和逻辑科学的帮助女友生成了一份攻略,代码在这里
前言 我在苦思冥想该怎么做攻略的时候看了很多小红书,视频,还有直播,我发现他们都会给出游玩攻略。但很可惜他们清一色的就是告诉你该以什么顺序去玩却不告诉你形成攻略的具体逻辑是什么,他们形成攻略的说辞基本就是靠经验,这对于我一个逻辑至上的程序员来说是不能忍受的。所有的up主都千篇一律的就是第一个冲翱翔地平线,第二个小矮人矿车。。。
我知道他们通过经验形成的逻辑点就是在最早的时间冲最火的项目,这样在主观感受上确实是可以节省更多时间。但最火的项目在早上不也一样是最火的?不也一样等的时间比其他的久,在所有项目都接近排队时长最短的黄金早晨时间项目排队耗费时间也是能否玩更多项目的关键。
我觉得可以根据多日的单项目不同时间点平均等待时间辅以一些算法来获取一个项目游玩优先级权重。
攻略思路 在早8:00 - 9:00 时间内(最早统计数据为8点,如果是早享票则没有7:30到八点的参考理论上差异不大可以尝试冲热门项目) 为拥挤程度最低的时间,利用该段时间去玩在正常游玩时间最为拥挤的项目为性价比最高的选择。
具体策略
获取最近几个周的同星期所有项目不同时间点的排队时间数据
进行同时间点的数据融合取均值
计算同一个项目早8:00-9:10的等待时间均值为早享时间,计算9:30-17:30的等待时间均值为游玩时间
获取早享时间和游玩时间的差值为节省时间
因为排队及执行项目耗费的时间直接占据你的早享时间比例,所以排队时间加执行时间应与分数成反比,所以用节省时间除以排队时间与执行项目时间和得到分数
分数最高则为早上优先级最高的项目,可以先冲。
接下来我还准备了**单个项目不同时间点等待时间排名 **帮助你安排除了早享黄金时间外的游玩攻略
当然如果你买了早享卡我觉得是可以直接冲最热的项目的,我和女票就准备先冲小矮人矿工
执行结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 ========================= 迪士尼策略优先级排行榜 ========================= 第1名:泡泡龙冲天赛车 || 早享时间:8.09 | 普通时间:64.89 | 节省时间:56.80 | 分数:0.84 第2名:小熊维尼历险记 || 早享时间:5.23 | 普通时间:41.26 | 节省时间:36.03 | 分数:0.77 第3名:弹簧狗团团转 || 早享时间:6.14 | 普通时间:44.13 | 节省时间:37.99 | 分数:0.73 第4名:彼得-潘的飞行 || 早享时间:5.04 | 普通时间:38.97 | 节省时间:33.93 | 分数:0.61 第5名:喷气背包飞行器 || 早享时间:7.99 | 普通时间:48.09 | 节省时间:40.10 | 分数:0.60 第6名:古迹探索营的探索步行道 || 早享时间:5.08 | 普通时间:30.77 | 节省时间:25.69 | 分数:0.51 第7名:胡迪牛仔嘉年华 || 早享时间:9.32 | 普通时间:45.86 | 节省时间:36.54 | 分数:0.47 第8名:加勒比海盗-沉落宝藏之战 || 早享时间:5.27 | 普通时间:28.79 | 节省时间:23.52 | 分数:0.43 第9名:旋转蜂蜜罐 || 早享时间:5.00 | 普通时间:22.95 | 节省时间:17.95 | 分数:0.42 第10名:小飞象 || 早享时间:11.04 | 普通时间:48.12 | 节省时间:37.09 | 分数:0.40 第11名:创极速光轮 || 早享时间:12.77 | 普通时间:44.78 | 节省时间:32.01 | 分数:0.30 第12名:雷鸣山漂流 || 早享时间:14.88 | 普通时间:47.39 | 节省时间:32.51 | 分数:0.25 第13名:巴斯光年星际营救 || 早享时间:5.00 | 普通时间:15.70 | 节省时间:10.70 | 分数:0.24 第14名:七个小矮人矿工 || 早享时间:47.74 | 普通时间:78.91 | 节省时间:31.17 | 分数:0.08 第15名:翱翔地平线 || 早享时间:65.22 | 普通时间:88.34 | 节省时间:23.12 | 分数:0.04 ========================= 单个项目不同时间点等待时间排名 ========================= 2023-03-26,2023-03-19,2023-03-12,2023-03-05,2023-02-26,2023-02-19 项目等待时间点排名: 翱翔地平线: 1. 08:35 AM : 55 2. 06:55 PM : 55.9375 3. 06:35 PM : 56.875 4. 06:40 PM : 56.875 5. 06:45 PM : 56.875 6. 06:50 PM : 56.875 7. 06:30 PM : 57.34375 8. 08:30 AM : 58 9. 08:40 AM : 61.25 10. 06:25 PM : 62.34375 11. 06:20 PM : 63.28125 12. 08:00 AM : 64.375 13. 08:45 AM : 65.46875 14. 06:15 PM : 67.03125 15. 06:10 PM : 68.4375 16. 06:05 PM : 68.90625 17. 08:50 AM : 69.21875 18. 08:55 AM : 70.9375 19. 09:00 AM : 70.9375 20. 09:05 AM : 70.9375 21. 01:00 PM : 74.53125 22. 01:05 PM : 74.53125 23. 01:10 PM : 75.46875 24. 02:25 PM : 75.9375 25. Average : 76.21875 26. 12:45 PM : 76.40625 27. 12:50 PM : 76.40625 28. 12:55 PM : 76.40625 29. 06:00 PM : 76.40625 30. 12:15 PM : 76.875 31. 12:20 PM : 76.875 32. 12:25 PM : 76.875 33. 12:30 PM : 76.875 34. 04:25 PM : 76.875 35. 04:30 PM : 76.875 36. 12:35 PM : 77.34375 37. 12:40 PM : 77.34375 38. 04:20 PM : 77.34375 39. 01:20 PM : 78.75 40. 02:30 PM : 78.75 41. 04:10 PM : 79.21875 42. 01:25 PM : 79.6875 43. 02:15 PM : 79.6875 44. 02:20 PM : 79.6875 45. 04:35 PM : 79.6875 46. 02:35 PM : 80.15625 47. 10:40 AM : 80.625 48. 10:45 AM : 80.625 49. 01:15 PM : 80.625 50. 02:40 PM : 80.625 七个小矮人矿工: 1. 08:35 AM : 43.125 2. 08:30 AM : 44.59375 3. 08:40 AM : 45.46875 4. 08:00 AM : 46.96875 5. 08:45 AM : 48.28125 6. 08:55 AM : 48.75 7. 08:50 AM : 49.21875 8. 09:10 AM : 50.9375 9. 09:00 AM : 51.25 10. 09:05 AM : 51.25 11. 06:55 PM : 53.4375 12. 06:50 PM : 55.9375 13. 09:15 AM : 56.40625 14. 06:35 PM : 56.5625 15. 06:40 PM : 56.5625 16. 06:45 PM : 57.8125 17. 09:20 AM : 59.21875 18. 05:55 PM : 62.34375 19. 12:45 PM : 62.5 20. 09:25 AM : 62.96875 21. 12:25 PM : 62.96875 22. 12:40 PM : 62.96875 23. 12:30 PM : 63.4375 24. 12:35 PM : 63.4375 25. 09:30 AM : 63.90625 26. 09:35 AM : 63.90625 27. 09:40 AM : 64.21875 28. 09:45 AM : 64.21875 29. 09:50 AM : 64.21875 30. 06:20 PM : 65.46875 31. 06:25 PM : 65.46875 32. 06:30 PM : 65.46875 33. 06:05 PM : 65.78125 34. 06:10 PM : 65.78125 35. 06:15 PM : 65.78125 36. 05:40 PM : 65.9375 37. 05:45 PM : 65.9375 38. 05:50 PM : 66.09375 39. 06:00 PM : 66.09375 40. Average : 66.625 41. 05:35 PM : 66.875 42. 12:15 PM : 67.96875 43. 12:20 PM : 67.96875 44. 12:50 PM : 70 45. 12:55 PM : 70 46. 01:00 PM : 70.9375 47. 12:05 PM : 72.96875 48. 12:10 PM : 72.96875 49. 11:05 AM : 73.59375 50. 11:10 AM : 73.59375 创极速光轮: 1. 08:30 AM : 9.6875 2. 08:35 AM : 9.6875 3. 08:40 AM : 9.6875 4. 08:00 AM : 10.0625 5. 08:45 AM : 10.3125 6. 08:50 AM : 10.3125 7. 08:55 AM : 10.3125 8. 09:00 AM : 18.4375 9. 06:35 PM : 20.3125 10. 06:30 PM : 22.8125 11. 09:05 AM : 23.75 12. 06:55 PM : 24.0625 13. 09:10 AM : 24.6875 14. 06:40 PM : 25.3125 15. 06:45 PM : 25.3125 16. 06:50 PM : 25.3125 17. 12:30 PM : 26.25 18. 12:35 PM : 26.25 19. 12:40 PM : 26.25 20. 06:00 PM : 29.0625 21. 06:05 PM : 29.0625 22. 06:10 PM : 29.0625 23. 05:55 PM : 29.6875 24. 12:25 PM : 31.5625 25. 12:20 PM : 31.875 26. 05:50 PM : 31.875 27. 06:15 PM : 32.1875 28. 12:15 PM : 32.5 29. 05:25 PM : 33.125 30. 05:35 PM : 33.125 31. 05:40 PM : 33.4375 32. 05:45 PM : 33.4375 33. 05:30 PM : 33.75 34. 12:10 PM : 34.0625 35. 06:25 PM : 34.0625 36. 02:15 PM : 34.375 37. 05:20 PM : 34.375 38. 02:10 PM : 34.6875 39. 06:20 PM : 34.6875 40. 02:05 PM : 35 41. 04:05 PM : 35 42. 04:10 PM : 35 43. 12:05 PM : 35.3125 44. 03:55 PM : 35.3125 45. 04:00 PM : 35.3125 46. Average : 35.3125 47. 12:45 PM : 35.625 48. 02:00 PM : 38.125 49. 05:10 PM : 39.375 50. 05:15 PM : 39.375 雷鸣山漂流: 1. 08:35 AM : 7.5 2. 08:30 AM : 9 3. 08:40 AM : 10 4. 08:45 AM : 11.25 5. 08:00 AM : 12.25 6. 08:50 AM : 13.75 7. 06:55 PM : 13.75 8. 08:55 AM : 18.75 9. 09:00 AM : 18.75 10. 06:50 PM : 18.75 11. 05:55 PM : 22.5 12. 06:00 PM : 22.5 13. 06:35 PM : 22.5 14. 06:40 PM : 22.5 15. 06:45 PM : 23.75 16. 05:50 PM : 25 17. 06:10 PM : 25 18. 06:15 PM : 25 19. 06:20 PM : 25 20. 06:25 PM : 25 21. 06:30 PM : 25 22. 05:45 PM : 26.25 23. 06:05 PM : 27.5 24. 09:05 AM : 30 25. 09:10 AM : 35 26. 09:15 AM : 35 27. 09:20 AM : 35 28. 09:25 AM : 35 29. 09:30 AM : 37.5 30. 09:40 AM : 37.5 31. 09:45 AM : 37.5 32. Average : 38.25 33. 09:35 AM : 38.75 34. 05:35 PM : 38.75 35. 05:40 PM : 38.75 36. 09:50 AM : 40 37. 01:05 PM : 40 38. 11:50 AM : 41.25 39. 11:55 AM : 41.25 40. 12:00 PM : 41.25 41. 12:05 PM : 41.25 42. 01:00 PM : 41.25 43. 02:15 PM : 41.25 44. 02:20 PM : 41.25 45. 05:20 PM : 41.25 46. 05:25 PM : 41.25 47. 05:30 PM : 41.25 48. 09:55 AM : 42.5 49. 12:50 PM : 42.5 50. 12:55 PM : 42.5 .....
使用方式 直接在Idea中执行main函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 var myProjects = []string { "Soaring Over the Horizon" , "Seven Dwarfs Mine Train" , "TRON Lightcyc... Chevrolet" , "Roaring Rapids" , "Pirates of th...n Treasure" , "Slinky Dog Spin" , "Woody’s Roundup" , "Jet Packs" , "Rex’s Racer" , "The Many Adve...e the Pooh" , "Hunny Pot Spin" , "Dumbo the Fly...g Elephant" , "Slinky Dog Spin" , "Voyage to the...tal Grotto" , "Peter Pan’s Flight" , "Hunny Pot Spin" , "Buzz Lightyea...net Rescue" , } func main () { stopChan := make (chan struct {}, 1 ) group := sync.WaitGroup{} group.Add(1 ) go func () { defer group.Done() for { select { case <-stopChan: return default : fmt.Println("迪士尼项目策略生成中,有点慢,请稍等片刻。。。。" ) time.Sleep(time.Second * 3 ) } } }() group.Add(1 ) go func () { defer group.Done() dateList := util.GetLatestWeekDayList(time.Sunday, 6 ) got, err := business.GetAllDataOfProjectByDateFusion(dateList, func (m map [string ][]*model.WaitTimeData) { business.FilterTimeAfter(19 , m) }) if err != nil { fmt.Println("GetAllDataOfProjectByDateFusion err : " , err) return } sts := business.GenerateStrategy(got, myProjects) fmt.Println("========================= 迪士尼策略优先级排行榜 =========================" ) for i, st := range sts { fmt.Println(st.Desc(i)) } fmt.Println() fmt.Println() fmt.Println() fmt.Println("========================= 单个项目不同时间点等待时间排名 =========================" ) sortListGot, err := business.DescSortListData(got, dateList, myProjects, 50 ) if err != nil { fmt.Println("DescSortListData err : " , err) return } for _, data := range sortListGot { fmt.Println(data) fmt.Println() } stopChan <- struct {}{} }() group.Wait() fmt.Println("迪士尼项目策略生成完毕。。。" ) }
第一步:获取数据源 1 2 3 4 got, err := business.GetAllDataOfProjectByDateFusion(dateList, func (m map [string ][]*model.WaitTimeData) { business.FilterTimeAfter(19 , m) })
也可以调整GetAllDataOfProjectByDateFusion的第一个参数dateList,dateList 可以使用我封装的一个函数 util.GetLatestWeekDayList 来获取:
1 dateList := util.GetLatestWeekDayList(time.Sunday, 6 )
该函数的两个参数分别为你要去的星期,和你要获取多少个同星期的日子进行数据融合平均值。
我们是星期日去,所以第一个参数用的星期日 time.Sunday,第二个参数我取了最近6个周日的数据来做平均值。当然建议不要取太多这个网站获取数据的速度一言难进。
数据源我们取到后就开始获取策略数据了。
第二步:迪士尼策略优先级排行榜获取 1 sts := business.GenerateStrategy(got, myProjects)
myProjuects 是你想要去的玩的项目。可以自行调整,我已经吧中文名称对应注释写上了(有几个确实不知道是啥,我就直译了,你可以再改改)。
这个函数签名参数是过滤数据用的func(m map[string][]*model.WaitTimeData) {business.FilterTimeAfter(19, m)},这里我放入了一个封装 business.FilterTimeAfter 这个函数的逻辑是过滤掉晚上七点后的数据。你可以根据你的需要调整
注意: 这里必须注意的是我生成的这个策略最早时间只有八点,而买了早享票的你7点15估计就可以入园了。你要是牛逼七点之前就到了早享票一开门就冲进去的话直接冲小矮人或是地平线,到的很早就先冲地平线再冲小矮人,因为可以想象你如果是第一个入园的那么所有项目对你来说都不需要排队,那一定是冲最火的,而且你可以额基本5-10分钟完成这个这个最火的项目丝毫不影响下一个项目的进行逻辑。(我觉得那些up一定是假设你是第一个入园的然后才生成了他们的策略,基本不适用于你八点以后甚至七点半以后入园的你)
第三步:生成单个项目不同时间点等待时间排名 接下来是生成单个项目不同时间点等待时间排名
1 sortListGot, err := business.DescSortListData(got, dateList, myProjects, 50 )
这里的datelist,和 myProjects 参数和刚刚介绍的两个函数一致,都介绍过了,最后一个参数50,就是获取多少个时间点,我取了50就是获取50个时间点。
这个排行榜也是我认为最有用的,因为第一步生成的策略只是早享时间的游玩顺序可以根据他来策划其他时间的游玩顺序,你只要找这个项目排队时间最短的时刻去玩就好了,当然你要结合当前的等待数据,不要完全依赖这个排名榜单。
每天不同项目时间点等待时间是从这个网站 爬的。
注意 由于爬取速度很慢所以取得数据越多越慢,我上面这个例子取了六天的数据均值就差不多要30秒左右。需要耐心一些。