iq_puzzle.sf 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/I.Q._Puzzle
  4. #
  5. const N = [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
  6. const G = [
  7. [ 0, 1, 3],[ 0, 2, 5],[ 1, 3, 6],
  8. [ 1, 4, 8],[ 2, 4, 7],[ 2, 5, 9],
  9. [ 3, 4, 5],[ 3, 6,10],[ 3, 7,12],
  10. [ 4, 7,11],[ 4, 8,13],[ 5, 8,12],
  11. [ 5, 9,14],[ 6, 7, 8],[ 7, 8, 9],
  12. [10,11,12],[11,12,13],[12,13,14],
  13. ]
  14. const format = ({"#{' '*(5-_)}#{'%d '*_}\n"}.map(1..5).join + "\n")
  15. func solve(n, i, g) is cached {
  16. i == N.end && return "Solved"
  17. n[g[1]] == 0 && return nil
  18. var s = given(n[g[0]]) {
  19. when(0) {
  20. n[g[2]] == 0 && return nil
  21. "#{g[2]} to #{g[0]}\n"
  22. }
  23. default {
  24. n[g[2]] == 1 && return nil
  25. "#{g[0]} to #{g[2]}\n"
  26. }
  27. }
  28. var a = n.clone
  29. g.each {|n| a[n] = 1-a[n] }
  30. var r = ''
  31. G.each {|g| (r = solve(a, i+1, g)) && break }
  32. r ? (s + (format % (a...)) + r) : r
  33. }
  34. format.printf(N...)
  35. var r = ''
  36. G.each {|g| (r = solve(N, 1, g)) && break }
  37. say (r ? r : "No solution found")