Challenge 3: Choosing a Dispatcher — Solution import kotlinx.coroutines.* suspend fun simulateNetworkCall(): String = withContext(Dispatchers.IO) { delay(300) "Response from server" } fun main() = runBlocking { val result = simulateNetworkCall() println(result) } /* Output: Response from server Notes: - Dispatchers.IO is used here (not Dispatchers.Default) because this function represents a network call — work that spends almost all of its time waiting on something external (the network), not work that keeps a CPU core busy computing. Dispatchers.IO's larger, elastic thread pool is designed exactly for this kind of blocking-wait work. - Dispatchers.Default would be the right choice instead if this function were doing genuine CPU-bound work, like sorting a large list or parsing a big file, where a CPU core really is kept busy the whole time. - withContext(Dispatchers.IO) { ... } both switches to the IO dispatcher for the block and returns its final expression as the function's result, which is why simulateNetworkCall() can be written as a single-expression function. */