Skip to content

Instantly share code, notes, and snippets.

@waynejo
Created January 29, 2021 11:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save waynejo/3467f76a398c8ae36edaeb84cfd91309 to your computer and use it in GitHub Desktop.
Save waynejo/3467f76a398c8ae36edaeb84cfd91309 to your computer and use it in GitHub Desktop.
import java.io.FileInputStream
import scala.io.StdIn
@main def solve9() =
def appendNumberToMap(numberCount: Map[BigInt, Int], number: BigInt): Map[BigInt, Int] = {
numberCount.updated(number, numberCount.getOrElse(number, 0) + 1)
}
def removeNumberToMap(numberCount: Map[BigInt, Int], number: BigInt): Map[BigInt, Int] = {
val updatedCount = numberCount.getOrElse(number, 0) - 1
if 0 >= updatedCount then
numberCount.removed(number)
else
numberCount.updated(number, updatedCount)
}
def solve1(numbers: Vector[BigInt], previousNumber: Int): Option[BigInt] = {
def _solve(idx: Int, numberCount: Map[BigInt, Int]): Option[BigInt] = {
if idx >= numbers.size then
None
else
val number = numbers(idx)
val isValid = numberCount.exists { x =>
0 != numberCount.getOrElse(number - x._1, 0)
}
if isValid then
val nextNumberCount = appendNumberToMap(numberCount, number)
if 0 <= idx - previousNumber then
_solve(idx + 1, removeNumberToMap(nextNumberCount, numbers(idx - previousNumber)))
else
_solve(idx + 1, nextNumberCount)
else
Some(number)
}
_solve(previousNumber, numbers.take(previousNumber).foldLeft(Map())(appendNumberToMap))
}
def solve2(numbers: Vector[BigInt], target: BigInt): Option[BigInt] = {
def _solve(leftIdx: Int, rightIdx: Int, sum: BigInt): Option[BigInt] = {
if sum == target then
val answers = numbers.drop(leftIdx).take(rightIdx - leftIdx)
Some(answers.min + answers.max)
else if sum < target && rightIdx < numbers.size then
_solve(leftIdx, rightIdx + 1, sum + numbers(rightIdx))
else if sum > target && leftIdx < numbers.size then
_solve(leftIdx + 1, rightIdx, sum - numbers(leftIdx))
else
None
}
_solve(0, 0, 0)
}
val in = new FileInputStream("example9-1.in")
System.setIn(in)
val inputs = Iterator.continually(StdIn.readLine()).takeWhile(_ != null).toVector
val numbers = inputs.map { line => BigInt(line) }
val answer1 = solve1(numbers, 25)
println(answer1)
val answer2 = solve2(numbers, answer1.getOrElse(0))
println(answer2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment