dice_game_solver.sf 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/ruby
  2. # Dice game solver
  3. var board = [
  4. [4, 1, 3, 3, 5, 2],
  5. [3, 4, 1, 2, 0, 3],
  6. [5, 1, 5, 5, 4, 2],
  7. [1, 3, 2, 5, 2, 1],
  8. [6, 2, 4, 1, 5, 4],
  9. [6, 2, 1, 6, 6, 3],
  10. ]
  11. var moves = Hash.new(
  12. 'up' => [-1, +0],
  13. 'up-right' => [-1, +1],
  14. 'up-left' => [-1, -1],
  15. 'right' => [+0, +1],
  16. 'left' => [+0, -1],
  17. 'down' => [+1, +0],
  18. 'down-left' => [+1, -1],
  19. 'down-right' => [+1, +1],
  20. )
  21. var directions = moves.keys;
  22. func valid_move (row, col) {
  23. row < 0 && return false;
  24. col < 0 && return false;
  25. board.has_index(row) || return false;
  26. board[row].has_index(col) || return false;
  27. return true;
  28. }
  29. loop {
  30. var map = Hash();
  31. var seen = Hash();
  32. var dirs = Array();
  33. var spos = Hash();
  34. var current_pos = [board.end, 0];
  35. var current_num = board[current_pos[0]][current_pos[1]];
  36. spos{current_pos.join(';')} = 1;
  37. {
  38. var dir = (
  39. map.has_key(current_num)
  40. ? map{current_num}
  41. : do {
  42. var d = '';
  43. do {
  44. d = directions[directions.len.rand]
  45. } while (map.values.contains(d));
  46. d;
  47. }
  48. );
  49. var pos = moves{dir};
  50. var row = current_pos[0]+pos[0];
  51. var col = current_pos[1]+pos[1];
  52. valid_move(row, col) || break;
  53. dirs.push(
  54. Hash(
  55. 'dir' => dir,
  56. 'num' => current_num,
  57. 'pos' => current_pos,
  58. )
  59. );
  60. map{current_num} := dir;
  61. current_pos = [row, col];
  62. current_num = board[current_pos[0]][current_pos[1]];
  63. if (spos{current_pos.join(';')} := 0 ++ > 1) {
  64. break;
  65. }
  66. seen{current_num} := 0 ++;
  67. if (current_num == 0) {
  68. if (seen{board[current_pos[0] - pos[0]][current_pos[1] - pos[1]]} > 1) {
  69. dirs.each { |hash|
  70. "Go %-40s (from num '%s')\n".printf(hash{:dir}, hash{:num});
  71. };
  72. goto :END;
  73. }
  74. break;
  75. }
  76. } * (board.end ** 2);
  77. }
  78. @:END;