Improve parse() and toString()

This commit is contained in:
2024-08-07 10:02:37 +02:00
parent 631799b479
commit e70c89fe58
2 changed files with 26 additions and 57 deletions

View File

@@ -1,42 +1,5 @@
package ch.dissem.yaep.domain
import ch.dissem.yaep.domain.Animal.ANT
import ch.dissem.yaep.domain.Animal.DOG
import ch.dissem.yaep.domain.Animal.GOAT
import ch.dissem.yaep.domain.Animal.SLOTH
import ch.dissem.yaep.domain.Animal.SNAIL
import ch.dissem.yaep.domain.Animal.ZEBRA
import ch.dissem.yaep.domain.Dessert.CAKE
import ch.dissem.yaep.domain.Dessert.CUPCAKE
import ch.dissem.yaep.domain.Dessert.CUSTARD
import ch.dissem.yaep.domain.Dessert.DOUGHNUT
import ch.dissem.yaep.domain.Dessert.ICE_CREAM
import ch.dissem.yaep.domain.Dessert.PIE
import ch.dissem.yaep.domain.Drink.BEER
import ch.dissem.yaep.domain.Drink.BEVERAGE
import ch.dissem.yaep.domain.Drink.COFFEE
import ch.dissem.yaep.domain.Drink.MILK
import ch.dissem.yaep.domain.Drink.TEA
import ch.dissem.yaep.domain.Drink.WINE
import ch.dissem.yaep.domain.Fruit.BANANA
import ch.dissem.yaep.domain.Fruit.GRAPES
import ch.dissem.yaep.domain.Fruit.MANGO
import ch.dissem.yaep.domain.Fruit.PEAR
import ch.dissem.yaep.domain.Fruit.PINEAPPLE
import ch.dissem.yaep.domain.Fruit.WATERMELON
import ch.dissem.yaep.domain.Nationality.CANADA
import ch.dissem.yaep.domain.Nationality.UNITED_KINGDOM
import ch.dissem.yaep.domain.Nationality.JAPAN
import ch.dissem.yaep.domain.Nationality.SPAIN
import ch.dissem.yaep.domain.Nationality.SWITZERLAND
import ch.dissem.yaep.domain.Nationality.UKRAINE
import ch.dissem.yaep.domain.Profession.ASTRONAUT
import ch.dissem.yaep.domain.Profession.HEALTH_WORKER
import ch.dissem.yaep.domain.Profession.ROCK_STAR
import ch.dissem.yaep.domain.Profession.SCIENTIST
import ch.dissem.yaep.domain.Profession.SOFTWARE_DEV
import ch.dissem.yaep.domain.Profession.TEACHER
class Game(
val grid: Grid,
val clues: Collection<Clue>
@@ -75,23 +38,29 @@ class Game(
companion object {
fun parse(description: String): Game {
// TODO get options from string
val rowOptions = listOf<List<Item<*>>>(
listOf(
HEALTH_WORKER,
ROCK_STAR,
SCIENTIST,
SOFTWARE_DEV,
ASTRONAUT,
TEACHER
).map { Item(it) },
listOf(ANT, DOG, GOAT, SLOTH, SNAIL, ZEBRA).map { Item(it) },
listOf(WATERMELON, MANGO, PEAR, GRAPES, PINEAPPLE, BANANA).map { Item(it) },
listOf(CUPCAKE, ICE_CREAM, DOUGHNUT, CAKE, PIE, CUSTARD).map { Item(it) },
listOf(SWITZERLAND, UNITED_KINGDOM, JAPAN, UKRAINE, CANADA, SPAIN).map { Item(it) },
listOf(WINE, BEVERAGE, BEER, COFFEE, TEA, MILK).map { Item(it) }
)
val optionMap = rowOptions.flatten().associateBy(
val optionsRegex = Regex("[A-Z]+(_[A-Z]+)*")
val options = optionsRegex.findAll(description)
.map { it.value }
.distinct()
.map { Item(ItemClass.parse(it)) }
.groupBy { it.itemType.companion }
.toMutableMap()
val size = options.size
// Fill up missing items (one item per row might not appear in the clues)
// (This could be improved by looking which items are in the grid part, but this will
// not always work.)
options
.filter { it.value.size < size }
.forEach { entry ->
val missing = size - entry.value.size
val used = entry.value.map { it.itemType }.toSet()
val fillers = entry.key.items
.filter { !used.contains(it) }
.take(missing)
.map { Item(it) }
options[entry.key] = entry.value + fillers
}
val optionMap = options.values.flatten().associateBy(
keySelector = { it.itemType },
valueTransform = { it }
)
@@ -105,8 +74,8 @@ class Game(
return Game(
grid = Grid(
rows = rowOptions
.map { options -> createRow<ItemClass<*>>(options) }
rows = options.values
.map { createRow<ItemClass<*>>(it) }
.toList()
),
clues = clues

View File

@@ -24,7 +24,7 @@ class Grid(
override fun toString(): String {
return joinToString("\n") { row ->
row.joinToString("") { it.selection?.symbol ?: " " }
row.joinToString("") { it.selection?.symbol ?: "" }
}
}