1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #!/usr/bin/ruby
- #
- ## https://rosettacode.org/wiki/I.Q._Puzzle
- #
- const N = [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
- const G = [
- [ 0, 1, 3],[ 0, 2, 5],[ 1, 3, 6],
- [ 1, 4, 8],[ 2, 4, 7],[ 2, 5, 9],
- [ 3, 4, 5],[ 3, 6,10],[ 3, 7,12],
- [ 4, 7,11],[ 4, 8,13],[ 5, 8,12],
- [ 5, 9,14],[ 6, 7, 8],[ 7, 8, 9],
- [10,11,12],[11,12,13],[12,13,14],
- ]
- const format = ({"#{' '*(5-_)}#{'%d '*_}\n"}.map(1..5).join + "\n")
- func solve(n, i, g) is cached {
- i == N.end && return "Solved"
- n[g[1]] == 0 && return nil
- var s = given(n[g[0]]) {
- when(0) {
- n[g[2]] == 0 && return nil
- "#{g[2]} to #{g[0]}\n"
- }
- default {
- n[g[2]] == 1 && return nil
- "#{g[0]} to #{g[2]}\n"
- }
- }
- var a = n.clone
- g.each {|n| a[n] = 1-a[n] }
- var r = ''
- G.each {|g| (r = solve(a, i+1, g)) && break }
- r ? (s + (format % (a...)) + r) : r
- }
- format.printf(N...)
- var r = ''
- G.each {|g| (r = solve(N, 1, g)) && break }
- say (r ? r : "No solution found")
|