本版
查看: 5233|回复: 4

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

[复制链接]

[Lv.7]特大萝卜

兴趣使然的鸽~

楼主(1#)
发表于 2023-8-5 20:51:41 | 只看该作者 |只看大图 |倒序浏览 |阅读模式
本帖最后由 AkiPolaris 于 2023-8-5 20:56 编辑

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

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


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


查看得分及排位


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



代码:
  1. 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[Char, Int]()
    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[Char, Int]()
    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):
lbt12thscorecompute-assembly-0.1.0-SNAPSHOT.jar
咕咕咕,博客向天鸽,
整活凭兴趣,知识不太多。
回复

支持 | 反对  0 支持 / 0 反对 评分 举报

[Lv.8]超级萝卜

沙发(2#)
发表于 2023-8-11 21:25:14 来自手机 | 只看该作者
顶一下,虽然我看不太懂
最后的几个case是用来简化if语句的吗,头一次知道Python里也有

Super Moderator

实习版主

板凳(3#)
发表于 2023-8-12 06:54:35 | 只看该作者
这个必须要顶起来,有需求才能有创作的动力。
小朋友们可以解决实际问题了,

[Lv.8]超级萝卜

躺平王者

地板(4#)
发表于 2023-8-12 12:52:25 | 只看该作者
大佬!收下我的膝盖!

[Lv.7]特大萝卜

兴趣使然的鸽~

5#
 楼主| 发表于 2023-8-12 14:33:17 来自手机 | 只看该作者
爱电脑的昕宇 发表于 2023-8-11 21:25
顶一下,虽然我看不太懂
最后的几个case是用来简化if语句的吗,头一次知道Python里也有 ...

不,这是scala3
这种场景下用case比if else简单易读就是了

联系我们(Contact)|手机版|萝卜头IT论坛 ( 苏ICP备15050961号-1 )

GMT+8, 2026-10-23 02:50 , Processed in 0.07 second(s), 20 queries , Gzip On.

快速回复 返回顶部 返回列表