Guest User

Untitled

a guest
Oct 10th, 2019
208
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand"
  6. )
  7.  
  8. // Seed each player 0 through 15
  9. // Play round 1 and advance winners to round 2
  10. // Repeat until you have a winner in round 4
  11. // Count the number of times each player ended in each top 2 spots.
  12. // How to seed?
  13. // First tournament is seeded in no particular order.
  14. // Next tournament is seeded based on results of last tournament, ties broken by coin flip.
  15. // Finals are best of 5, the rest best of 3
  16.  
  17. func main() {
  18. ratings := getRatings()
  19. names := getNames()
  20. initSeed := make([]string, 0)
  21. for player := range ratings {
  22. initSeed = append(initSeed, player)
  23. }
  24. wins := make(map[string][]int64) // 1st and 2nd place finishes
  25. for player := range ratings {
  26. wins[player] = []int64{0, 0}
  27. }
  28. seeds := getTournamentResults(ratings, initSeed)
  29.  
  30. // Simulation
  31. for i := 1; true; i++ {
  32. results := getTournamentResults(ratings, seeds)
  33. wins[results[0]][0]++
  34. wins[results[1]][1]++
  35. if i%100000 == 0 {
  36. fmt.Println("Iteration ", i)
  37. for _, name := range names {
  38. fmt.Printf("%.6f %.6f %v\n", float64(wins[name][0])/float64(i), float64(wins[name][1])/float64(i), name)
  39. }
  40. }
  41. seeds = results
  42. }
  43. }
  44.  
  45. func getTournamentResults(ratings map[string]float64, seeds []string) []string {
  46. results := make([]string, len(ratings))
  47. rankIndex := len(results) - 1
  48. // Round 1
  49. round2Contestants := make([]string, 0)
  50. playAndPlace(0, 15, 3, ratings, seeds, &rankIndex, &round2Contestants, &results)
  51. playAndPlace(1, 14, 3, ratings, seeds, &rankIndex, &round2Contestants, &results)
  52. playAndPlace(2, 13, 3, ratings, seeds, &rankIndex, &round2Contestants, &results)
  53. playAndPlace(3, 12, 3, ratings, seeds, &rankIndex, &round2Contestants, &results)
  54. playAndPlace(4, 11, 3, ratings, seeds, &rankIndex, &round2Contestants, &results)
  55. playAndPlace(5, 10, 3, ratings, seeds, &rankIndex, &round2Contestants, &results)
  56. playAndPlace(6, 9, 3, ratings, seeds, &rankIndex, &round2Contestants, &results)
  57. playAndPlace(7, 8, 3, ratings, seeds, &rankIndex, &round2Contestants, &results)
  58. // Round 2
  59. round3Contestants := make([]string, 0)
  60. playAndPlace(0, 1, 5, ratings, round2Contestants, &rankIndex, &round3Contestants, &results)
  61. playAndPlace(2, 3, 5, ratings, round2Contestants, &rankIndex, &round3Contestants, &results)
  62. playAndPlace(4, 5, 5, ratings, round2Contestants, &rankIndex, &round3Contestants, &results)
  63. playAndPlace(6, 7, 5, ratings, round2Contestants, &rankIndex, &round3Contestants, &results)
  64. // Round 3
  65. round4Contestants := make([]string, 0)
  66. playAndPlace(0, 1, 5, ratings, round3Contestants, &rankIndex, &round4Contestants, &results)
  67. playAndPlace(2, 3, 5, ratings, round3Contestants, &rankIndex, &round4Contestants, &results)
  68. // Round 4
  69. winner := make([]string, 0)
  70. playAndPlace(0, 1, 5, ratings, round4Contestants, &rankIndex, &winner, &results)
  71. results[0] = winner[0]
  72. return results
  73. }
  74.  
  75. func playAndPlace(seedA, seedB, numGames int, ratings map[string]float64, seeds []string, rankIndex *int, nextRoundContestants *[]string, results *[]string) {
  76. if wonMatch(numGames, ratings[seeds[seedA]], ratings[seeds[seedB]]) {
  77. // fmt.Printf("%v beat %v\n", seeds[seedA], seeds[seedB])
  78. *nextRoundContestants = append(*nextRoundContestants, seeds[seedA])
  79. (*results)[*rankIndex] = seeds[seedB]
  80. } else {
  81. *nextRoundContestants = append(*nextRoundContestants, seeds[seedB])
  82. (*results)[*rankIndex] = seeds[seedA]
  83. // fmt.Printf("%v beat %v\n", seeds[seedB], seeds[seedA])
  84. }
  85. *rankIndex--
  86. }
  87.  
  88. // Returns true if player a beats player b in a match of n games
  89. func wonMatch(n int, a, b float64) bool {
  90. var wins int
  91. for i := 0; i < n; i++ {
  92. if getWin(a, b) {
  93. wins++
  94. }
  95. }
  96. return wins > n/2
  97. }
  98.  
  99. // The true if a defeats b, based on their elo difference
  100. func getWin(a, b float64) bool {
  101. chance := a / (a + b)
  102. return chance >= rand.Float64()
  103. }
  104.  
  105. func getRatings() map[string]float64 {
  106. return map[string]float64{
  107. "Joseph_S": 583.6006,
  108. "Jonas_N": 506.0191,
  109. "Green_T": 413.6078,
  110. "Harry_H": 396.8535,
  111. "Koryan": 387.0532,
  112. "DanQZ": 357.6342,
  113. "Alex_K": 314.4253,
  114. "Quaid": 302.3414,
  115. "Svavar_G": 272.5940,
  116. "Eli_M": 263.8913,
  117. "Noztrom": 249.9731,
  118. "Jeff_M": 232.0740,
  119. "Matt_B": 229.9798,
  120. "Bo_S": 192.5092,
  121. "Beastinshen": 188.4295,
  122. "Shakil_A": 180.4603,
  123. }
  124. }
  125.  
  126. func getNames() []string {
  127. return []string{
  128. "Joseph_S",
  129. "Jonas_N",
  130. "Green_T",
  131. "Harry_H",
  132. "Koryan",
  133. "DanQZ",
  134. "Alex_K",
  135. "Quaid",
  136. "Svavar_G",
  137. "Eli_M",
  138. "Noztrom",
  139. "Jeff_M",
  140. "Matt_B",
  141. "Bo_S",
  142. "Beastinshen",
  143. "Shakil_A",
  144. }
  145. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×