51 lines
1.3 KiB
Scala
51 lines
1.3 KiB
Scala
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
|
|
extension (s: String) def noDuplicates: Boolean =
|
|
var i = 0
|
|
while i < (s.length-1) do
|
|
val c = s(i)
|
|
var j = i + 1
|
|
while j < s.length do
|
|
if s(j) == c then return false
|
|
j += 1
|
|
i += 1
|
|
return true
|
|
|
|
def first_unique_run_for(line: String, num: Int, skip: Int = 0): Int = returning {
|
|
for i <- num.max(skip) until line.length do
|
|
if line.substring(i-num, i).noDuplicates then
|
|
throwReturn(i)
|
|
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
|
|
i += 1
|
|
return -1
|
|
|
|
@main def main() =
|
|
val line = Files.readString(Paths.get("input/6")).strip
|
|
// do_once(line)
|
|
perf_test(line, 1000000)
|
|
|
|
def do_once(line: String) =
|
|
val four = first_unique_run_for(line, 4)
|
|
val fourteen = first_unique_run_for(line, 14, four)
|
|
println(four)
|
|
println(fourteen)
|
|
|
|
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)
|
|
println(four)
|
|
println(fourteen)
|