Solve triangle solitaire puzzle: Difference between revisions

m (improved output, adapted to the English game)
Line 1,585:
 
<lang ruby># Solitaire Like Puzzle Solver - Nigel Galloway: October 18th., 2014
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],
pegs = (N = [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1]).inject(:+)
G = [[03,1,30],[05,2,50],[16,3,61],[18,4,81],[27,4,72],[29,5,92],[35,4,53],[310,6,103],[312,7,123],[411,7,114],[413,8,134],[512,8,125],[514,9,145],[68,7,86],[79,8,97],[1012,11,1210],[1113,12,1311],[1214,13,1412]]
FORMAT = (1..5).map{|i| " "*(5-i)+"%d "*i+"\n"}.join+"\n"
def solve n,i,g
return "Solved" if i == 1
return false unless n[g[0]]==0 and n[g[1]]==1 and n[g[2]]==1
if e = n[.clone; g.each{|n| e[0]n] == 01 - e[n]}
return l=false; unless n[G.each{|g[2]]=| l=solve(e,i-1,g); break if l}
return l s =? "#{g[20]} to #{g[02]}\n" + FORMAT % e + l : l
else
return false unless n[g[2]]==0
s = "#{g[0]} to #{g[2]}\n"
end
a = n.clone; g.each{|n| a[n] = 1 - a[n]}
l=false; G.each{|g| l=solve(a,i-1,g); break if l}
return l ? s + FORMAT % a + l : l
end
puts FORMAT % (N=[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1])
l=false; G.each{|g| l=solve(N,pegsN.inject(:+),g); break if l}
puts l ? l : "No solution found"</lang>
</lang>
{{out}}
<pre style="height:64ex;overflow:scroll">
2,172

edits