From e70c89fe58ff976856da8d1c0b4c3291d126eeb2 Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Wed, 7 Aug 2024 10:02:37 +0200 Subject: [PATCH] Improve parse() and toString() --- .../main/kotlin/ch/dissem/yaep/domain/Game.kt | 81 ++++++------------- .../main/kotlin/ch/dissem/yaep/domain/Grid.kt | 2 +- 2 files changed, 26 insertions(+), 57 deletions(-) diff --git a/domain/src/main/kotlin/ch/dissem/yaep/domain/Game.kt b/domain/src/main/kotlin/ch/dissem/yaep/domain/Game.kt index 65e8b3a..6ba68f9 100644 --- a/domain/src/main/kotlin/ch/dissem/yaep/domain/Game.kt +++ b/domain/src/main/kotlin/ch/dissem/yaep/domain/Game.kt @@ -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 @@ -75,23 +38,29 @@ class Game( companion object { fun parse(description: String): Game { - // TODO get options from string - val rowOptions = listOf>>( - 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>(options) } + rows = options.values + .map { createRow>(it) } .toList() ), clues = clues diff --git a/domain/src/main/kotlin/ch/dissem/yaep/domain/Grid.kt b/domain/src/main/kotlin/ch/dissem/yaep/domain/Grid.kt index eaa7f9a..381a92c 100644 --- a/domain/src/main/kotlin/ch/dissem/yaep/domain/Grid.kt +++ b/domain/src/main/kotlin/ch/dissem/yaep/domain/Grid.kt @@ -24,7 +24,7 @@ class Grid( override fun toString(): String { return joinToString("\n") { row -> - row.joinToString("") { it.selection?.symbol ?: " " } + row.joinToString("") { it.selection?.symbol ?: "⬛" } } }