From 23419bab40950f61fb00e74b70f2f7a17f73781b Mon Sep 17 00:00:00 2001 From: ppettarrm Date: Wed, 27 Mar 2024 11:01:21 +0100 Subject: [PATCH] Solutions for exercises 3 --- .../exercise3/task1/BalancedBrackets.kt | 18 ++++++++++-- .../exercise3/task2/ParenthesesClusters.kt | 25 ++++++++++++++++- .../task3/SherlockValidatesString.kt | 18 ++++++++++-- .../kotlin/exercise3/task4/TaxiParkTask.kt | 28 ++++++++++++++++--- 4 files changed, 79 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/exercise3/task1/BalancedBrackets.kt b/src/main/kotlin/exercise3/task1/BalancedBrackets.kt index 7a6958d..4177962 100644 --- a/src/main/kotlin/exercise3/task1/BalancedBrackets.kt +++ b/src/main/kotlin/exercise3/task1/BalancedBrackets.kt @@ -1,5 +1,7 @@ package exercise3.task1 +import java.util.* + /** * Task1: Balanced Brackets (Parentheses) Problem * @@ -24,9 +26,21 @@ package exercise3.task1 * */ +val brackets: Map = mapOf(']' to '[', '}' to '{', ')' to '(') -internal fun isExpressionBalanced(expression: String): Boolean { - TODO("Implement me!!!") +fun isExpressionBalanced(expression: String): Boolean { + val stack = LinkedList() + expression.forEach { + when (it) { + in brackets.values -> stack.push(it) + in brackets.keys -> { + if (stack.isEmpty() || brackets[it] != stack.pop()) { + return false + } + } + } + } + return stack.isEmpty() } fun main() { diff --git a/src/main/kotlin/exercise3/task2/ParenthesesClusters.kt b/src/main/kotlin/exercise3/task2/ParenthesesClusters.kt index 0e75083..1994b48 100644 --- a/src/main/kotlin/exercise3/task2/ParenthesesClusters.kt +++ b/src/main/kotlin/exercise3/task2/ParenthesesClusters.kt @@ -1,5 +1,8 @@ package exercise3.task2 +import exercise3.task1.brackets +import java.util.* + /** * Task 2: Split Expression To Parentheses Clusters * @@ -24,7 +27,27 @@ package exercise3.task2 */ internal fun String.splitToBracketsClusters(): List { - TODO("Implement me!!!") + val stack = LinkedList() + val returnListOfBrackets = mutableListOf() + + var currBalancedBrackets = "" + this.forEach { + currBalancedBrackets += it + when (it) { + in brackets.values -> stack.push(it) + in brackets.keys -> { + if (stack.isEmpty() || brackets[it] != stack.pop()) { + return listOf() + } + } + } + if (stack.isEmpty()) { + returnListOfBrackets.add(currBalancedBrackets) + currBalancedBrackets = "" + } + } + if (!stack.isEmpty()) return listOf() + return returnListOfBrackets } fun main() { diff --git a/src/main/kotlin/exercise3/task3/SherlockValidatesString.kt b/src/main/kotlin/exercise3/task3/SherlockValidatesString.kt index 55680b8..e3a3340 100644 --- a/src/main/kotlin/exercise3/task3/SherlockValidatesString.kt +++ b/src/main/kotlin/exercise3/task3/SherlockValidatesString.kt @@ -29,7 +29,16 @@ package exercise3.task3 */ internal fun isSherlockValid(s: String): String { - TODO("Implement me!!!") + val freqOfFreqMap: Map = s.groupingBy { it }.eachCount().values.groupingBy { it }.eachCount() + + return when (freqOfFreqMap.size) { + 2 -> { + val (minFrequency, maxFrequency) = freqOfFreqMap.keys.sorted() + if ((freqOfFreqMap[minFrequency] == 1 && minFrequency == 1) || (freqOfFreqMap[maxFrequency] == 1 && maxFrequency - minFrequency == 1)) "YES" else "NO" + } + 1 -> "YES" + else -> "NO" + } } fun main() { @@ -40,8 +49,11 @@ fun main() { val errorMessageFactory = { answer: String -> if (answer == "YES") "is valid" else "is not valid" } require(expectedIsValid == actualIsValid) { - "String \"$string\" is ${errorMessageFactory(expectedIsValid)}," + - " but actual value was ${errorMessageFactory(actualIsValid)}." + "String \"$string\" is ${errorMessageFactory(expectedIsValid)}," + " but actual value was ${ + errorMessageFactory( + actualIsValid + ) + }." } } } diff --git a/src/main/kotlin/exercise3/task4/TaxiParkTask.kt b/src/main/kotlin/exercise3/task4/TaxiParkTask.kt index 0dfe831..86866f3 100755 --- a/src/main/kotlin/exercise3/task4/TaxiParkTask.kt +++ b/src/main/kotlin/exercise3/task4/TaxiParkTask.kt @@ -10,7 +10,8 @@ package exercise3.task4 * Find all the drivers who performed no trips. */ internal fun TaxiPark.findFakeDrivers(): Set { - TODO("Implement me!!!") + return this.allDrivers.minus(this.trips.map { it.driver } + .intersect(this.allDrivers)) } /** @@ -18,7 +19,16 @@ internal fun TaxiPark.findFakeDrivers(): Set { * Find all the clients who completed at least the given number of trips. */ internal fun TaxiPark.findFaithfulPassengers(minTrips: Int): Set { - TODO("Implement me!!!") + println(this.trips.flatMap { it.passengers } + .groupingBy { it } + .eachCount()) + + return this.trips.flatMap { it.passengers } + .groupingBy { it } + .eachCount() + .filter { it.value >= minTrips } + .map { it.key } + .toSet() } /** @@ -26,7 +36,14 @@ internal fun TaxiPark.findFaithfulPassengers(minTrips: Int): Set { * Find all the passengers, who were taken by a given driver more than once. */ internal fun TaxiPark.findFrequentPassengers(driver: Driver): Set { - TODO("Implement me!!!") + return this.trips + .filter { it.driver == driver } + .flatMap { it.passengers } + .groupingBy { it } + .eachCount() + .filter { it.value > 1 } + .map { it.key } + .toSet() } /** @@ -34,5 +51,8 @@ internal fun TaxiPark.findFrequentPassengers(driver: Driver): Set { * Find the passengers who had a discount for the majority of their trips. */ internal fun TaxiPark.findSmartPassengers(): Set { - TODO("Implement me!!!") + return this.trips + .filter { it.discount != null } + .flatMap { it.passengers } + .toSet() }