Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

do all #13

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 49 additions & 6 deletions 1/practice/src/main/scala/org/spbsu/mkn/scala/TheGame.scala
Original file line number Diff line number Diff line change
@@ -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)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

interesting solution

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]) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be re-implemented as a tail-recursive function

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
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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") {
Expand Down