24_game_solve_no_eval.sf 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/24_game/Solve#Sidef
  4. #
  5. var formats = [
  6. {|a,b,c|
  7. Hash.new(
  8. func => {|d,e,f,g| ((d.$a(e)).$b(f)).$c(g) },
  9. format => "((%d #{a} %d) #{b} %d) #{c} %d"
  10. )
  11. },
  12. {|a,b,c|
  13. Hash.new(
  14. func => {|d,e,f,g| (d.$a((e.$b(f)))).$c(g) },
  15. format => "(%d #{a} (%d #{b} %d)) #{c} %d",
  16. )
  17. },
  18. {|a,b,c|
  19. Hash.new(
  20. func => {|d,e,f,g| (d.$a(e)).$b(f.$c(g)) },
  21. format => "(%d #{a} %d) #{b} (%d #{c} %d)",
  22. )
  23. },
  24. {|a,b,c|
  25. Hash.new(
  26. func => {|d,e,f,g| (d.$a(e)).$b(f.$c(g)) },
  27. format => "(%d #{a} %d) #{b} (%d #{c} %d)",
  28. )
  29. },
  30. {|a,b,c|
  31. Hash.new(
  32. func => {|d,e,f,g| d.$a(e.$b(f.$c(g))) },
  33. format => "%d #{a} (%d #{b} (%d #{c} %d))",
  34. )
  35. },
  36. ];
  37. var op = %w( + - * / );
  38. var blocks = op.map { |a| op.map { |b| op.map { |c| formats.map { |format|
  39. format(a,b,c)
  40. }}}}.flatten;
  41. loop {
  42. var input = Sys.scanln("Enter four integers or 'q' to exit: ") \\ break;
  43. input == 'q' && break;
  44. input ~~ /^\h*[1-9]\h+[1-9]\h+[1-9]\h+[1-9]\h*$/ || (
  45. say "Invalid input!"; next;
  46. );
  47. var n = input.split.map{.to_num};
  48. var numbers = n.permutations;
  49. blocks.each { |block|
  50. numbers.each { |n|
  51. if (block{:func}.call(n...) == 24) {
  52. say (block{:format} % (n...));
  53. }
  54. }
  55. }
  56. }