Challenge 1: A Basic Suspend Function with launch — Solution import kotlinx.coroutines.* suspend fun printAfterDelay(message: String, delayMs: Long) { delay(delayMs) println(message) } fun main() = runBlocking { val job = launch { printAfterDelay("Delayed message!", 1000) } println("Launched") job.join() println("Program finished") } /* Output: Launched Delayed message! (printed ~1 second later) Program finished Notes: - printAfterDelay is a suspend function, so it can only be called from inside a coroutine (here, the lambda passed to launch). - launch starts a new coroutine that begins running immediately but doesn't block main() — "Launched" prints right away, before the 1-second delay finishes. - job.join() suspends runBlocking's coroutine until the launched coroutine completes, which is why "Program finished" only prints after "Delayed message!" — without join(), the program could exit before the launched coroutine ever got to run. */