萝卜头IT论坛

搜索
查看: 880|回复: 4
收起左侧

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

[复制链接]
发表于 2023-8-5 20:51:41 | 显示全部楼层 |阅读模式
本帖最后由 AkiPolaris 于 2023-8-5 20:56 编辑

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

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


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

截图 2023-08-05 20-38-05.png
查看得分及排位
截图 2023-08-05 20-38-20.png

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

截图 2023-08-05 20-39-09.png

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


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

  14. //计算排行榜
  15. def getRanks() =
  16.   var mapRanks = Map[Char, Int]()
  17.   for rank <- read_PlainText() do
  18.     val aRank = getARank(rank)
  19.     if mapRanks.isEmpty then
  20.       mapRanks = aRank
  21.     else
  22.       mapRanks = mapRanks ++ aRank.map(t => t._1 -> (t._2 + mapRanks.getOrElse(t._1, 0)))
  23.   val seqRanks = mapRanks.toSeq.sortWith(_._2 > _._2)
  24.   for rank <- seqRanks do
  25.     println(s"${rank._1} : ${rank._2}")
  26.    
  27. //计算某一次排名
  28. def getARank(aRank: String) =
  29.   val mapARank = Map[Char, Int]()
  30.   val len = aRank.length()
  31.   for i <- (0 to len-1) do
  32.     mapARank(aRank.charAt(i)) = (len-i)
  33.   mapARank
  34.   

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

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

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

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


  61. @main def Main: Unit =
  62.   while true do   
  63.     welcome()
  64.     readLine() match
  65.       case "1" => setRanks()
  66.       case "2" => getRanks()
  67.       case "3" => return
  68.       case _ => println("无效命令,只接受输入1、2、3")
  69.   
复制代码

打包过程:
截图 2023-08-05 20-36-19.png

程序文件(jar):
lbt12thscorecompute-assembly-0.1.0-SNAPSHOT.jar (6.88 MB, 下载次数: 50)
回复

使用道具 举报

发表于 2023-8-11 21:25:14 来自手机 | 显示全部楼层
顶一下,虽然我看不太懂
最后的几个case是用来简化if语句的吗,头一次知道Python里也有
回复

使用道具 举报

发表于 2023-8-12 06:54:35 | 显示全部楼层
这个必须要顶起来,有需求才能有创作的动力。
小朋友们可以解决实际问题了,
回复

使用道具 举报

发表于 2023-8-12 12:52:25 | 显示全部楼层
大佬!收下我的膝盖!
回复

使用道具 举报

 楼主| 发表于 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, 2024-4-28 17:11 , Processed in 0.103727 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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