[+] 之前忘记把 bills 那道题解源码放进来了w

This commit is contained in:
Hykilpikonna
2021-05-16 22:51:09 +08:00
parent 885cee410d
commit 87f40532ea
2 changed files with 124 additions and 0 deletions
@@ -0,0 +1,86 @@
package org.hydev.experiment
import java.io.File
import kotlin.math.pow
/**
* TODO: Write a description for this class!
*
* @author HyDEV Team (https://github.com/HyDevelop)
* @author Hykilpikonna (https://github.com/hykilpikonna)
* @author Vanilla (https://github.com/VergeDX)
* @since 2020-10-31 21:30
*/
fun main(args: Array<String>)
{
val str = File("./bills.csv").readText().replace("\r\n", "\n")
var total = 0
str.split("\n").forEachIndexed { i, line ->
if (line.isEmpty()) return@forEachIndexed
try
{
val chinese = line.split(",")[0]
val count = line.split(",")[1].toInt()
total += chineseToNum(chinese) * count
}
catch (_: NumberFormatException) { }
}
println(total)
}
val chineseNumbers = listOf('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖')
val scientific = mapOf('拾' to 1, '佰' to 2, '仟' to 3, '万' to 4, '亿' to 8, '兆' to 12)
val units = mapOf('元' to 100, '角' to 10, '分' to 1)
fun chineseToNum(chinese: String): Int
{
var chinese = chinese
chineseNumbers.forEachIndexed { n, c -> chinese = chinese.replace(c.toString(), n.toString()) }
var amount = 0
var pendingAmount = 0
var digitAmount = 0
for (c in chinese) // 每个字符
{
// 是数字
if (c.isDigit())
{
// 处理中价格加上这个数
digitAmount += c.toString().toInt();
}
// 是个十百千万
else if (scientific.containsKey(c))
{
// 特殊情况: 十在前面不是单位而是 1x
if (c == '拾' && chinese.startsWith("")) pendingAmount = 10
// 处理中价格乘上 10^x
else
{
pendingAmount += digitAmount * 10.0.pow(scientific[c]!!).toInt()
digitAmount = 0
}
}
// 是单位
else if (units.containsKey(c))
{
// 结束处理, 添加, 重置
amount += pendingAmount * units[c]!! + digitAmount * units[c]!!
pendingAmount = 0
digitAmount = 0
}
else
{
println("Unknown: $c")
}
}
return amount
}
@@ -0,0 +1,38 @@
package org.hydev.experiment
import org.junit.Test
/**
* TODO: Write a description for this class!
*
* @author HyDEV Team (https://github.com/HyDevelop)
* @author Hykilpikonna (https://github.com/hykilpikonna)
* @author Vanilla (https://github.com/VergeDX)
* @since 2020-10-31 22:15
*/
class CtfBillsTests
{
@Test
fun test715()
{
test("柒元壹角伍分", 715)
}
@Test
fun test1046()
{
test("拾元肆角陆分", 1046)
}
@Test
fun test15573()
{
test("壹佰伍拾柒元柒角叁分", 15773)
}
fun test(s: String, i: Int)
{
print(chineseToNum(s))
assert(chineseToNum(s) == i)
}
}