{master} counter player biases in daily puzzle selection
parent
03285443bc
commit
2a44758c45
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue