This commit is contained in:
		
							parent
							
								
									8f47a462df
								
							
						
					
					
						commit
						9e3e1adeaa
					
				
							
								
								
									
										45
									
								
								day07.kts
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										45
									
								
								day07.kts
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,45 @@
 | 
			
		||||
#!/usr/bin/env kotlin
 | 
			
		||||
import java.util.Scanner
 | 
			
		||||
 | 
			
		||||
val scanner = Scanner(System.`in`)
 | 
			
		||||
 | 
			
		||||
var total = 0L
 | 
			
		||||
var totalTwo = 0L
 | 
			
		||||
val operations = listOf("*", "+")
 | 
			
		||||
while (scanner.hasNext()) {
 | 
			
		||||
    val line = scanner.nextLine()
 | 
			
		||||
    val (targetString, rest) = line.split(":", limit = 2).map { it.trim() }
 | 
			
		||||
    val target = targetString.toLong()
 | 
			
		||||
    val values = rest.split(Regex("""\s+""")).map { it.toLong() }
 | 
			
		||||
    if (hitsTarget(target, values, operations)) {
 | 
			
		||||
        total += target
 | 
			
		||||
        totalTwo += target
 | 
			
		||||
    } else if (hitsTarget(target, values, listOf("||") + operations)) {
 | 
			
		||||
        totalTwo += target
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
println("Total result: $total")
 | 
			
		||||
println("Total result (part 2): $totalTwo")
 | 
			
		||||
 | 
			
		||||
fun hitsTarget(target: Long, values: List<Long>, operations: List<String>): Boolean {
 | 
			
		||||
    if (values.size == 1) {
 | 
			
		||||
        return target == values[0]
 | 
			
		||||
    }
 | 
			
		||||
    val (operandOne, operandTwo) = values.take(2)
 | 
			
		||||
    if (operandOne > target) {
 | 
			
		||||
        return false
 | 
			
		||||
    }
 | 
			
		||||
    val rest = values.drop(2)
 | 
			
		||||
    for (op in operations) {
 | 
			
		||||
        val result = when (op) {
 | 
			
		||||
            "+" -> operandOne + operandTwo
 | 
			
		||||
            "*" -> operandOne * operandTwo
 | 
			
		||||
            "||" -> "$operandOne$operandTwo".toLong()
 | 
			
		||||
            else -> throw IllegalArgumentException("Unknown operation: $op")
 | 
			
		||||
        }
 | 
			
		||||
        if (hitsTarget(target, listOf(result) + rest, operations)) {
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return false
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user