const digits = (1..9 -> pick(4)) const grammar = Regex( '^ (?&exp) \z (?(DEFINE) (? ( (?&term) (?&op) (?&term) )+ ) (? \( (?&exp) \) | [' + digits.join + ']) (? [\-+*/] ) )', 'x' ) say "Here are your digits: #{digits.join(' ')}" loop { var input = read("Expression: ", String) var expr = input expr -= /\s+/g # remove all whitespace if (input == 'q') { say "Goodbye. Sorry you couldn't win." break } var given_digits = digits.map{.to_s}.sort.join var entry_digits = input.scan(/\d/).sort.join if ((given_digits != entry_digits) || (expr !~ grammar)) { say "That's not valid" next } given(var n = eval(input)) { when (24) { say "You win!"; break } default { say "Sorry, your expression is #{n}, not 24" } } }