- 积分
- 1518
- 帖子
- 主题
- 精华
贡献- 份
爱心- 心
- 钻石
- 颗
- 人气
- 点
- 下界之星
- 枚
- 最后登录
- 1970-1-1
- 注册时间
- 2016-1-29
来自:浙江 | 本帖最后由 I_am_god_Father 于 2023-1-4 12:10 编辑
我有强迫症我做合成一个东西的时候材料必须是正好的,就比如说格雷6的黑沙炼铁,新版黑沙含的磁铁矿更多了怎么都算不出在一锅里投放的合适的比例我身上有蚂蚁在爬,因为NEI说磁铁矿:碳=14:3,煤炭:碳=1:2,黑沙:磁铁矿=1:9,然而我只有磁铁矿和煤,我想算一个比例让我炼铁的时候反应物被完全消耗并且炼出来的铁是整数个就不太好算。 昨天炼铝更是忍无可忍,铝有如下合成关联关系: //3碳+10氧化铝+4氟化铝+2冰晶石=4铝 //2煤炭=1碳 //5氧化铝+9000六氟硅酸=1152氟化铝 //1石英+4000氟化氢=3000六氟硅酸 //3氟石+7000硫酸=4000氟化氢 //1000三氧化硫+750蒸馏水=1750硫酸 //3石英+6硫酸钙=4000三氧化硫 //1石膏=1硫酸钙 //4石膏矿石=5石膏 //18氢氧化钠+5氧化铝+24000氟化氢=2880冰晶石 //4盐+12000蒸馏水=6氢氧化钠
//...... 最后我不得不向恶势力低头,选择乱炼不在计算比例
但是今天越想越气,想到之后还需要炼钛,钨,钽之类的矿我身上有Long.MAX_VALUE^Long.MAX_VALUE只蚂蚁再爬 于是就写了一个比例♂计算器 下面是运行效果:

直接给我把所有比例全部算好,想用哪个就用哪个,这么好用的东西当然要分享给你们
首先是jar包:
下面是源代码:- package radio
- import scala.annotation.tailrec
- import scala.collection.mutable
- import scala.io.StdIn
- /**
- * [url=home.php?mod=space&uid=1231151]@author[/url] box
- * [url=home.php?mod=space&uid=317349]@Since[/url] 2022/1/3 16:36
- */
- object RadioCalculator {
- def main(args: Array[String]): Unit = {
- val mutableInputSet : mutable.Set[String] = mutable.Set()
- @tailrec def loopInput: Any = {
- println("请输入原始比例,输入end结束")
- val in = StdIn.readLine()
- if (in.equals("end"))
- return
- else
- mutableInputSet.add(in)
- loopInput
- }
- loopInput
- val calculatorEntityList = parseCalculatorEntity(mutableInputSet.toList)
- val flatTargetItem = calculatorEntityList.flatMap(_.out.map(_.item))
- println(s"可以进行比例计算的物品有:${flatTargetItem.mkString(",")}")
- def getCalculatorEntity(target: String): List[CalculatorEntity] = calculatorEntityList.filter(_.out.map(_.item).contains(target))
- def getMultiItemInCalculatorEntity(o: CalculatorEntity, itemName: String): MultiItem = (o.src ++ o.out).filter(o => o.item.equals(itemName)).head
- def combineAndBuildBalancedCalculatorEntity(splitItem: MultiItem, calculatorEntity: CalculatorEntity): CalculatorEntity = {
- val splintedCalculatorEntity = getCalculatorEntity(splitItem.item).head
- def multi(item: CalculatorEntity, count: Int) = CalculatorEntity(
- item.src.map(o => MultiItem(o.item, o.count * count)),
- item.out.map(o => MultiItem(o.item, o.count * count)))
- val multiplicativeEntity = multi(calculatorEntity, getMultiItemInCalculatorEntity(splintedCalculatorEntity, splitItem.item).count)
- val multiNumber: Int = getMultiItemInCalculatorEntity(multiplicativeEntity, splitItem.item).count / getMultiItemInCalculatorEntity(splintedCalculatorEntity, splitItem.item).count
- val comb = multi(splintedCalculatorEntity, multiNumber)
- CalculatorEntity(comb.src ++ multiplicativeEntity.src.filter(_.item != splitItem.item), multiplicativeEntity.out)
- }
- def simplifyCalculate(oldEntity: CalculatorEntity): CalculatorEntity = {
- val calculatorEntity = CalculatorEntity(oldEntity.src.groupBy(o => o.item).map(option => MultiItem(option._1, option._2.map(o => o.count).sum)).toList,
- oldEntity.out.groupBy(o => o.item).map(option => MultiItem(option._1, option._2.map(o => o.count).sum)).toList)
- val numList: List[Int] = (calculatorEntity.out ++ calculatorEntity.src).map(o => o.count)
- val max = numList.max / 2 + 1
- @tailrec def findNextCalculatorEntity(now: Int): CalculatorEntity = {
- if (!numList.exists(_ % now != 0))
- CalculatorEntity(calculatorEntity.src.map(o => MultiItem(o.item, o.count / now)), calculatorEntity.out.map(o => MultiItem(o.item, o.count / now)))
- else
- findNextCalculatorEntity(now - 1)
- }
- findNextCalculatorEntity(max)
- }
- val cache: mutable.Set[CalculatorEntity] = new mutable.HashSet[CalculatorEntity]()
- @tailrec def calculate: Any = {
- println("请输入需要进行计算的物品:")
- val in = StdIn.readLine()
- def getNextCraft(nowCalculatorEntity: CalculatorEntity): Any = {
- val simplifyCalculatorEntity: CalculatorEntity = simplifyCalculate(nowCalculatorEntity)
- if (cache.contains(simplifyCalculatorEntity)){
- return
- }else {
- cache.add(simplifyCalculatorEntity)
- }
- println(s"${simplifyCalculatorEntity.src.mkString("+")} = ${simplifyCalculatorEntity.out.mkString("+")}")
- simplifyCalculatorEntity.src.filter(o => getCalculatorEntity(o.item).nonEmpty)
- .foreach(o => getNextCraft(combineAndBuildBalancedCalculatorEntity(o, simplifyCalculatorEntity)))
- }
- getNextCraft(getCalculatorEntity(in).head)
- calculate
- }
- calculate
- }
- def parseCalculatorEntity(src: List[String]): List[CalculatorEntity] = {
- src.map(o => {
- val strings = o.split("=")
- if (strings.length != 2) throw new RuntimeException
- def splitParticle(string: String): List[MultiItem] = string
- .split("[+]")
- .map(o => MultiItem(o.substring("[0-9]+".r.findFirstIn(o).get.length), "[0-9]+".r.findFirstIn(o).get.toInt))
- .toList
- CalculatorEntity(splitParticle(strings(0)), splitParticle(strings(1)))
- })
- }
- }
- case class CalculatorEntity(src: List[MultiItem], out: List[MultiItem])
- case class MultiItem(item: String, count: Int) {
- override def toString: String = s"$count$item"
- }
复制代码
package radio
import scala.annotation.tailrec import scala.collection.mutable import scala.io.StdIn
/** * @author box * @since 2022/1/3 16:36 */ object RadioCalculator { def main(args: Array[String]): Unit = { val mutableInputSet : mutable.Set[String] = mutable.Set() @tailrec def loopInput: Any = { println("请输入原始比例,输入end结束") val in = StdIn.readLine() if (in.equals("end")) return else mutableInputSet.add(in) loopInput } loopInput val calculatorEntityList = parseCalculatorEntity(mutableInputSet.toList) val flatTargetItem = calculatorEntityList.flatMap(_.out.map(_.item)) println(s"可以进行比例计算的物品有:${flatTargetItem.mkString(",")}") def getCalculatorEntity(target: String): List[CalculatorEntity] = calculatorEntityList.filter(_.out.map(_.item).contains(target)) def getMultiItemInCalculatorEntity(o: CalculatorEntity, itemName: String): MultiItem = (o.src ++ o.out).filter(o => o.item.equals(itemName)).head def combineAndBuildBalancedCalculatorEntity(splitItem: MultiItem, calculatorEntity: CalculatorEntity): CalculatorEntity = { val splintedCalculatorEntity = getCalculatorEntity(splitItem.item).head def multi(item: CalculatorEntity, count: Int) = CalculatorEntity( item.src.map(o => MultiItem(o.item, o.count * count)), item.out.map(o => MultiItem(o.item, o.count * count))) val multiplicativeEntity = multi(calculatorEntity, getMultiItemInCalculatorEntity(splintedCalculatorEntity, splitItem.item).count) val multiNumber: Int = getMultiItemInCalculatorEntity(multiplicativeEntity, splitItem.item).count / getMultiItemInCalculatorEntity(splintedCalculatorEntity, splitItem.item).count val comb = multi(splintedCalculatorEntity, multiNumber) CalculatorEntity(comb.src ++ multiplicativeEntity.src.filter(_.item != splitItem.item), multiplicativeEntity.out) } def simplifyCalculate(oldEntity: CalculatorEntity): CalculatorEntity = { val calculatorEntity = CalculatorEntity(oldEntity.src.groupBy(o => o.item).map(option => MultiItem(option._1, option._2.map(o => o.count).sum)).toList, oldEntity.out.groupBy(o => o.item).map(option => MultiItem(option._1, option._2.map(o => o.count).sum)).toList) val numList: List[Int] = (calculatorEntity.out ++ calculatorEntity.src).map(o => o.count) val max = numList.max / 2 + 1 @tailrec def findNextCalculatorEntity(now: Int): CalculatorEntity = { if (!numList.exists(_ % now != 0)) CalculatorEntity(calculatorEntity.src.map(o => MultiItem(o.item, o.count / now)), calculatorEntity.out.map(o => MultiItem(o.item, o.count / now))) else findNextCalculatorEntity(now - 1) } findNextCalculatorEntity(max) }
val cache: mutable.Set[CalculatorEntity] = new mutable.HashSet[CalculatorEntity]() @tailrec def calculate: Any = { println("请输入需要进行计算的物品:") val in = StdIn.readLine()
def getNextCraft(nowCalculatorEntity: CalculatorEntity): Any = { val simplifyCalculatorEntity: CalculatorEntity = simplifyCalculate(nowCalculatorEntity) if (cache.contains(simplifyCalculatorEntity)){ return }else { cache.add(simplifyCalculatorEntity) } println(s"${simplifyCalculatorEntity.src.mkString("+")} = ${simplifyCalculatorEntity.out.mkString("+")}") simplifyCalculatorEntity.src.filter(o => getCalculatorEntity(o.item).nonEmpty) .foreach(o => getNextCraft(combineAndBuildBalancedCalculatorEntity(o, simplifyCalculatorEntity))) } getNextCraft(getCalculatorEntity(in).head) calculate } calculate } def parseCalculatorEntity(src: List[String]): List[CalculatorEntity] = { src.map(o => { val strings = o.split("=") if (strings.length != 2) throw new RuntimeException def splitParticle(string: String): List[MultiItem] = string .split("[+]") .map(o => MultiItem(o.substring("[0-9]+".r.findFirstIn(o).get.length), "[0-9]+".r.findFirstIn(o).get.toInt)) .toList CalculatorEntity(splitParticle(strings(0)), splitParticle(strings(1))) }) }
}
case class CalculatorEntity(src: List[MultiItem], out: List[MultiItem])
case class MultiItem(item: String, count: Int) { override def toString: String = s"$count$item" }
|
|