{master} counter player biases in daily puzzle selection

deepcrayonfish^2
Thibault Duplessis 2021-11-07 09:21:29 +01:00
parent 03285443bc
commit 2a44758c45
3 changed files with 21 additions and 1 deletions

View File

@ -38,6 +38,11 @@ abstract class Random {
vec.nonEmpty ?? {
vec lift nextInt(vec.size)
}
// odds(1) = 100% true
// odds(2) = 50% true
// odds(3) = 33% true
def odds(n: Int): Boolean = nextInt(n) == 0
}
object ThreadLocalRandom extends Random {

View File

@ -7,6 +7,7 @@ import scala.concurrent.duration._
import lila.db.dsl._
import lila.memo.CacheApi._
import lila.common.ThreadLocalRandom
final private[puzzle] class DailyPuzzle(
colls: PuzzleColls,
@ -26,7 +27,7 @@ final private[puzzle] class DailyPuzzle(
def get: Fu[Option[DailyPuzzle.WithHtml]] = cache.getUnit
private def find: Fu[Option[DailyPuzzle.WithHtml]] =
(findCurrent orElse findNew) recover { case e: Exception =>
(findCurrent orElse findNewBiased()) recover { case e: Exception =>
logger.error("find daily", e)
none
} flatMap { _ ?? makeDaily }
@ -48,6 +49,18 @@ final private[puzzle] class DailyPuzzle(
.one[Puzzle]
}
private def findNewBiased(tries: Int = 0): Fu[Option[Puzzle]] = {
def tryAgainMaybe = (tries < 5) ?? findNewBiased(tries + 1)
import lila.common.ThreadLocalRandom.odds
import PuzzleTheme._
findNew flatMap {
case None => tryAgainMaybe
case Some(p) if p.hasTheme(anastasiaMate) && !odds(3) => tryAgainMaybe dmap (_ orElse p.some)
case Some(p) if p.hasTheme(arabianMate) && odds(2) => tryAgainMaybe dmap (_ orElse p.some)
case p => fuccess(p)
}
}
private def findNew: Fu[Option[Puzzle]] =
colls
.path {

View File

@ -29,6 +29,8 @@ case class Puzzle(
} err s"Can't apply puzzle $id first move"
def color = fen.color.fold[chess.Color](chess.White)(!_)
def hasTheme(theme: PuzzleTheme) = themes(theme.key)
}
object Puzzle {