Re: [请问] 树状资料 阶层资料 整理方式...吧?

楼主: drm343 (一卡)   2022-02-15 21:45:08
※ 引述《kindyayaya (Auto魂)》之铭言
: ※ [本文转录自 ask 看板 #1Y1mWKb5 ]
: 作者: kindyayaya (Auto魂) 看板: ask
: 标题: [请问] 树状资料整理方式...吧?
口卡口卡吃光光
: ps.合成范例如下
: 死亡之浪(目标)=大爆发+瘟疫喷洒器+瘟疫
: 大爆发=魔法齿轮+火箭炸弹+流星雨
: 火箭炸弹=爆发之箭+同时射击
: 爆发之箭=魔法齿轮+弩+爆发
: 弩=箭+投石器
: 投石器=箭+巨大化
: 同时射击=箭+箭
: 流星雨=陨石+同时射击+爆发
: 陨石=爆发+焚烧+落石
: 同时射击=箭+箭
: 黄字为底材,这样完成1/3,后面两个设施就不打了
: 到底我要几支箭几个齿轮阿 崩溃(T_T)
原文恕删
先补一下程式网址
https://reurl.cc/5Gb1Ov
前几天看到这篇,不过没时间回
这问题我拆成两部分
第一个部分是找零钱,基础材料就是可以用的零钱种类
但是零钱不够必须换成特定几种种类才有办法找开
总之这问题可以把全部的合成公式转换成
total = a1 * n1 + a2 * n2 +...
第二部分,撇开需要的数量这点,单纯看合成公式
可以把这问题看成亲子血缘图
这部分最好用的就是 prolog 了,可以用这来表达关系
合成目标是父母,合成材料是小孩
于是每一条公式都可以拆解成
formula(total, a1, n1)
formula(total, a2, n2)...
在拆解完问题后,我们得到合成公式的关系表
接下来就可以查表解问题了
这边我选择用 minikanren
由于 formula 只能找出亲子这一层,我需要动态产生
祖父母或更上层关系的查询函数
composite_items 就是用来查询用的函数,后面简称 f
第一个参数是合成目标
第二个参数是合成材料
第三个参数是材料数量
完成之后你可以正向查找,也可以反向查找
run 这个函数第一个参数不用管,直接填 0 就好
第二个参数是想知道的结果,例如说箭可以合成什么,
或是材料的总量等等
第三个开始的参数就是查询函数
比方说我想知道箭可以做什么,我参数只要带一个
f(q, "箭", Var())
之后就能知道箭可以合成什么
# 第 92 行开始
想知道箭可以合成四层内的什么道具,就在 f 里面加入 max_count = 4 就可以了
最后原 po 的问题答案在 99 行那边
f("死亡之浪", q, v, max_count =10)
base_item(q)
第一个会函数会告诉你死亡之浪需要哪些素材跟数量
第二个函数只会保留基本素材
之后计算总和就完成了
补充,这个我没写在上面
你只要问
f(q, "箭", Var())
f(q, "投石器", Var())
它就会告诉你这两个材料可以合出什么了
原 po 有问想知道问题的关键字,给你参考
prolog、logic programming、minikanren
以上
作者: spfy (spfy)   2022-02-15 21:50:00
不是 现在下班了欸
作者: HHH555JJJ (皕R实验)   2022-02-15 22:14:00
呜…头好痛
作者: guolong (+9吼溜肯)   2022-02-15 22:21:00
你这样比996还血汗了
作者: Leo123457   2022-02-15 23:35:00
知道了好多新东西

Links booklink

Contact Us: admin [ a t ] ucptt.com