diff --git a/1/practice/src/main/scala/org/spbsu/mkn/scala/TheGame.scala b/1/practice/src/main/scala/org/spbsu/mkn/scala/TheGame.scala index d773c36..01e587a 100644 --- a/1/practice/src/main/scala/org/spbsu/mkn/scala/TheGame.scala +++ b/1/practice/src/main/scala/org/spbsu/mkn/scala/TheGame.scala @@ -1,24 +1,67 @@ package org.spbsu.mkn.scala +import scala.:: +import scala.collection.IterableOnce.iterableOnceExtensionMethods import scala.io.StdIn.readLine -import scala.util.Random +import scala.util.Random._ object TheGame { sealed trait GuessResult + case class Correct(numTries: Int) extends GuessResult + case class Incorrect(bulls: Int, cows: Int) extends GuessResult class RepeatingDigitsException extends RuntimeException + class WrongNumberLengthException(expected: Int, got: Int) extends RuntimeException - def generateNumberString(length: Int): String = ??? + // def generateNumberString(length: Int): String = alphanumeric.drop(length).toString() // если эксклюзивность не важна + def generateNumberString(length: Int): String = { // a-z A-Z 0-9 + if (length < 1) return "" + val some_string = generateNumberString(length - 1) + val c = alphanumeric.find(char => !some_string.contains(char)).get + some_string + c + } + + def validate(secret: String, userInput: String, numTries: Int = 1): GuessResult = { + if (secret.toSet.size != secret.size) throw new RepeatingDigitsException + if (userInput.toSet.size != userInput.size) throw new RepeatingDigitsException + if (userInput.size != secret.size) throw new WrongNumberLengthException(secret.size, userInput.size) - def validate(secret: String, userInput: String, numTries: Int = 1): GuessResult = ??? + val bulls = userInput.zip(secret).count(pair => pair._1 == pair._2) + val cows = userInput.toSet.intersect(secret.toSet).size - bulls + if (bulls == secret.size) return Correct(numTries) + Incorrect(bulls, cows) + } def main(args: Array[String]): Unit = { - print("Enter your name: ") - val name = readLine() - println(s"Hello, $name!") + println("введите длинну строки (<64)") + var length = readLine().toInt + println("будут использованны такие символы: a-z A-Z 0-9") + var secret = generateNumberString(length) + var guessResult: GuessResult = Incorrect(0, 0) + var numTries = 0 + while (guessResult.isInstanceOf[TheGame.Incorrect]) { + numTries += 1 + println(s"введите строку с уникалюными символами длинны $length") + var userInput = readLine() + try { + guessResult = validate(secret, userInput, numTries) + guessResult match { + case Incorrect(bulls, cows) => { + println(s"$bulls быков, $cows коров") + } + case Correct(numTries) => + println(s"верно за $numTries попыток") + } + } + catch { + case e: RepeatingDigitsException => println("встречен не уникальный символ") + case e: WrongNumberLengthException => println("длинна вашей строки отличается") + case e => throw e + } + } } } diff --git a/1/practice/src/test/scala/org/spbsu/mkn/scala/TheGameTest.scala b/1/practice/src/test/scala/org/spbsu/mkn/scala/TheGameTest.scala index a6f3d0f..065d11b 100644 --- a/1/practice/src/test/scala/org/spbsu/mkn/scala/TheGameTest.scala +++ b/1/practice/src/test/scala/org/spbsu/mkn/scala/TheGameTest.scala @@ -29,7 +29,7 @@ class TheGameTest extends AnyFunSuite { test("incorrect guess is reported") { assert(validate("0", "1").isInstanceOf[TheGame.Incorrect]) - assert(validate("12345", "00000").isInstanceOf[TheGame.Incorrect]) + assert(validate("12345", "ABCDE").isInstanceOf[TheGame.Incorrect]) } test("correct guess validates") {