From 1d25dd16a40fec8c23dd4a23713fb122b2e0e97b Mon Sep 17 00:00:00 2001 From: Dmitry-Ivashkov <100100101104@mail.ru> Date: Mon, 15 Feb 2021 23:14:46 +0300 Subject: [PATCH 1/2] do all, test: Ok --- .../scala/org/spbsu/mkn/scala/TheGame.scala | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) 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..eb91ded 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,7 +1,9 @@ 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 { @@ -12,9 +14,23 @@ object TheGame { 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 = { // если эксклюзивность важна + 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.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: ") From 72c57eabaed71782c4cb248f4156b586851ab95f Mon Sep 17 00:00:00 2001 From: Dmitry-Ivashkov <100100101104@mail.ru> Date: Tue, 16 Feb 2021 23:34:32 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20main?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scala/org/spbsu/mkn/scala/TheGame.scala | 39 ++++++++++++++++--- .../org/spbsu/mkn/scala/TheGameTest.scala | 2 +- 2 files changed, 34 insertions(+), 7 deletions(-) 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 eb91ded..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 @@ -8,14 +8,17 @@ 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 = alphanumeric.drop(length).toString() // если эксклюзивность не важна - 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 @@ -24,17 +27,41 @@ object TheGame { 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) 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) + 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") {