24_game.sf 968 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/24_game
  4. #
  5. const digits = @(1..9).shuffle.first(4);
  6. const grammar = Regex(
  7. '^ (?&exp) \z
  8. (?(DEFINE)
  9. (?<exp> ( (?&term) (?&op) (?&term) )+ )
  10. (?<term> \( (?&exp) \) | [' + digits.join + '])
  11. (?<op> [-+*/] )
  12. )', 'x'
  13. );
  14.  
  15. say "Here are your digits: #{digits.join(' ')}";
  16.  
  17. loop {
  18. var input = Sys.scanln("Expression: ");
  19.  
  20. var expr = input;
  21. expr -= /\s+/g; # remove all whitespace
  22.  
  23. input == 'q' && (
  24. say "Goodbye. Sorry you couldn't win.";
  25. break;
  26. );
  27.  
  28. var given_digits = digits.map{.to_s}.sort.join;
  29. var entry_digits = input.scan(/\d/).sort.join;
  30.  
  31. if ((given_digits != entry_digits) || (expr !~ grammar)) {
  32. say "That's not valid";
  33. next;
  34. }
  35.  
  36. given(var n = eval(input)) {
  37. when (24) { say "You win!"; break }
  38. default { say "Sorry, your expression is #{n}, not 24" }
  39. }
  40. }