Skip to content

Instantly share code, notes, and snippets.

@soursop
Last active August 29, 2015 14:14
Show Gist options
  • Save soursop/732248dc6b30c40a66b3 to your computer and use it in GitHub Desktop.
Save soursop/732248dc6b30c40a66b3 to your computer and use it in GitHub Desktop.
TheNextNumber.scala
package thenextnumber
object Main {
def solve(num: String): BigInt = {
def solve(remain: Seq[Int], passed: Seq[Int]): BigInt = {
if (remain.isEmpty) {
solve(Seq(0), passed)
} else {
if (passed.head <= remain.last) solve(remain.init, remain.last +: passed)
else {
val divided = passed.reverse.groupBy(_ > remain.last)
val (bigger, smaller) = (divided.get(true).getOrElse(Seq()), divided.get(false).getOrElse(Seq()))
// println(f" remain:$remain passed:$passed divided:$divided")
val replaced = (smaller ++ bigger.tail :+ remain.last)
val sorted = replaced.sorted
val result = (remain.init :+ bigger.head) ++ sorted
BigInt(result.mkString)
}
}
}
val numbers = num.map(_.asDigit)
solve(numbers.init, numbers.last +: Nil)
}
def main(args: Array[String]) {
run()
}
def test() {
println(solve("115") == 151)
println(solve("1051") == 1105)
println(solve("6233") == 6323)
println(solve("8000") == 80000)
println(solve("88") == 808)
}
def run() {
val writer = new java.io.PrintWriter("b-large.out")
try {
process(io.Source.fromFile("B-large-practice.in").getLines)(writer.println)
} finally {
writer.flush()
writer.close()
}
}
def process(lineIn: Iterator[String])(lineOut: String => Unit) = {
for (i <- 1 to lineIn.next().toInt) {
val x = lineIn.next()
val answer = solve(x)
lineOut(s"Case #$i: $answer")
}
}
}
@sungkmi
Copy link

sungkmi commented Feb 13, 2015

val divided = passed.reverse.groupBy(_ > remain.last)
val (bigger, smaller) = (divided.get(true).getOrElse(Seq()), divided.get(false).getOrElse(Seq()))
이 부분은 아마도
val (bigger, smaller) = passed.reverse.partition(_ > remain.last)
으로 줄일 수 있을 것 같네요 ㅎㅎ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment