>
> Quickly refactored the code:
>

import java.io.{BufferedReader, BufferedWriter, InputStreamReader, 
OutputStreamWriter}
import java.util.Scanner

object Solution {

  private def isPowerOf2(x: Long) = (x & (x - 1L)) == 0L

  /**
   * returns next power of 2 greater then x.
   * Example: nextPowerOf2GreaterThenX(11) = 16
   *
   * @param x
   * @return
   */
  private def nextPowerOf2GreaterThenX(x: Long): Long = {
    var result = 1L
    var arg = x
    while (arg > 0L) {
      arg = arg >> 1L
      result = result << 1L
    }
    result
  }

  private def transform(a: Long) = {
    val xNextPowerOf2 = nextPowerOf2GreaterThenX(a)
    val x1 = xNextPowerOf2 - a
    xNextPowerOf2 | x1
  }

  def main(args: Array[String]): Unit = {
    val outputWriter = new BufferedWriter(new OutputStreamWriter(System.out))
    val in = new Scanner(new BufferedReader(new InputStreamReader(System.in)))

    val t = in.nextLine().toInt

    for (caseNum <- 1 to t) {
      val (x, xWasNegative, y, yWasNegative) = in.nextLine().split(' 
').map(_.toLong) match {
        case Array(x, y) => (Math.abs(x), x < 0, Math.abs(y), y < 0)
      }

      val (resultX: Long, resultY: Long) =
        if ((x & y) == 0L) {
          x -> y
        } else {
          val xTransformed = transform(x)
          if ((xTransformed & y) == 0L) {
            xTransformed -> y
          } else {
            val yTransformed = transform(y)
            if ((x & yTransformed) == 0L) {
              x -> yTransformed
            } else {
              if ((xTransformed & yTransformed) == 0L)
                xTransformed -> yTransformed
              else
                0L -> 0L
            }
          }
        }

      if (resultX == 0L && resultY == 0L || !isPowerOf2((resultX | resultY) + 
1L)) {
        outputWriter.write(s"Case #$caseNum: IMPOSSIBLE\n")
      } else {
        val isXTransformed = resultX != x
        val isYTransformed = resultY != y

        val result = StringBuilder.newBuilder
        var (xP, yP) = resultX -> resultY
        while (xP > 0L || yP > 0L) {
          if ((xP & 1L) == 1L) {
            if (xP == 1L || !isXTransformed)
              result.append(if (xWasNegative) "W" else "E")
            else
              result.append(if (xWasNegative) "E" else "W")
          } else if ((yP & 1L) == 1L) {
            if (yP == 1L || !isYTransformed)
              result.append(if (yWasNegative) "S" else "N")
            else
              result.append(if (yWasNegative) "N" else "S")
          }
          xP = xP >> 1L
          yP = yP >> 1L
        }

        outputWriter.write(s"Case #$caseNum: ${result.mkString}\n")
      }
    }
    outputWriter.close()
  }

} 

-- 
You received this message because you are subscribed to the Google Groups 
"Google Code Jam" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-code+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-code/a6af3268-eefa-46d4-b284-80fdb2acd666%40googlegroups.com.

Reply via email to