AkiPolaris 发表于 2023-8-5 20:51:41

【蹭热度】AI绘图大赛计分小工具

本帖最后由 AkiPolaris 于 2023-8-5 20:56 编辑

众所周知,萝卜头的AI绘图大赛的排名、评分工作正在进行中,参赛选手一定想知道自己将会获得怎样的成绩。
大部分参赛选手都将自己的排名发布于投票贴中,因此各位坛友都可以计算选手们的分数。
虽然理论能算,但手算又有些繁琐,于是我编写了一个快速计算各位选手得分的小工具,让各位选手得以快速计算自己的得分及排位。(杠:可以用Excel)

工具用scala3编写,打包包括了scala环境,运行仅要求java环境(jre)。
当然,由于编写时间有限,同时适用范围极小,因此没有过多考虑非法输入,但只要按本次活动的排名规则输入,理论上不会出问题。


工具运行效果:
输入当前回帖中各参赛选手的排名


查看得分及排位


在运行过程中会在程序所在目录产生一个文件:rank.dat
里面记录的实际上就是各位参赛选手对作品的排名,因此理论上也可以直接填写该文件,再通过工具计算结果。
rank.dat文件大致长这个样子:



代码:
import scala.io.Source
import scala.io.StdIn.{readLine, readInt}
import collection.mutable.Map
import java.io._
import scala.compiletime.ops.string


def welcome() =
print("""萝卜头AI绘图大赛计分小工具
          |by AkiPolaris
          |
          |功能选择:「1」输入n条数据,每次都会进行初始化
          |          「2」计算结果,按得分从高到低排序
          |          「3」退出
""".stripMargin)

//计算排行榜
def getRanks() =
var mapRanks = Map()
for rank <- read_PlainText() do
    val aRank = getARank(rank)
    if mapRanks.isEmpty then
      mapRanks = aRank
    else
      mapRanks = mapRanks ++ aRank.map(t => t._1 -> (t._2 + mapRanks.getOrElse(t._1, 0)))
val seqRanks = mapRanks.toSeq.sortWith(_._2 > _._2)
for rank <- seqRanks do
    println(s"${rank._1} : ${rank._2}")
   
//计算某一次排名
def getARank(aRank: String) =
val mapARank = Map()
val len = aRank.length()
for i <- (0 to len-1) do
    mapARank(aRank.charAt(i)) = (len-i)
mapARank


//输入所有排名
def setRanks() =
val fw = FileWriter(File("./ranks.dat"),false)
fw.write("")
fw.flush()
fw.close()
println("初始化完成")
try
    println("接下来将输入多少行数据?")
    val times = readInt()
    for i <- 1 to times do
      println("请输入一行数据")
      setARank()
catch
    case nfe: NumberFormatException => println("请输入大于等于1的数字")

//写入一个排名
def setARank() =
write_PlainText(readLine().replaceAll(" ","").toUpperCase())

//读取文件
def read_PlainText() =
Source.fromFile("./ranks.dat").getLines()

//写入文件
def write_PlainText(rank: String) =
val writer = FileWriter(File("./ranks.dat"),true)
writer.write(rank+'\n')
writer.close()


@main def Main: Unit =
while true do   
    welcome()
    readLine() match
      case "1" => setRanks()
      case "2" => getRanks()
      case "3" => return
      case _ => println("无效命令,只接受输入1、2、3")


打包过程:


程序文件(jar):

爱电脑的昕宇 发表于 2023-8-11 21:25:14

顶一下,虽然我看不太懂
最后的几个case是用来简化if语句的吗,头一次知道Python里也有

jyssysz 发表于 2023-8-12 06:54:35

这个必须要顶起来,有需求才能有创作的动力。
小朋友们可以解决实际问题了,{:37:}

yangeryuner 发表于 2023-8-12 12:52:25

大佬!收下我的膝盖!{:37:}

AkiPolaris 发表于 2023-8-12 14:33:17

爱电脑的昕宇 发表于 2023-8-11 21:25
顶一下,虽然我看不太懂
最后的几个case是用来简化if语句的吗,头一次知道Python里也有 ...

不,这是scala3{:15:}
这种场景下用case比if else简单易读就是了
页: [1]
查看完整版本: 【蹭热度】AI绘图大赛计分小工具