From d4a3d8f89bef07d04e953efb838366649119fe96 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Tue, 6 Dec 2022 23:34:01 +1030 Subject: [PATCH] Nim losing to Scala (again) --- 2022/day6.scala | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/2022/day6.scala b/2022/day6.scala index 8ee3629..367d624 100644 --- a/2022/day6.scala +++ b/2022/day6.scala @@ -2,7 +2,7 @@ import java.nio.file.Files import java.nio.file.Paths import scala.util.control.NonLocalReturns.* -// scala day6.jar 52.22s user 0.54s system 100% cpu 52.389 total +// 1M iterations: scala day6.jar 52.22s user 0.54s system 100% cpu 52.389 total extension (s: String) def noDuplicates: Boolean = var i = 0 while i < (s.length-1) do @@ -21,12 +21,24 @@ def first_unique_run_for(line: String, num: Int, skip: Int = 0): Int = returning throwReturn(-1) } -def first_unique_run_while(line: String, num: Int, skip: Int = 0): Int = - var i = num.max(skip) - while i < line.length do - if line.substring(i-num, i).toCharArray.distinct.size == num then - return i +// 1M iterations: scala day6.jar 20.44s user 0.07s system 100% cpu 20.371 total +def no_duplicates_copyless(s: String, right: Int, length: Int): Boolean = + var i = right - length + 1 + while i < right do + val c = s(i) + var j = i + 1 + while j <= right do + if c == s(j) then return false + j += 1 i += 1 + return true + +def first_unique_run_while(line: String, num: Int, skip: Int = 0): Int = + var right = num.max(skip) + while right < line.length do + if no_duplicates_copyless(line, right, num) then + return right + right += 1 return -1 @main def main() = @@ -44,7 +56,7 @@ def perf_test(line: String, n: Int) = var four = -1 var fourteen = -1 for i <- 1 to n do - four = first_unique_run_for(line, 4) - fourteen = first_unique_run_for(line, 14, four) + four = first_unique_run_while(line, 4) + fourteen = first_unique_run_while(line, 14, four) println(four) println(fourteen)