Skip to main content
Code Review

Return to Question

clarify constructor
Source Link

Edit on constructor: The constructor splits the input string along the spl val and puts the first element into delim. For the rest, if the first character isn't : (meaning the input isn't Discord Emoji), the elements are sorted by length alone before being padded with spaces so 1. all elements are of the same length 2. all elements have a trailing space. Then, the header is initialized with the first 5 elements of the Column enum using the same padding conditions. For Discord Emoji input, the header is initialized similarly but with regional indicators.

Edit on constructor: The constructor splits the input string along the spl val and puts the first element into delim. For the rest, if the first character isn't : (meaning the input isn't Discord Emoji), the elements are sorted by length alone before being padded with spaces so 1. all elements are of the same length 2. all elements have a trailing space. Then, the header is initialized with the first 5 elements of the Column enum using the same padding conditions. For Discord Emoji input, the header is initialized similarly but with regional indicators.

fix a bug i spotted
Source Link
import kotlin.random.Random
class Bingo() {
 var num = (1..75).map { if (it < 10) " $it " else "$it " }
 var cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 var delim = " ∅ "
 var max = 2
 var header = "B I N G O"
 enum class Column {
 B,
 I,
 N,
 G,
 O,
 Empty
 }
 /**
 * It is expected that the number of elements ≥ 25 and is divisible by 5
 */
 constructor(nums: String, spl: Char) : this() {
 val rem = nums.substringAfter(spl).split(spl).toMutableList()
 while (rem.contains("")) rem.remove("")
 do rem.remove(rem.random()) while (rem.size % 5 != 0) rem.remove(rem.random())
 if (rem.size < 25) return
 num = rem; delim = nums.substringBefore(spl)
 if (num[0][0] != ':') {
 num = num.sortedBy { it.length }.toMutableList()
 max = num.last().length
 num = num.map { " ".repeat(max - it.length) + it + " " }
 delim = " ".repeat(max - delim.length) + delim + " "
 header = ""
 for (i in (0..4)) header += "" + Column.values()[i] + " ".repeat(max)
 } else {
 header = ":regional_indicator_" + Column.values()[0].toString().lowercase()
 //Reg. indicators often turn into flags without spaces
 for (i in (1..4)) header += " :regional_indicator_" + Column.values()[i].toString().lowercase()
 }
 cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 }
 constructor(nums: String): this(nums, '@')
 fun card(): Array<Array<String>> {
 val ret = Array(5) { Array(5) { "" } }
 var index: Int
 val done = mutableListOf<Int>()
 for (i in (1..5))
 for (j in (1..5)) {
 if (i == j && j == 3) {
 ret[2][2] = delim
 continue
 }
 do {
 index = Random.nextInt(num.size / 5 * (j - 1), num.size / 5 * j)
 } while (done.contains(index))
 ret[i - 1][j - 1] = num[index]
 done.add(index)
 }
 return ret
 }
 fun call(): Pair<Column, String> {
 if (cur.isEmpty()) return Pair(Column.Empty, "")
 var index: Int
 do index = Random.nextInt(num.size) while (cur[index] == null)
 val list = cur[index]!!.trim()
 cur.remove(index)
 return Pair(Column.values()[index / (num.size / 5)], list)
 }
}
```
import kotlin.random.Random
class Bingo() {
 var num = (1..75).map { if (it < 10) " $it " else "$it " }
 var cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 var delim = " ∅ "
 var max = 2
 var header = "B I N G O"
 enum class Column {
 B,
 I,
 N,
 G,
 O,
 Empty
 }
 /**
 * It is expected that the number of elements ≥ 25 and is divisible by 5
 */
 constructor(nums: String, spl: Char) : this() {
 val rem = nums.substringAfter(spl).split(spl).toMutableList()
 while (rem.contains("")) rem.remove("")
 do rem.remove(rem.random()) while (rem.size % 5 != 0)
 if (rem.size < 25) return
 num = rem; delim = nums.substringBefore(spl)
 if (num[0][0] != ':') {
 num = num.sortedBy { it.length }.toMutableList()
 max = num.last().length
 num = num.map { " ".repeat(max - it.length) + it + " " }
 delim = " ".repeat(max - delim.length) + delim + " "
 header = ""
 for (i in (0..4)) header += "" + Column.values()[i] + " ".repeat(max)
 } else {
 header = ":regional_indicator_" + Column.values()[0].toString().lowercase()
 //Reg. indicators often turn into flags without spaces
 for (i in (1..4)) header += " :regional_indicator_" + Column.values()[i].toString().lowercase()
 }
 cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 }
 constructor(nums: String): this(nums, '@')
 fun card(): Array<Array<String>> {
 val ret = Array(5) { Array(5) { "" } }
 var index: Int
 val done = mutableListOf<Int>()
 for (i in (1..5))
 for (j in (1..5)) {
 if (i == j && j == 3) {
 ret[2][2] = delim
 continue
 }
 do {
 index = Random.nextInt(num.size / 5 * (j - 1), num.size / 5 * j)
 } while (done.contains(index))
 ret[i - 1][j - 1] = num[index]
 done.add(index)
 }
 return ret
 }
 fun call(): Pair<Column, String> {
 if (cur.isEmpty()) return Pair(Column.Empty, "")
 var index: Int
 do index = Random.nextInt(num.size) while (cur[index] == null)
 val list = cur[index]!!.trim()
 cur.remove(index)
 return Pair(Column.values()[index / (num.size / 5)], list)
 }
}
```
import kotlin.random.Random
class Bingo() {
 var num = (1..75).map { if (it < 10) " $it " else "$it " }
 var cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 var delim = " ∅ "
 var max = 2
 var header = "B I N G O"
 enum class Column {
 B,
 I,
 N,
 G,
 O,
 Empty
 }
 /**
 * It is expected that the number of elements ≥ 25 and is divisible by 5
 */
 constructor(nums: String, spl: Char) : this() {
 val rem = nums.substringAfter(spl).split(spl).toMutableList()
 while (rem.contains("")) rem.remove("")
 while (rem.size % 5 != 0) rem.remove(rem.random())
 if (rem.size < 25) return
 num = rem; delim = nums.substringBefore(spl)
 if (num[0][0] != ':') {
 num = num.sortedBy { it.length }.toMutableList()
 max = num.last().length
 num = num.map { " ".repeat(max - it.length) + it + " " }
 delim = " ".repeat(max - delim.length) + delim + " "
 header = ""
 for (i in (0..4)) header += "" + Column.values()[i] + " ".repeat(max)
 } else {
 header = ":regional_indicator_" + Column.values()[0].toString().lowercase()
 //Reg. indicators often turn into flags without spaces
 for (i in (1..4)) header += " :regional_indicator_" + Column.values()[i].toString().lowercase()
 }
 cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 }
 constructor(nums: String): this(nums, '@')
 fun card(): Array<Array<String>> {
 val ret = Array(5) { Array(5) { "" } }
 var index: Int
 val done = mutableListOf<Int>()
 for (i in (1..5))
 for (j in (1..5)) {
 if (i == j && j == 3) {
 ret[2][2] = delim
 continue
 }
 do {
 index = Random.nextInt(num.size / 5 * (j - 1), num.size / 5 * j)
 } while (done.contains(index))
 ret[i - 1][j - 1] = num[index]
 done.add(index)
 }
 return ret
 }
 fun call(): Pair<Column, String> {
 if (cur.isEmpty()) return Pair(Column.Empty, "")
 var index: Int
 do index = Random.nextInt(num.size) while (cur[index] == null)
 val list = cur[index]!!.trim()
 cur.remove(index)
 return Pair(Column.values()[index / (num.size / 5)], list)
 }
}
```
added 179 characters in body; edited tags
Source Link

Edit: I have changed the code to add an additonal constructor that specifies the delimiting char between elements.

import kotlin.random.Random
class Bingo() {
 var num = (1..75).map { if (it < 10) " $it " else "$it " }
 var cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 var delim = " ∅ "
 var max = 2
 var header = "B I N G O"
 enum class Column {
 B,
 I,
 N,
 G,
 O,
 Empty
 }
 /**
 * It is expected that the number of elements ≥ 25 and is divisible by 5
 */
 constructor(nums: String, spl: Char) : this() {
 val rem = nums.substringAfter('/'spl).split('/'spl).toMutableList()
 while (rem.contains("")) rem.remove("")
 do rem.remove(rem.random()) while (rem.size % 5 != 0)
 if (rem.size < 25) return
 num = rem; delim = nums.substringBefore('/'spl)
 if (num[0][0] != ':') {
 num = num.sortedBy { it.length }.toMutableList()
 max = num.last().length
 num = num.map { " ".repeat(max - it.length) + it + " " }
 delim = " ".repeat(max - delim.length) + delim + " "
 header = ""
 for (i in (0..4)) header += "" + Column.values()[i] + " ".repeat(max)
 } else {
 header = ":regional_indicator_" + Column.values()[0].toString().lowercase()
 //Reg. indicators often turn into flags without spaces
 for (i in (1..4)) header += " :regional_indicator_" + Column.values()[i].toString().lowercase()
 }
 cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 }
 constructor(nums: String): this(nums, '@')
 fun card(): Array<Array<String>> {
 val ret = Array(5) { Array(5) { "" } }
 var index: Int
 val done = mutableListOf<Int>()
 for (i in (1..5))
 for (j in (1..5)) {
 if (i == j && j == 3) {
 ret[2][2] = delim
 continue
 }
 do {
 index = Random.nextInt(num.size / 5 * (j - 1), num.size / 5 * j)
 } while (done.contains(index))
 ret[i - 1][j - 1] = num[index]
 done.add(index)
 }
 return ret
 }
 fun call(): Pair<Column, String> {
 if (cur.isEmpty()) return Pair(Column.Empty, "")
 var index: Int
 do index = Random.nextInt(num.size) while (cur[index] == null)
 val list = cur[index]!!.trim()
 cur.remove(index)
 return Pair(Column.values()[index / (num.size / 5)], list)
 }
}
```
import kotlin.random.Random
class Bingo() {
 var num = (1..75).map { if (it < 10) " $it " else "$it " }
 var cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 var delim = " ∅ "
 var max = 2
 var header = "B I N G O"
 enum class Column {
 B,
 I,
 N,
 G,
 O,
 Empty
 }
 /**
 * It is expected that the number of elements ≥ 25 and is divisible by 5
 */
 constructor(nums: String) : this() {
 val rem = nums.substringAfter('/').split('/').toMutableList()
 while (rem.contains("")) rem.remove("")
 do rem.remove(rem.random()) while (rem.size % 5 != 0)
 if (rem.size < 25) return
 num = rem; delim = nums.substringBefore('/')
 if (num[0][0] != ':') {
 num = num.sortedBy { it.length }.toMutableList()
 max = num.last().length
 num = num.map { " ".repeat(max - it.length) + it + " " }
 delim = " ".repeat(max - delim.length) + delim + " "
 header = ""
 for (i in (0..4)) header += "" + Column.values()[i] + " ".repeat(max)
 } else {
 header = ":regional_indicator_" + Column.values()[0].toString().lowercase()
 //Reg. indicators often turn into flags without spaces
 for (i in (1..4)) header += " :regional_indicator_" + Column.values()[i].toString().lowercase()
 }
 cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 }
 fun card(): Array<Array<String>> {
 val ret = Array(5) { Array(5) { "" } }
 var index: Int
 val done = mutableListOf<Int>()
 for (i in (1..5))
 for (j in (1..5)) {
 if (i == j && j == 3) {
 ret[2][2] = delim
 continue
 }
 do {
 index = Random.nextInt(num.size / 5 * (j - 1), num.size / 5 * j)
 } while (done.contains(index))
 ret[i - 1][j - 1] = num[index]
 done.add(index)
 }
 return ret
 }
 fun call(): Pair<Column, String> {
 if (cur.isEmpty()) return Pair(Column.Empty, "")
 var index: Int
 do index = Random.nextInt(num.size) while (cur[index] == null)
 val list = cur[index]!!.trim()
 cur.remove(index)
 return Pair(Column.values()[index / (num.size / 5)], list)
 }
}
```

Edit: I have changed the code to add an additonal constructor that specifies the delimiting char between elements.

import kotlin.random.Random
class Bingo() {
 var num = (1..75).map { if (it < 10) " $it " else "$it " }
 var cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 var delim = " ∅ "
 var max = 2
 var header = "B I N G O"
 enum class Column {
 B,
 I,
 N,
 G,
 O,
 Empty
 }
 /**
 * It is expected that the number of elements ≥ 25 and is divisible by 5
 */
 constructor(nums: String, spl: Char) : this() {
 val rem = nums.substringAfter(spl).split(spl).toMutableList()
 while (rem.contains("")) rem.remove("")
 do rem.remove(rem.random()) while (rem.size % 5 != 0)
 if (rem.size < 25) return
 num = rem; delim = nums.substringBefore(spl)
 if (num[0][0] != ':') {
 num = num.sortedBy { it.length }.toMutableList()
 max = num.last().length
 num = num.map { " ".repeat(max - it.length) + it + " " }
 delim = " ".repeat(max - delim.length) + delim + " "
 header = ""
 for (i in (0..4)) header += "" + Column.values()[i] + " ".repeat(max)
 } else {
 header = ":regional_indicator_" + Column.values()[0].toString().lowercase()
 //Reg. indicators often turn into flags without spaces
 for (i in (1..4)) header += " :regional_indicator_" + Column.values()[i].toString().lowercase()
 }
 cur = num.associateBy({ num.indexOf(it) }, { it }).toMutableMap()
 }
 constructor(nums: String): this(nums, '@')
 fun card(): Array<Array<String>> {
 val ret = Array(5) { Array(5) { "" } }
 var index: Int
 val done = mutableListOf<Int>()
 for (i in (1..5))
 for (j in (1..5)) {
 if (i == j && j == 3) {
 ret[2][2] = delim
 continue
 }
 do {
 index = Random.nextInt(num.size / 5 * (j - 1), num.size / 5 * j)
 } while (done.contains(index))
 ret[i - 1][j - 1] = num[index]
 done.add(index)
 }
 return ret
 }
 fun call(): Pair<Column, String> {
 if (cur.isEmpty()) return Pair(Column.Empty, "")
 var index: Int
 do index = Random.nextInt(num.size) while (cur[index] == null)
 val list = cur[index]!!.trim()
 cur.remove(index)
 return Pair(Column.values()[index / (num.size / 5)], list)
 }
}
```
Source Link
Loading
default

AltStyle によって変換されたページ (->オリジナル) /