2014년3월7일 - codeport/scala GitHub Wiki

체크인

기분/근황/기대

  • SK님
  • 주말이니까... 저 생일입니다(박수 짝짝~~)
  • 오늘 문제를 끝까지 풀 수 있으면 좋겠습니다.
  • JY님
  • 영화 삼백 관람이후, 피곤한 상태였지만 스터디 참가하니까 기분이 좋습니다.
  • 문제가 어렵기는 하지만, 3단계까지 도전 가능할꺼 같습니다.
  • SK님
  • 두 번째 문제까지 풀어와서... 3 번째 문제까지 풀 수 있었으면 합니다.
  • 오니까 기분이 좋습니다.
  • Wayne Jo
  • 이번 주에 모임에 오는 거 좋았는데...
  • 다음 주에는 출장, 다다음주는 워크샵 스케쥴이 있어서.. 걱정이었습니다.
  • 선결제를 지원해서 다행이라고 생각하고 있습니다.
  • 두 번째 문제까지 풀어봤는데... 3 번째 문제까지 풀 수 있었으면 좋겠습니다.
  • JS님
  • 브레이킹 베드를 정주행 중입니다 :)
  • 금요일에 별일이 없어서 개근 중이라 기분은 좋습니다.
  • YH
  • 어제 술먹고 뻗어서 회사를 안 가서 컨디션이 좋습니다.
  • 문제를 오늘도 끝까지 풀어봤으면 좋겠습니다.

회고

  • SK님
  • 차근차근 진척이 되어가는 점이 좋았습니다.
  • 문제를 다 풀려면 많이 남은 점이 아쉽습니다.
  • 다음에는 문제를 다 풀어보고 오겠습니다.
  • JS님
  • 어려운 문제를 푸는 것보다 쉬운 문제를 깔끔하게 푸는 것에 더 목적을 두게 바뀌었습니다.
  • 코드를 서로 공유하지 못해서 아쉽습니다.
  • JY
  • 많이 피곤했지만 덕분에 에너지가 많이 올라갔고 재밌었던점이 큰 수확이었습니다.
  • 진도를 많이 나가지 못해서 아쉽지만 그래도 스몰케이스는 통과해서 즐거웠습니다.
  • YH
  • 페어 프로그래밍을 해서 즐거웠습니다.
  • 라지 케이스를 풀지 못해서 아쉬웠습니다.
  • SK님
  • 숫자가 나오는 패턴을 생각해 보지 않았었는데, 아이디어를 얻어서 좋았습니다.
  • 집에서 풀면 라지2도 풀 수 있을 것 같은 희망을 얻었습니다.
  • HT님
  • 테스트케이스 쓰면서 작업하는 걸 처음 봐서 좋았습니다.
  • 평소에 회사에서는 UI개발하느라 경험을 많이 못 했었다.
  • 다음주에 못 와서 아쉽다.

풀이

object FairAndSquare extends App {

  def count(from: BigInt, to: BigInt): Int =
    fairAndSquares.filter(x => from <= x && x <= to).size

  lazy val fairAndSquares: Seq[BigInt] =
    (1 to 100).flatMap(roots(_)).map(BigInt(_) pow 2)

  def roots(d: Int): Seq[String] = halfSrc((d + 1) / 2, 10, 2 - d % 2).map { xs =>
    xs ++ (if (d % 2 == 0) xs.reverse else xs.reverse.tail)
  }.map(_.mkString).sorted

  def halfSrc(d: Int, limit: Int, lastTermMultiplier: Int): Seq[Seq[Int]] = for {
    z <- if (d == 1) (1 to 3) else (0 to 2) if lastTermMultiplier * z * z < limit
    xs <- if (d == 1) Seq(collection.immutable.Queue.empty)
    else halfSrc(d - 1, limit - lastTermMultiplier * z * z, 2)
  } yield xs :+ z

  import java.io._

  def process(iter: Iterator[String])(out: PrintStream) = {
    for (i <- 1 to iter.next().toInt) {
      val Array(a, b) = iter.next().split(' ').map(s => BigInt(s.trim))
      out.println(s"Case #$i: ${count(a, b)}")
    }
  }

  val out = new PrintStream(new File("out"))
  try {
    process(io.Source.fromFile("C-large-practice-2.in").getLines)(out)
  } finally {
    out.flush; out.close
  }
}