67 lines
1.6 KiB
Groovy
67 lines
1.6 KiB
Groovy
final random = new Random()
|
|
final input = new Scanner(System.in)
|
|
|
|
|
|
def evaluate = { expr ->
|
|
if (expr == 'QUIT') {
|
|
return 'QUIT'
|
|
} else {
|
|
try { Eval.me(expr.replaceAll(/(\d)/, '$1.0')) }
|
|
catch (e) { 'syntax error' }
|
|
}
|
|
}
|
|
|
|
|
|
def readGuess = { digits ->
|
|
while (true) {
|
|
print "Enter your guess using ${digits} (q to quit): "
|
|
def expr = input.nextLine()
|
|
|
|
switch (expr) {
|
|
case ~/^[qQ].*/:
|
|
return 'QUIT'
|
|
|
|
case ~/.*[^\d\s\+\*\/\(\)-].*/:
|
|
def badChars = expr.replaceAll(~/[\d\s\+\*\/\(\)-]/, '')
|
|
println "invalid characters in input: ${(badChars as List) as Set}"
|
|
break
|
|
|
|
case { (it.replaceAll(~/\D/, '') as List).sort() != ([]+digits).sort() }:
|
|
println '''you didn't use the right digits'''
|
|
break
|
|
|
|
case ~/.*\d\d.*/:
|
|
println 'no multi-digit numbers allowed'
|
|
break
|
|
|
|
default:
|
|
return expr
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
def digits = (1..4).collect { (random.nextInt(9) + 1) as String }
|
|
|
|
while (true) {
|
|
def guess = readGuess(digits)
|
|
def result = evaluate(guess)
|
|
|
|
switch (result) {
|
|
case 'QUIT':
|
|
println 'Awwww. Maybe next time?'
|
|
return
|
|
|
|
case 24:
|
|
println 'Yes! You got it.'
|
|
return
|
|
|
|
case 'syntax error':
|
|
println "A ${result} was found in ${guess}"
|
|
break
|
|
|
|
default:
|
|
println "Nope: ${guess} == ${result}, not 24"
|
|
println 'One more try, then?'
|
|
}
|
|
}
|