Created
January 24, 2022 02:11
-
-
Save deevis/2649fc99ef3273dd37fe98477713ed1b to your computer and use it in GitHub Desktop.
PathFinder along with solution visualization
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# originally a solution for Codewars.com: Path Finder #3: the Alpinist | |
class PathFinder | |
# Options for display_strategy: [nil, :highlight, :animate] | |
def initialize(display_strategy =nil) | |
@display_strategy = display_strategy | |
end | |
# Options for display_strategy: [nil, :highlight, :animate] | |
def path_finder(maze, display_strategy = nil) | |
t = Time.now | |
if display_strategy | |
@display_strategy = display_strategy | |
end | |
@animate = @display_strategy == :animate | |
@animate_count = 0 | |
@best_score = nil | |
# puts maze | |
@imaze = maze.split.map{|x| x.chars.map(&:to_i)} | |
@n = @imaze.length | |
@lowest_route_score_grid = Array.new(@n){Array.new(@n)} | |
@traversing = Array.new(@n){Array.new(@n)} | |
@paths_tried_count = 0 | |
# dump_path(@traversing) | |
system 'clear' if @animate | |
puts "-" * @n if @animate | |
traverse(0, 0) | |
dump_path(@best_path) | |
puts "Tried #{@paths_tried_count} total paths" | |
puts "Finished #{@n}x#{@n} in #{Time.now - t} seconds" | |
puts "Best path found with score: #{@best_score}" | |
@best_score | |
end | |
def traverse(r, c, previous_value = nil, sum = 0) | |
return if @traversing[r][c] | |
val = @imaze[r][c] | |
previous_value ||= val | |
sum += (val - previous_value).abs | |
return if @best_score && sum > @best_score | |
if r == c && r == (@n - 1) | |
@paths_tried_count += 1 | |
console_output(2, @n + 10, "Paths Tried: #{@paths_tried_count} ") if @animate && @paths_tried_count % 10 == 0 | |
@traversing[r][c] = 1 | |
console_output(r,c,val,:on) if @animate | |
if @best_score.nil? || sum < @best_score | |
@best_path = @traversing.map{|r| r.clone} | |
# dump_path(@traversing) | |
# puts "Score: #{sum}" | |
@best_score = sum | |
console_output(3, @n + 10, " Best Score: #{@best_score} ") if @animate | |
end | |
@traversing[r][c] = nil | |
console_output(r,c,val) if @animate | |
return | |
end | |
# if rand > 0.98 | |
# dump_path(@traversing) | |
# puts "Random path dump" | |
# end | |
console_output(r,c,val,:on) if @animate | |
if @lowest_route_score_grid[r][c] && @lowest_route_score_grid[r][c] <= sum | |
@paths_tried_count += 1 | |
console_output(2, @n + 10, "Paths Tried: #{@paths_tried_count} ") if @animate && @paths_tried_count % 10 == 0 | |
#puts " - bailing > #{@lowest_route_score_grid[r][c]}" | |
console_output(r,c,val) if @animate | |
return | |
end | |
@lowest_route_score_grid[r][c] = sum | |
# dump_path(@traversing, row: r, col: c) | |
@traversing[r][c] = 1 | |
traverse(r, c+1, val, sum) if c + 1 < @n | |
traverse(r+1, c, val, sum) if r + 1 < @n | |
traverse(r, c-1, val, sum) if c > 0 | |
traverse(r-1, c, val, sum) if r > 0 | |
@traversing[r][c] = nil | |
console_output(r,c,val) if @animate | |
end | |
def dump_path(path) | |
system 'clear' if @animate | |
puts "-" * @n | |
path.each_with_index do |r, row| | |
r.each_with_index do |n, col| | |
c = @imaze[row][col] | |
if @animate || @display_strategy == :highlight | |
if n == 1 | |
print "\033[34;103m#{c}" | |
else | |
print "\033[37;40m#{c}" | |
end | |
else | |
print c | |
end | |
end | |
if @animate || @display_strategy == :highlight | |
puts "\033[37;40m" | |
else | |
puts "" | |
end | |
end | |
puts "-" * @n | |
console_output(2, @n + 10, "Paths Tried: #{@paths_tried_count} ") if @animate | |
console_output(3, @n + 10, " Best Score: #{@best_score} ") if @animate | |
console_output(@n + 2, @n+10, "\r\n") if @animate | |
end | |
# move to cursor position at (r,c) and print x | |
def console_output(r,c,x,on_or_off = :off) | |
@animate_count += 1 | |
color = on_or_off == :on ? "\033[34;103m" : "\033[37;40m" | |
# https://en.wikipedia.org/wiki/ANSI_escape_code | |
print "\033[#{r+2};#{c+1}H#{color}#{x}" | |
if @n > 20 | |
return | |
elsif @n <= 10 && @animate_count % 5 == 0 | |
sleep 0.001 | |
elsif @n <= 14 && @animate_count % 30 == 0 | |
sleep 0.001 | |
elsif @animate_count % 50 == 0 | |
sleep 0.001 | |
end | |
end | |
end | |
A = [ | |
"000", | |
"000", | |
"000" | |
].join("\n") | |
B = [ | |
"010", | |
"010", | |
"010" | |
].join("\n") | |
C = [ | |
"010", | |
"101", | |
"010" | |
].join("\n") | |
D = [ | |
"0707", | |
"7070", | |
"0707", | |
"7070" | |
].join("\n") | |
E = [ | |
"700000", | |
"077770", | |
"077770", | |
"077770", | |
"077770", | |
"000007" | |
].join("\n") | |
F = [ | |
"777000", | |
"007000", | |
"007000", | |
"007000", | |
"007000", | |
"007777" | |
].join("\n") | |
G = [ | |
"000000", | |
"000000", | |
"000000", | |
"000010", | |
"000109", | |
"001010" | |
].join("\n") | |
# 20x20 Answer: 57 | |
H = <<~MAZE | |
94026455762233898746 | |
78651937607839316298 | |
85985048089899427533 | |
13881055069284815944 | |
65679091181504346372 | |
22843456669745976012 | |
24180772458313803951 | |
30043948504742994942 | |
54632837721433682840 | |
96799071542434598813 | |
10728436250428028777 | |
33642699375330721932 | |
60172879407967138046 | |
36468183287353848044 | |
37131010672307051527 | |
40047110258861935765 | |
15280434095840848020 | |
85113222218602324538 | |
61272428813250996802 | |
81900807096429851210 | |
MAZE | |
# 25x25 Answer: 68 | |
I = <<~MAZE | |
8883417411585299275385931 | |
5751568986401601285559302 | |
9130721320479851367507063 | |
3252063307590455839144782 | |
6262738912379333785072993 | |
1465494599446266786375104 | |
4821210361324655738768184 | |
1946499134917746305956957 | |
6391754820349550229347959 | |
8688797399644992974795977 | |
0199338686458390183000652 | |
8995245074276460675448663 | |
6441368410510805269602194 | |
8491161758656881112888868 | |
2998957467372426061166590 | |
6323326679458154020593848 | |
2168958315131961107528288 | |
8681425227875149101281467 | |
8981010735840794148767760 | |
1917169164382218080338061 | |
4977514309120957156614084 | |
5165264055057947738746828 | |
7463876975650348122713511 | |
7614263053686338613203668 | |
7795614751802123471515016 | |
MAZE | |
# 30x30 Answer: 76 | |
J = <<~MAZE | |
309192567892746158334025029028 | |
287967805532349689501251386896 | |
357270393996718212064282126386 | |
046155150064781055582854519388 | |
587233265943835061802925662581 | |
119241172708498964196439028643 | |
215432283213635404194465153847 | |
429386540668573106564442337557 | |
759707693452256700759425289534 | |
848726588670102647729719866357 | |
372999568396090847652965122745 | |
178511785490715536435111149150 | |
226023523042121010073679232489 | |
537515542445621955137446023414 | |
061861367655259205166150680422 | |
873763648023046060932339262649 | |
147004198182084435721440904738 | |
116777978588768638933280841264 | |
456633114685926670992934811437 | |
383359323966907793783123937405 | |
779800762665466350073676157765 | |
936313771904603512527999818456 | |
550998579661921895232494628191 | |
910492522400007604235518457056 | |
952346144070456536337077182661 | |
250918893444897612174769949842 | |
769576676660331674006770662929 | |
362648133934423562447057859724 | |
931651660298095666923056183428 | |
536379029345576016216687966663 | |
MAZE | |
# 35x35 Answer: 100 | |
K = <<~MAZE | |
35916283412575666830917956191129863 | |
97233956017350632596536864535443811 | |
90839591796941581456839355578948566 | |
02285445247823992668015501253529305 | |
26606112120906980256812469175889998 | |
81784032115699226334907410914258107 | |
03509264423970810484311327939410045 | |
00272578915129369899995758910490685 | |
58957149773123731466513089962122575 | |
91798814449245811542454814144286576 | |
82947037327965224396114132407150324 | |
56288175861279926605719323931298432 | |
56097323302001571684122390867132416 | |
90259765151909780724290249942775508 | |
78258535523368429446399826879815847 | |
69205230237028185482094936491726905 | |
17849399764102566469769200260683421 | |
81582244807474902475357295964755805 | |
11527802886687981834148217753601979 | |
40893922128182915945901175447209832 | |
42132927738977529027567082367393616 | |
55449105474514226781283136249257719 | |
83902479193234749209894398318901187 | |
72604624752685155402493245511327765 | |
44223071273982978679725807498651069 | |
10190732229176111877089892235088358 | |
28118015797100314300191609967046880 | |
55817389107161856845235282492515030 | |
54297447683101526221502220242309327 | |
48074463233810809235225069895149298 | |
94803405700705881309883987756230178 | |
69325376771701152401209695486503087 | |
56758072517098062528483152708523520 | |
85089936066544623350525813672065494 | |
61778788542959110258845510564787785 | |
MAZE | |
# 40x40 Answer: 98 | |
L = <<~MAZE | |
7298437607715370122016451055326387516778 | |
4142604191019784075543552144489133878387 | |
7259223505925642841646488055082835415760 | |
7085352331897769394834982828400769567619 | |
6904677958208975289332349197758371275379 | |
0398484552912861424452748320960614369447 | |
5966321970407979456755138745732667752649 | |
8008980840122848779970259994540012278292 | |
3471615783684947344152519395680782248193 | |
5673169634964869022298941822848155368988 | |
7012349668995455905457211749107480642968 | |
3312390881256771316009750305255643952413 | |
3966282219222472100315602132695513406707 | |
7293828632170596851790675775287454325490 | |
3402699021576503484497112213290829535940 | |
4328997549859445730110248342502972003422 | |
6349732085679345183866180502977774389952 | |
4901287449722137217158236813680739759388 | |
0592004994467897601270653764372200478778 | |
1509698938354663067419534948366567589008 | |
7077941976109787011492744544973719928138 | |
6872746536350564058297147195688859116034 | |
0738232734922194305915262372721436202886 | |
6131633101200309263784296550771836807931 | |
6884433872574577283224483879350604630252 | |
3274667518233182943321925137275048214754 | |
0247741266849498192073967765871114487657 | |
6135197523409778649031050554653183484769 | |
6730847251937417400756232617862234752078 | |
8351929129428887228273891920458398544820 | |
5886491241518463903954603842520406745224 | |
7446135077537437498981833011880449537811 | |
2738021242569030113954283531173149597245 | |
7942815781491646230086601561052000896604 | |
5826867081218134887508391034917383560381 | |
6876263927419708026679186005919555083760 | |
0071879253262726749912754008121706032522 | |
2137185086103089730026931043188672202685 | |
5383099058060642461041212700718060116553 | |
7283212749541139823682403709920748370255 | |
MAZE | |
# 46x46 Answer: 120 | |
M = <<~MAZE | |
5302982202387031901372564703963623955078219368 | |
3221120756729163033277060936320622251424243776 | |
4600382861349783935703703884157568482676452291 | |
5841888228236186321169620728795399385666275896 | |
6796688083695335463357049871144291737833283263 | |
4645601634380457862136329750499232956756297314 | |
7765119860130731146051229546562531363566160493 | |
3081678971562613624000752996574052565465445407 | |
5027756676164005672839903636158298106159267930 | |
7823463335849611299882839537602728357633548509 | |
9743591248626042598189686434883389206241442355 | |
1610175541951878627963257015058464457596789349 | |
2733066156751551979711199501217039342451489480 | |
5908098716412648564671074257949952630302450687 | |
1583545984286534686136524852450123327471021551 | |
8703351311509480097827392888909041319007364657 | |
6030610063200450671234451373639399881805735500 | |
3870763189212243686491069607350581396194093823 | |
0864529333895184577996621959486285931616406370 | |
0541370086894341478487999814687962811092834167 | |
7566395408721784065707422079113801738749597282 | |
3708062130721187431285847849349551961036249637 | |
7148978408587183932008292946844511867170955337 | |
4310959507741884085365624379365221697108656043 | |
7054077044596857656133413884181165580419521303 | |
1345115694444405623189979798888799848880011593 | |
6945041625512664798553376067675539499998211781 | |
7390593467647959351794056698382089491108627615 | |
6134216956110172054445863013203562880477687128 | |
8037573866922012228581660884007679601916766498 | |
0776109375747150588172835234256950675475918502 | |
9302117722916707938253878106612807978792825047 | |
8068439267947064572802476958425329898838714317 | |
8191997198534790936277702761843505929543909931 | |
0365632735818979533661172782441425984917588967 | |
9784365347971503821784044099602480103222893638 | |
6248630818810280121319647493263299236285121989 | |
1671850915199235281643204498278530846585927202 | |
1850062991410141814012292296425243535170557411 | |
5721604064925622102877638492579171836533893377 | |
7228192134482474249486119686334448837104862759 | |
2913613025619958864937491505192004478110978216 | |
1606581645764118646785444258282540726322026121 | |
9915078440856445138626726052427455718025846639 | |
1223927738984484658191124099253017369145808229 | |
1496475482700078034882575242326884531089039717 | |
MAZE |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment