2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								id: 594810f028c0303b75339ad7
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								title: Zhang-Suen thinning algorithm
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								challengeType: 5
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								forumTopicId: 302347
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								dashedName: zhang-suen-thinning-algorithm
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --description--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								This is an algorithm used to thin a black and white i.e. one bit per pixel images. For example, with an input image of:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const testImage1 = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '                               ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '#########       ########       ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '###   ####     ####  ####      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '###    ###     ###    ###      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '###   ####     ###             ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '#########      ###             ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '### ####       ###    ###      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '###  ####  ### ####  #### ###  ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '###   #### ###  ########  ###  ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 '                               '
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								It produces the thinned output:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[ '                               ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '########         ######        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#      #        ##             ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#       #       #              ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#      #        #              ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###### #        #              ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#     ##        #              ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#      #    #   ##    ##   #   ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#       #         ####         ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                               ' ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Algorithm
  
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Assume black pixels are one and white pixels zero, and that the input image is a rectangular N by M array of ones and zeroes. The algorithm operates on all black pixels P1 that can have eight neighbours. The neighbours are, in order, arranged as:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								$$\begin{array}{|c|c|c|} \\hline P9 &  P2              &  P3\\\\ \\hline P8 &  \boldsymbol{P1} &  P4\\\\ \\hline P7 &  P6              &  P5\\\\ \\hline \end{array}$$
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Obviously the boundary pixels of the image cannot have the full eight neighbours.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								-  Define $A(P1)$ = the number of transitions from white to black, ($0 \to 1$) in the sequence P2, P3, P4, P5, P6, P7, P8, P9, P2. (Note the extra P2 at the end - it is circular). 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								-  Define $B(P1)$ = the number of black pixel neighbours of P1. ($= \\sum(P2 \ldots P9)$) 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**Step 1:**
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								All pixels are tested and pixels satisfying all the following conditions (simultaneously) are just noted at this stage.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  The pixel is black and has eight neighbours 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  $2 \le B(P1) \le 6$ 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  $A(P1) = 1$ 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  At least one of $P2$, $P4$ and $P6$ is white 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								5.  At least one of $P4$, $P6$ and $P8$ is white 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								After iterating over the image and collecting all the pixels satisfying all step 1 conditions, all these condition satisfying pixels are set to white.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**Step 2:**
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								All pixels are again tested and pixels satisfying all the following conditions are just noted at this stage.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  The pixel is black and has eight neighbours 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  $2 \le B(P1) \le 6$ 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  $A(P1) = 1$ 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  At least one of $P2$, $P4$ and $P8$ is white 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								5.  At least one of $P2$, $P6$ and $P8$ is white 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								After iterating over the image and collecting all the pixels satisfying all step 2 conditions, all these condition satisfying pixels are again set to white.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**Iteration:**
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								If any pixels were set in this round of either step 1 or step 2 then all steps are repeated until no image pixels are so changed.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --instructions--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Write a routine to perform Zhang-Suen thinning on the provided `image` , an array of strings, where each string represents single line of the image. In the string, `#`  represents black pixel, and whitespace represents white pixel. Function should return thinned image, using the same representation.
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --hints--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`thinImage`  should be a function. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								assert.equal(typeof thinImage, 'function');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`thinImage`  should return an array. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								assert(Array.isArray(thinImage(_testImage1)));
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`thinImage`  should return an array of strings. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								assert.equal(typeof thinImage(_testImage1)[0], 'string');
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								`thinImage(testImage1)`  should return a thinned image as in the example. 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								assert.deepEqual(thinImage(_testImage1), expected1);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`thinImage(testImage2)`  should return a thinned image. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								assert.deepEqual(thinImage(_testImage2), expected2);
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --seed--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## --after-user-code--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const _testImage1 = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                               ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#########       ########       ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###   ####     ####  ####      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###    ###     ###    ###      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###   ####     ###             ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#########      ###             ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '### ####       ###    ###      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###  ####  ### ####  #### ###  ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###   #### ###  ########  ###  ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                               '
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const expected1 = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                               ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '########         ######        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#      #        ##             ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#       #       #              ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#      #        #              ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###### #        #              ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#     ##        #              ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#      #    #   ##    ##   #   ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#       #         ####         ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                               '
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const _testImage2 = [
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  '                                                          ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' #################                   #############        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' ##################               ################        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' ###################            ##################        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' ########     #######          ###################        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '   ######     #######         #######       ######        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '   ######     #######        #######                      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '   #################         #######                      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '   ################          #######                      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '   #################         #######                      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '   ######     #######        #######                      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '   ######     #######        #######                      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '   ######     #######         #######       ######        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' ########     #######          ###################        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' ########     ####### ######    ################## ###### ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' ########     ####### ######      ################ ###### ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' ########     ####### ######         ############# ###### ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                                                          '];
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const expected2 = [
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  '                                                          ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                                                          ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '    # ##########                       #######            ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     ##        #                   ####       #           ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #          #                 ##                      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #          #                #                        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #          #                #                        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #          #                #                        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     ############               #                         ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #          #               #                         ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #          #                #                        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #          #                #                        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #          #                #                        ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #                            ##                      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '     #                             ############           ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                       ###                          ###   ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                                                          ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                                                          '
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## --seed-contents--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								function thinImage(image) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2021-07-16 11:03:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const testImage1 = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                               ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#########       ########       ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###   ####     ####  ####      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###    ###     ###    ###      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###   ####     ###             ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '#########      ###             ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '### ####       ###    ###      ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###  ####  ### ####  #### ###  ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '###   #### ###  ########  ###  ',
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  '                               '
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								];
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 10:13:49 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# --solutions--
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								function Point(x, y) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.x = x;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.y = y;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const ZhangSuen = (function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  function ZhangSuen() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.nbrs = [[0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0], [-1, -1], [0, -1]];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.nbrGroups = [[[0, 2, 4], [2, 4, 6]], [[0, 2, 6], [0, 4, 6]]];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.toWhite = [];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.main = function (image) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ZhangSuen.grid = new Array(image);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for (let r = 0; r <  image.length ;  r + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ZhangSuen.grid[r] = image[r].split('');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ZhangSuen.thinImage();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return ZhangSuen.getResult();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.thinImage = function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let firstStep = false;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let hasChanged;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    do {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      hasChanged = false;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      firstStep = !firstStep;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for (let r = 1; r <  ZhangSuen.grid.length  -  1 ;  r + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for (let c = 1; c <  ZhangSuen.grid [ 0 ] . length  -  1 ;  c + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if (ZhangSuen.grid[r][c] !== '#') {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          const nn = ZhangSuen.numNeighbors(r, c);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if (nn <  2  | |  nn  >  6) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if (ZhangSuen.numTransitions(r, c) !== 1) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if (!ZhangSuen.atLeastOneIsWhite(r, c, firstStep ? 0 : 1)) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          ZhangSuen.toWhite.push(new Point(c, r));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          hasChanged = true;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for (let i = 0; i <  ZhangSuen.toWhite.length ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const p = ZhangSuen.toWhite[i];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ZhangSuen.grid[p.y][p.x] = ' ';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ZhangSuen.toWhite = [];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } while ((firstStep || hasChanged));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.numNeighbors = function (r, c) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let count = 0;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for (let i = 0; i <  ZhangSuen.nbrs.length  -  1 ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if (ZhangSuen.grid[r + ZhangSuen.nbrs[i][1]][c + ZhangSuen.nbrs[i][0]] === '#') {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        count++;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return count;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.numTransitions = function (r, c) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let count = 0;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for (let i = 0; i <  ZhangSuen.nbrs.length  -  1 ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if (ZhangSuen.grid[r + ZhangSuen.nbrs[i][1]][c + ZhangSuen.nbrs[i][0]] === ' ') {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if (ZhangSuen.grid[r + ZhangSuen.nbrs[i + 1][1]][c + ZhangSuen.nbrs[i + 1][0]] === '#') {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          count++;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return count;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.atLeastOneIsWhite = function (r, c, step) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let count = 0;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const group = ZhangSuen.nbrGroups[step];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for (let i = 0; i <  2 ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for (let j = 0; j <  group [ i ] . length ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const nbr = ZhangSuen.nbrs[group[i][j]];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if (ZhangSuen.grid[r + nbr[1]][c + nbr[0]] === ' ') {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          count++;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          break;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return count > 1;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ZhangSuen.getResult = function () {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const result = [];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for (let i = 0; i <  ZhangSuen.grid.length ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const row = ZhangSuen.grid[i].join('');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      result.push(row);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return result;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return ZhangSuen;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}());
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								function thinImage(image) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return ZhangSuen.main(image);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```