From d4ce5bf0b0bf28eb5e818ea8c271bf06702349a4 Mon Sep 17 00:00:00 2001 From: James Schloss Date: Tue, 13 Oct 2020 18:27:44 -0400 Subject: [PATCH 1/3] fixing unnecessary color function --- contents/flood_fill/code/c/a.out | Bin 0 -> 17536 bytes contents/flood_fill/code/c/flood_fill.c | 12 +++------- contents/flood_fill/code/julia/flood_fill.jl | 22 ++++-------------- contents/flood_fill/code/python/flood_fill.py | 11 ++++----- contents/flood_fill/flood_fill.md | 11 --------- 5 files changed, 11 insertions(+), 45 deletions(-) create mode 100755 contents/flood_fill/code/c/a.out diff --git a/contents/flood_fill/code/c/a.out b/contents/flood_fill/code/c/a.out new file mode 100755 index 0000000000000000000000000000000000000000..f5c314b7a8bea8e0924b7a2546964a4c0cfe94cb GIT binary patch literal 17536 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 c.max_y || p.x >= c.max_x) ? 0 : 1; } -void color(struct canvas c, struct point p, int old_val, int new_val) { - if (inbounds(p, c) && c.data[p.x + c.max_x * p.y] == old_val) { - c.data[p.x + c.max_x * p.y] = new_val; - } -} - int find_neighbors(struct canvas c, struct point p, int old_val, int new_val, struct point *neighbors) { int cnt = 0; @@ -93,7 +87,7 @@ void stack_fill(struct canvas c, struct point p, int old_val, int new_val) { while (!stack_empty(stk)) { struct point cur_loc = stack_pop(&stk); if (c.data[cur_loc.x + c.max_x * cur_loc.y] == old_val) { - color(c, cur_loc, old_val, new_val); + c.data[cur_loc.x + c.max_x * cur_loc.y] = new_val; struct point neighbors[4]; int cnt = find_neighbors(c, cur_loc, old_val, new_val, neighbors); @@ -163,7 +157,7 @@ void queue_fill(struct canvas c, struct point p, int old_val, int new_val) { while (!queue_empty(q)) { struct point cur_loc = dequeue(&q); if (c.data[cur_loc.x + c.max_x * cur_loc.y] == old_val) { - color(c, cur_loc, old_val, new_val); + c.data[cur_loc.x + c.max_x * cur_loc.y] = new_val; struct point neighbors[4]; int cnt = find_neighbors(c, cur_loc, old_val, new_val, neighbors); @@ -184,7 +178,7 @@ void recursive_fill(struct canvas c, struct point p, int old_val, return; } - color(c, p, old_val, new_val); + c.data[p.x + c.max_x * p.y] = new_val; struct point neighbors[4]; int cnt = find_neighbors(c, p, old_val, new_val, neighbors); diff --git a/contents/flood_fill/code/julia/flood_fill.jl b/contents/flood_fill/code/julia/flood_fill.jl index 7658ac808..bc42ac9d0 100644 --- a/contents/flood_fill/code/julia/flood_fill.jl +++ b/contents/flood_fill/code/julia/flood_fill.jl @@ -20,20 +20,6 @@ function inbounds(canvas_size, loc) end end -function color!(canvas, loc::CartesianIndex, old_val, new_val) - # bounds check, do not color if no in bounds! - if !inbounds(size(canvas), loc) - return - end - - # Only change color if the element value is the old value - if (canvas[loc] != old_val) - return - else - canvas[loc] = new_val - end -end - function find_neighbors(canvas, loc::CartesianIndex, old_val, new_val) # Finding north, south, east, west neighbors @@ -65,7 +51,7 @@ function stack_fill!(canvas, loc::CartesianIndex, old_val, new_val) while length(s) > 0 current_loc = pop!(s) if canvas[current_loc] == old_val - color!(canvas, current_loc, old_val, new_val) + canvas[current_loc] = new_val possible_neighbors = find_neighbors(canvas, current_loc, old_val, new_val) for neighbor in possible_neighbors @@ -86,7 +72,7 @@ function queue_fill!(canvas, loc::CartesianIndex, old_val, new_val) enqueue!(q, loc) # Coloring the initial location - color!(canvas, loc, old_val, new_val) + canvas[loc] = new_val while length(q) > 0 current_loc = dequeue!(q) @@ -96,7 +82,7 @@ function queue_fill!(canvas, loc::CartesianIndex, old_val, new_val) # Coloring as we are enqueuing neighbors for neighbor in possible_neighbors - color!(canvas, neighbor, old_val, new_val) + canvas[neighbor] = new_val enqueue!(q,neighbor) end @@ -109,7 +95,7 @@ function recursive_fill!(canvas, loc::CartesianIndex, old_val, new_val) return end - color!(canvas, loc, old_val, new_val) + canvas[loc] = new_val possible_neighbors = find_neighbors(canvas, loc, old_val, new_val) for possible_neighbor in possible_neighbors diff --git a/contents/flood_fill/code/python/flood_fill.py b/contents/flood_fill/code/python/flood_fill.py index 0d22599f5..5b346fa39 100644 --- a/contents/flood_fill/code/python/flood_fill.py +++ b/contents/flood_fill/code/python/flood_fill.py @@ -7,9 +7,6 @@ def inbounds(canvas_shape, p): return min(p) >= 0 and p.x < canvas_shape[0] and p.y < canvas_shape[1] -def color(canvas, p, new_val): - canvas[p] = new_val - def find_neighbors(canvas, p, old_val, new_val): # north, south, east, west neighbors possible_neighbors = [ @@ -35,7 +32,7 @@ def stack_fill(canvas, p, old_val, new_val): while stack: cur_loc = stack.pop() - color(canvas, cur_loc, new_val) + canvas[cur_loc] = new_val stack += find_neighbors(canvas, cur_loc, old_val, new_val) def queue_fill(canvas, p, old_val, new_val): @@ -45,21 +42,21 @@ def queue_fill(canvas, p, old_val, new_val): q = Queue() q.put(p) - color(canvas, p, new_val) + canvas[p] = new_val while not q.empty(): cur_loc = q.get() neighbors = find_neighbors(canvas, cur_loc, old_val, new_val) for neighbor in neighbors: - color(canvas, neighbor, new_val) + canvas[neighbor] = new_val q.put(neighbor) def recursive_fill(canvas, p, old_val, new_val): if old_val == new_val: return - color(canvas, p, new_val) + canvas[p] = new_val neighbors = find_neighbors(canvas, p, old_val, new_val) for neighbor in neighbors: diff --git a/contents/flood_fill/flood_fill.md b/contents/flood_fill/flood_fill.md index 9cf00c577..a180c8a9a 100644 --- a/contents/flood_fill/flood_fill.md +++ b/contents/flood_fill/flood_fill.md @@ -112,17 +112,6 @@ In code, it might look like this: [import:58-66, lang="python"](code/python/flood_fill.py) {% endmethod %} -All code snippets for this chapter rely on an exterior `color` function, defined as - -{% method %} -{% sample lang="jl" %} -[import:23-35, lang:"julia"](code/julia/flood_fill.jl) -{% sample lang="c" %} -[import:28-32, lang:"c"](code/c/flood_fill.c) -{% sample lang="py" %} -[import:10-11, lang="python"](code/python/flood_fill.py) -{% endmethod %} - The above code continues recursing through available neighbors as long as neighbors exist, and this should work so long as we are adding the correct set of neighbors. Additionally, it is possible to do the same type of traversal by managing a stack, like so: From 325988fa6cddb848dacc85b16a12011a7b9c48ed Mon Sep 17 00:00:00 2001 From: James Schloss Date: Tue, 13 Oct 2020 18:36:29 -0400 Subject: [PATCH 2/3] fixing line numbers --- contents/flood_fill/flood_fill.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/contents/flood_fill/flood_fill.md b/contents/flood_fill/flood_fill.md index a180c8a9a..7c350100c 100644 --- a/contents/flood_fill/flood_fill.md +++ b/contents/flood_fill/flood_fill.md @@ -87,11 +87,11 @@ In code, this might look like this: {% method %} {% sample lang="jl" %} -[import:37-55, lang:"julia"](code/julia/flood_fill.jl) +[import:23-41, lang:"julia"](code/julia/flood_fill.jl) {% sample lang="c" %} -[import:34-52, lang:"c"](code/c/flood_fill.c) +[import:28-46, lang:"c"](code/c/flood_fill.c) {% sample lang="py" %} -[import:13-28, lang="python"](code/python/flood_fill.py) +[import:10-25, lang="python"](code/python/flood_fill.py) {% endmethod %} @@ -105,11 +105,11 @@ In code, it might look like this: {% method %} {% sample lang="jl" %} -[import:106-118, lang:"julia"](code/julia/flood_fill.jl) +[import:92-104, lang:"julia"](code/julia/flood_fill.jl) {% sample lang="c" %} -[import:180-195, lang:"c"](code/c/flood_fill.c) +[import:174-189, lang:"c"](code/c/flood_fill.c) {% sample lang="py" %} -[import:58-66, lang="python"](code/python/flood_fill.py) +[import:55-63, lang="python"](code/python/flood_fill.py) {% endmethod %} The above code continues recursing through available neighbors as long as neighbors exist, and this should work so long as we are adding the correct set of neighbors. @@ -118,11 +118,11 @@ Additionally, it is possible to do the same type of traversal by managing a stac {% method %} {% sample lang="jl" %} -[import:57-77, lang:"julia"](code/julia/flood_fill.jl) +[import:43-63, lang:"julia"](code/julia/flood_fill.jl) {% sample lang="c" %} -[import:85-108, lang:"c"](code/c/flood_fill.c) +[import:79-102, lang:"c"](code/c/flood_fill.c) {% sample lang="py" %} -[import:30-39, lang="python"](code/python/flood_fill.py) +[import:27-36, lang="python"](code/python/flood_fill.py) {% endmethod %} This is ultimately the same method of traversal as before; however, because we are managing our own data structure, there are a few distinct differences: @@ -159,11 +159,11 @@ The code would look something like this: {% method %} {% sample lang="jl" %} -[import:80-104, lang:"julia"](code/julia/flood_fill.jl) +[import:66-90, lang:"julia"](code/julia/flood_fill.jl) {% sample lang="c" %} -[import:155-178, lang:"c"](code/c/flood_fill.c) +[import:149-172, lang:"c"](code/c/flood_fill.c) {% sample lang="py" %} -[import:41-56, lang="python"](code/python/flood_fill.py) +[import:38-53, lang="python"](code/python/flood_fill.py) {% endmethod %} Now, there is a small trick in this code that must be considered to make sure it runs optimally. From 82abae98c88b1127dc662ec19a43a053d49db9bd Mon Sep 17 00:00:00 2001 From: James Schloss Date: Wed, 14 Oct 2020 21:53:13 -0400 Subject: [PATCH 3/3] removing binary file --- contents/flood_fill/code/c/a.out | Bin 17536 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 contents/flood_fill/code/c/a.out diff --git a/contents/flood_fill/code/c/a.out b/contents/flood_fill/code/c/a.out deleted file mode 100755 index f5c314b7a8bea8e0924b7a2546964a4c0cfe94cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17536 zcmeHP4{%(?dEdLUunhJ|c0^FY;2Q#|Olu(<+m$g6ce0-S1QG}%QD?wBpLA#IhLcW6 zcOZN0B1RVBhuPKI0W zvs&Bkvv!1IanThG$K#1s(b*O2NbV4=s?{ECZ|&SA+EvT4T6@CQj#x)H9@`y-4WvdZ z8R|+}?crF5*wGb@3IZuT){4#bbu}BURh27OJJnomRplCC)ipI(k!V+RXRJFJ?P_Y+ z7*BLWo5C$|vc9uD(V?wdN_0j+42g2di>&g>|7bo^P2nEkVbpmZJn^Sr$0eU9?$cOV zEVhU;@&VmWT^?INn!RXK;dO)O`_N*APwMr7@kWhr4=O(6+#bJK;goOW85=ZtkZiw5ZF-bDGbr27QJWq?&-BXn-%*<$>CSYb zP5!QYx6VF!uW7$!_MM(=Y^on9dL56N=D;FLk`3?UK`(o$7ka-OGzT_3jEXr>w42Df zspO>?>c3a2p)SZylq~CoZE;jn$loF5*W5y6`6s45X&!#>X7lir&-A=vp8O z1I5{i9VN?ZbNb|8?}kOt6{#DV&Ats^g`_a;pCuQW=?(9pk-fAR|7Kb-m{*EUqw3jq zbVp^$vVG)+IJzTOr+AaSGdm&M3>&7scgnO+l1uhSru}`>HYQBFIg>V~`bT=MP8%0M zu1GguNE@fu9of4$-8_{xCQzGyh%V6CqC?chwxiNk-#eW!RA+xwZ@*q|ziHZ|rkxr_ z7l&Z-pxtnw);5Of?S}mkGd=Ix3Mitxsg)z6#&NQeHV)dxSlW2DZ^UC8uc0X`<3McV zl;lnjHv{fz;!*{kg8R;>ae_>o-EF2DhRt;Ip|o+r+;669Umi2OsgjhtfuXI)3{%+3X+>>sasfv>L=n_am(ywHx*! zt$GVmDsAjrZ}gVzyBJw&4j99*DKj;b`b3WCQ3c9DjsQCI3W(XRk~fLzKBq$Xw}<^l>SC>@$X7bZEVCV9!r!fz75yvZ+Ja)Ntl3Wm4a< z0POgvRb&e>xx%C0~B6{_aC z!zKM*y0Y+u{M9O@NJ6SlBCMwUZ<)7#tp^|tH&Xwy16Wvo+${M92_8|PNv?t^WG;IS zqlN1u7mjDiie_TT$=3@)uK{}Z!#L4(a(zE%4y^v6^f%owWqQs@fBres;#h(jlHBXG zX@)gw7clt-A5UZ)S1vXQ|_mm-4pt0KzS4T zs{hpqJ&E!Dw-Y*xS?`|E+0^meeEtC~yLvuX!}mPqQ?pO!lfQCJ=k3!M&0$QnL#})A zv_!oXwNI{WL%gyLr5g_Dm2DVT{!re^_V$Mqh!gtue)hWb zUJ|D}TbJ8J$o!_#?^r@}_Whai4JkeO_2^oZ9mp`Cy|n_~Ccxm1aSh%z>{3 zaSf#Ex9LqK)|wB@XYc@p8P|7Y-e`Xt*hp3}+8=jnolY(3)OvIc7Kc&&6pQ1I&MBuh z;nYq$wT!O8VgRxH6pJR<%Ex-A*67rloZ42d8G};XctVl=iae>vkRk^ZIjG39iVQ3A zydpBZqsB|BHKNEdMUE>XALT}kF}jAM#%qdh1Sx?YBeOvNz4XqaJhJ8>#=K{pQ`< zLidEWh3*Ym?mZCoM>|oXa-Zt#OzE1;mESc29xRzn(e7m6&QyDQxNFyqfjxo7aCi5D zrbIFv7n@@7c%UJgY)eGC1A#pYu8l0XLH=Cgxx%-eeiObFf0_5QS(?;6li4gS1NY;y zmtt}F4rmqVo5-C;(Ca?PW;;PQfDVG5038PP{1SSgWuTLwyK&PfMN0kzvsd#p85uTn> z&lL;j7n3i9)3*jg7z=IQMeTg~Q{6SFuEyWgd+3vJf9WQF`7I@vJXqW-ZoYi|bvImd zHNm8N5B|Q07}OIG@|Qm1-MHu??`HI%_bKrl*&A&~urT!`4e+~ZQZoc=+j{XJUWw;h=-2Bd*{!;k09Q@hr-vs_r@OR|- zA9nn|2Y3sv>2|k$@7+%Sd%*uI@aZ>XXM9_7{XYr*pMn2ap8YR5_Fn>CM7iMB_ulH* zKL!38@MrV?0{9i+$MWn)9Q#X=JNIKrmiH;=`n~DczX|*`$hnrh{ZWZH>0G#$zS@ox6WVw6`$b`49qk96^|9w`l}wf$n;nD&EM<~cKEA9 z{;H6_qQ)Pn@t4>5OKbea^7muObibS{a}k(}z+438A}|+$xd_ZfU@ii45tu0g z{JkK5A4reDRKkjgg_`mQiu~=~!K)O5UUN|4?+~w0O@XbAESGD_-y<&7ZRVfR?K$vdg-@V9v7x=s5|chPD>1Qm)$WLZWu<$WK28z}c6;K^T_ zK^Z@&9b>;)pT8aC{_%^K91m2bD7KigEq}=dh*vPO&2h%IPquH-_OWG^ZO3ou{9hFQ zuDr1CwQ~21ZHlIMX}Uwx2Q+;|)30m#H=44&?Lk%Bym8}=feL(iy*#k8s&Z9j6$^X{ z_2ElVJ{RB?qc3dv`}Ta?Co+8DT?`+-v*o;V!T8>^NN~R8;};3e%Y1yk;Om!<7ppHA z+#u>cu|RM>xmiAOv6FZCII_GTe#G}-b_Qm|7dhuN^6mHq&)a;wM2LVJQFR|Wt)3BI zEGB2fmpJQy+nP^&M)3U4$IHY_dFI30BmN#aU;eYsJkG~26I+9BMAdzwT(r%I^Qx88 zq4_vZoRe>XbEuH(AAO_E`4iAgcrv5>m9yX#z`bITm?*ej*J->|f1iz}EcE#{$@99b zVR0ua9@n^d9kC=nJDTKYfX@_%*~ax-CL8zVib6c8xEg#6aQu$lbsL63PE(GyDlasxWUK)OH@$DJtJNLG=-h|EiLK~JB%_tBIKzX6l??9`v5r_0Kx5)Mw8VPs;M`~sysK<+MSYq%TrUqARm^Zb5ZJS7P%zu zPeoHvE85S$~o|+L!-jind)v6JG){LtF^roLB)|a&Lz5dGag`zb||;Bg#_uj58CDXAS%0e zwI{o6Q{kF}!L1Z?4-O4)%jhPaDLtOM=pepP0KKw3VxCJ=+yl-QA5jQEIYYJ7wcGkLCas-aqmA`a*ebGo^hRo?ab&-oH<-AZxjNQLS8?_38PPa)