Advertisement
NLinker

Generate expressions

Apr 20th, 2018
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.85 KB | None | 0 0
  1.     @Test
  2.     fun generate() {
  3.         val random = Random(123)
  4.         for (i in 1..100000) {
  5.             val xs = listOf(S.Plus(random.nextInt(10))) + (1..5).map { S.rands(random) }
  6.             val c = calc(xs)
  7.             if (c != null) {
  8.                 val ss = xs.joinToString { wraps(it) }
  9.                 println("$ss = $c")
  10.             }
  11.         }
  12.     }
  13.  
  14.     fun calc(xs: List<S>): Int? {
  15.         var sum: Int? = 0
  16.         for (x in xs) {
  17.             sum = when (x) {
  18.                 is S.Plus -> sum?.plus(x.n)
  19.                 is S.Minus -> sum?.minus(x.n)
  20.                 is S.Mul -> {
  21.                     if (sum == null) null
  22.                     else {
  23.                         val y = sum * x.n
  24.                         if (y < -20 || y > 20) null else y
  25.                     }
  26.                 }
  27.                 is S.Div -> {
  28.                     if (sum == null) null
  29.                     else {
  30.                         if (x.n <= 0 || (sum / x.n) * x.n != sum) null else sum / x.n
  31.                     }
  32.                 }
  33.             }
  34.             if (sum == null)
  35.                 break
  36.         }
  37.         return sum
  38.     }
  39.  
  40. }
  41.  
  42. sealed class S {
  43.     data class Plus(val n: Int) : S()
  44.     data class Minus(val n: Int) : S()
  45.     data class Mul(val n: Int) : S()
  46.     data class Div(val n: Int) : S()
  47.     companion object {
  48.         fun rands(r: Random): S {
  49.             val x = r.nextInt(10)
  50.             return when (r.nextInt(4)) {
  51.                 0 -> Plus(x)
  52.                 1 -> Minus(x)
  53.                 2 -> Mul(x)
  54.                 else -> Div(x)
  55.             }
  56.         }
  57.         fun wraps(s: S): String {
  58.             return when (s) {
  59.                 is Plus  -> "+" + s.n
  60.                 is Minus -> "-" + s.n
  61.                 is Mul   -> "*" + s.n
  62.                 is Div   -> "/" + s.n
  63.             }
  64.         }
  65.     }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement