Advertisement
Guest User

Untitled

a guest
Dec 16th, 2014
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.71 KB | None | 0 0
  1. package detective
  2.  
  3. class Knowledge(private val formula: Long) extends AnyVal {
  4.   import Knowledge._
  5.  
  6.   def &&(that: Knowledge) = Knowledge(this.formula & that.formula)
  7.   def ||(that: Knowledge) = Knowledge(this.formula | that.formula)
  8.   def unary_! = Knowledge(~formula)
  9.  
  10.   def implies(that: Knowledge) = ((!this || that) == TAUTOLOGY)
  11.  
  12.   def frontIsClear = implies(FRONT_IS_CLEAR)
  13.   def frontIsBlocked = implies(!FRONT_IS_CLEAR)
  14.  
  15.   def leftIsClear = implies(LEFT_IS_CLEAR)
  16.   def leftIsBlocked = implies(!LEFT_IS_CLEAR)
  17.  
  18.   def backIsClear = implies(BACK_IS_CLEAR)
  19.   def backIsBlocked = implies(!BACK_IS_CLEAR)
  20.  
  21.   def rightIsClear = implies(RIGHT_IS_CLEAR)
  22.   def rightIsBlocked = implies(!RIGHT_IS_CLEAR)
  23.  
  24.   def onBeeper = implies(ON_BEEPER)
  25.   def noBeeper = implies(!ON_BEEPER)
  26.  
  27.   def beeperAhead = implies(BEEPER_AHEAD)
  28.   def nothingAhead = implies(!BEEPER_AHEAD)
  29.  
  30.   // TODO Can this be improved with bit twiddling?
  31.   def moveForward = {
  32.     val temp = this && FRONT_IS_CLEAR
  33.    
  34.     if (temp.beeperAhead) BACK_IS_CLEAR && ON_BEEPER
  35.     else if (temp.nothingAhead) BACK_IS_CLEAR && NO_BEEPER
  36.     else BACK_IS_CLEAR
  37.   }
  38.  
  39.   // see http://programming.sirrida.de/calcperm.php
  40.   private def bit_permute_step(x: Long, mask: Long, shift: Int) = {
  41.     val t = ((x >>> shift) ^ x) & mask
  42.     (x ^ t) ^ (t << shift)
  43.   }
  44.  
  45.   def turnLeft = {
  46.     var x = forgetAhead
  47.     x = bit_permute_step(x, 0x2222222222222222L, 1)
  48.     x = bit_permute_step(x, 0x0c0c0c0c0c0c0c0cL, 2)
  49.     x = bit_permute_step(x, 0x00f000f000f000f0L, 4)
  50.     Knowledge(x)
  51.   }
  52.  
  53.   def turnRight = {
  54.     var x = forgetAhead
  55.     x = bit_permute_step(x, 0x00aa00aa00aa00aaL, 7)
  56.     x = bit_permute_step(x, 0x00cc00cc00cc00ccL, 6)
  57.     x = bit_permute_step(x, 0x00f000f000f000f0L, 4)
  58.     Knowledge(x)
  59.   }
  60.  
  61.   def turnAround = {
  62.     var x = forgetAhead
  63.     x = bit_permute_step(x, 0x0a0a0a0a0a0a0a0aL, 3)
  64.     x = bit_permute_step(x, 0x00cc00cc00cc00ccL, 6)
  65.     Knowledge(x)
  66.   }
  67.  
  68.   def pickBeeper = Knowledge(formula >>> 32)
  69.  
  70.   def dropBeeper = Knowledge(formula << 32)
  71.  
  72.   // see http://programming.sirrida.de/calcperm.php
  73.   private def bit_permute_step_simple(x: Long, mask: Long, shift: Long) = {
  74.     val t = (x >>> shift) & mask
  75.     ((x & mask) << shift) | t
  76.   }
  77.  
  78. //  def forgetFront = formula | bit_permute_step_simple(formula, 0x5555555555555555L, 1)
  79. //  
  80. //  def forgetLeft = formula | bit_permute_step_simple(formula, 0x3333333333333333L, 2)
  81. //  
  82. //  def forgetBack = formula | bit_permute_step_simple(formula, 0x0f0f0f0f0f0f0f0fL, 4)
  83. //  
  84. //  def forgetRight = formula | bit_permute_step_simple(formula, 0x00ff00ff00ff00ffL, 8)
  85.  
  86.   def forgetAhead = formula | bit_permute_step_simple(formula, 0x0000ffff0000ffffL, 16)
  87.  
  88.   override def toString = "%016x".format(formula)
  89. }
  90.  
  91. object Knowledge {
  92.   private def apply(x: Long) = new Knowledge(x)
  93.  
  94.   val /*  */ FRONT_IS_CLEAR = apply(0xaaaaaaaaaaaaaaaaL) // 01...
  95.   val /**/ FRONT_IS_BLOCKED = !FRONT_IS_CLEAR
  96.   val /*   */ LEFT_IS_CLEAR = apply(0xccccccccccccccccL) // 0011...
  97.   val /* */ LEFT_IS_BLOCKED = !LEFT_IS_CLEAR
  98.   val /*   */ BACK_IS_CLEAR = apply(0xf0f0f0f0f0f0f0f0L) // 00001111...
  99.   val /* */ BACK_IS_BLOCKED = !BACK_IS_CLEAR
  100.   val /*  */ RIGHT_IS_CLEAR = apply(0xff00ff00ff00ff00L) // 0000000011111111...
  101.   val /**/ RIGHT_IS_BLOCKED = !RIGHT_IS_CLEAR
  102.   val /*    */ BEEPER_AHEAD = apply(0xffff0000ffff0000L) // 00000000000000001111111111111111...
  103.   val /*   */ NOTHING_AHEAD = !BEEPER_AHEAD
  104.   val /*       */ ON_BEEPER = apply(0xffffffff00000000L) // 0000000000000000000000000000000011111111111111111111111111111111...
  105.   val /*       */ NO_BEEPER = !ON_BEEPER
  106.  
  107.   val /*     */ TAUTOLOGY = apply(0xffffffffffffffffL)
  108.   val /* */ CONTRADICTION = apply(0x0000000000000000L)
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement