Advertisement
tomdodd4598

Untitled

Aug 12th, 2023
1,669
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 5.80 KB | None | 0 0
  1. typealias Ball = Pair<Int, Boolean>
  2.  
  3. val whitespaceRegex = Regex("\\s+")
  4.  
  5. fun mod(x: Int, y: Int) = (x % y + y) % y
  6.  
  7. fun String.hash() = fold(5381) { acc, x -> 127 * (acc and 0x00FFFFFF) + x.code }
  8.  
  9. fun String.filtered() = codePoints().filter{ it !in 0xFE00..0xFE0F }
  10.  
  11. class Team(coach: String, val name: String, players: List<String>) {
  12.  
  13.     val coachUpper = coach.uppercase()
  14.     val nameUpper = name.uppercase()
  15.  
  16.     val players = mutableListOf<String>()
  17.     private val playersLast = mutableListOf<String>()
  18.  
  19.     private val bowl = mutableListOf<Int>()
  20.     private val wk = mutableListOf<Int>()
  21.  
  22.     private val uuid = (coach + name).hash()
  23.  
  24.     init {
  25.         for (i in 0 until 11) {
  26.             val player = players[i]
  27.             var isWk = false
  28.             var last = ""
  29.             val split = player.split(whitespaceRegex)
  30.             for (word in split.asReversed()) {
  31.                 val lower = word.lowercase()
  32.                 if (lower == "(wk)" || lower == "[wk]" || lower == "{wk}") {
  33.                     isWk = true
  34.                 }
  35.                 else if (lower != "(c)" && lower != "[c]" && lower != "{c}") {
  36.                     last = word
  37.                     break
  38.                 }
  39.             }
  40.             this.players.add(player)
  41.             this.playersLast.add(last)
  42.             if (isWk) {
  43.                 this.wk.add(i)
  44.             }
  45.             else if (i - wk.size > 5) {
  46.                 this.bowl.add(i)
  47.             }
  48.         }
  49.     }
  50.  
  51.     fun bowler(count: Int): String {
  52.         val test = (count / 6) * this.uuid
  53.         if (test % 8 == 0) {
  54.             val index = mod(test, 11)
  55.             if (!this.wk.contains(index)) {
  56.                 return this.playersLast[index]
  57.             }
  58.         }
  59.         return this.playersLast[this.bowl[mod(test, this.bowl.size)]]
  60.     }
  61. }
  62.  
  63. fun main() {
  64.     fun parseTeam(): Team {
  65.         val coach = readln()
  66.         val name = readln()
  67.         readln()
  68.         val players = (0 until 11).map { readln() }
  69.         readln()
  70.         return Team(coach, name, players)
  71.     }
  72.  
  73.     fun runsStr(runs: Int) = if (runs == 0) "๐Ÿฆ†" else runs.toString()
  74.  
  75.     val teams = arrayOf(parseTeam(), parseTeam())
  76.     val teamRuns = arrayOf(0, 0)
  77.  
  78.     val toss = readln().toInt() - 1
  79.     var batting: Int
  80.     val line = readln().lowercase()
  81.     batting = if (line == "bat" || line == "batting") toss else 1 - toss
  82.     readln()
  83.  
  84.     fun bowling() = 1 - batting
  85.  
  86.     var count = 6 * 123456789
  87.  
  88.     var batterRuns = 0
  89.     var batterBalls = 0
  90.     var totalRuns = 0
  91.     var totalWickets = 0
  92.     var wicket: Boolean
  93.     var innings = 1
  94.     var target = 0
  95.  
  96.     fun runPl(runs: Int) = if (runs == 1) "$runs RUN" else "$runs RUNS"
  97.  
  98.     fun wicketPl(wickets: Int) = if (wickets == 1) "$wickets WICKET" else "$wickets WICKETS"
  99.  
  100.     fun batter() = teams[batting].players[totalWickets]
  101.  
  102.     fun bowler() = teams[bowling()].bowler(count)
  103.  
  104.     fun printBatter(out: Boolean) {
  105.         if (out) {
  106.             println("${batter()} ${runsStr(batterRuns)} (${bowler()})")
  107.         }
  108.         else {
  109.             println("${batter()} $batterRuns n/o")
  110.         }
  111.     }
  112.  
  113.     fun printCurrentInnings() {
  114.         printBatter(false)
  115.         for (i in 1 + totalWickets until 11) {
  116.             println(teams[batting].players[i])
  117.         }
  118.         println("\n$totalRuns/$totalWickets\n")
  119.     }
  120.  
  121.     val ballDict = mutableMapOf<Int, Ball>()
  122.  
  123.     fun putBall(value: Ball, str: String) {
  124.         for (code in str.filtered()) {
  125.             ballDict[code] = value
  126.         }
  127.     }
  128.  
  129.     val gone = Ball(0, true)
  130.     val dot = Ball(0, false)
  131.     val one = Ball(1, false)
  132.     val two = Ball(2, false)
  133.     val three = Ball(3, false)
  134.     val four = Ball(4, false)
  135.     val five = Ball(5, false)
  136.     val six = Ball(6, false)
  137.  
  138.     putBall(gone, "!โค๏ธ๐Ÿ”ด๐ŸŸฅ")
  139.     putBall(dot, "0๐Ÿ–คโšซ๏ธโฌ›๏ธโšซโฌ›")
  140.     putBall(one, "1๐Ÿคโšช๏ธโฌœ๏ธโšชโฌœ")
  141.     putBall(two, "2๐Ÿ’š๐ŸŸข๐ŸŸฉ")
  142.     putBall(three, "3๐Ÿงก๐ŸŸ ๐ŸŸง")
  143.     putBall(four, "4๐Ÿ’™๐Ÿ”ต๐ŸŸฆ")
  144.     putBall(five, "5๐Ÿ’œ๐ŸŸฃ๐ŸŸช")
  145.     putBall(six, "6๐Ÿ’›๐ŸŸก๐ŸŸจ")
  146.  
  147.     fun otherBall() = five
  148.  
  149.     fun carBall(code: Int) = ballDict.getOrDefault(code, otherBall())
  150.  
  151.     val cars = readln()
  152.  
  153.     println("${teams[0].coachUpper} VS ${teams[1].coachUpper} TEST\n")
  154.  
  155.     println("${teams[0].nameUpper}\nvs\n${teams[1].nameUpper}\n")
  156.  
  157.     val decision = if (toss == batting) "bat" else "bowl"
  158.     println("${teams[toss].name} won the toss and chose to $decision\n")
  159.  
  160.     println("1ST INNINGS\n")
  161.  
  162.     for (car in cars.filtered()) {
  163.         count += 1
  164.         val (r, w) = carBall(car)
  165.         batterRuns += r
  166.         batterBalls += 1
  167.         totalRuns += r
  168.         teamRuns[batting] += r
  169.         wicket = w
  170.         if (wicket) {
  171.             printBatter(true)
  172.             batterRuns = 0
  173.             batterBalls = 0
  174.             totalWickets += 1
  175.             if (totalWickets > 10) {
  176.                 println("\n$totalRuns/$totalWickets\n")
  177.                 batting = bowling()
  178.                 totalRuns = 0
  179.                 totalWickets = 0
  180.                 innings += 1
  181.                 if (innings == 3) {
  182.                     val lead = teamRuns[0] - teamRuns[1]
  183.                     if (lead == 0) {
  184.                         println("SCORES LEVEL")
  185.                     }
  186.                     else {
  187.                         val leading = if (lead > 0) 0 else 1
  188.                         println("${teams[leading].nameUpper} LEAD BY ${runPl(lead.absoluteValue)}\n")
  189.                     }
  190.                     println("2ND INNINGS\n")
  191.                 }
  192.                 else if (innings == 4) {
  193.                     val deficit = teamRuns[bowling()] - teamRuns[batting]
  194.                     if (deficit < 0) {
  195.                         println("${teams[batting].nameUpper} WIN BY AN INNINGS AND ${runPl(-deficit)}")
  196.                         return
  197.                     }
  198.                     else {
  199.                         target = 1 + deficit
  200.                         println("${teams[batting].nameUpper} NEED ${runPl(target)} TO WIN\n")
  201.                     }
  202.                 }
  203.                 else if (innings > 4) {
  204.                     val lead = teamRuns[batting] - teamRuns[bowling()]
  205.                     if (lead == 0) {
  206.                         println("MATCH TIED\n")
  207.                     }
  208.                     else {
  209.                         println("${teams[batting].nameUpper} WIN BY ${runPl(lead)}\n")
  210.                     }
  211.                     return
  212.                 }
  213.             }
  214.         }
  215.         else if (innings == 4 && totalRuns >= target) {
  216.             printCurrentInnings()
  217.             println("${teams[batting].nameUpper} WIN BY ${wicketPl(11 - totalWickets)}")
  218.             return
  219.         }
  220.     }
  221.  
  222.     printCurrentInnings()
  223.  
  224.     val lead = teamRuns[batting] - teamRuns[bowling()]
  225.     if (innings == 4) {
  226.         println("${teams[batting].nameUpper} NEED ${runPl(1 - lead)} TO WIN")
  227.     }
  228.     else {
  229.         if (lead == 0) {
  230.             println("SCORES LEVEL")
  231.         }
  232.         else {
  233.             val leading = if (lead > 0) batting else bowling()
  234.             println("${teams[leading].nameUpper} LEAD BY ${runPl(lead.absoluteValue)}")
  235.         }
  236.     }
  237. }
  238.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement