|  |  |  | @ -28,15 +28,44 @@ std::vector<size_t> make_histogram(const std::vector<double>& numbers, size_t bi | 
			
		
	
		
			
				
					|  |  |  |  |     double min, max; | 
			
		
	
		
			
				
					|  |  |  |  |     find_minmax(numbers, min, max); | 
			
		
	
		
			
				
					|  |  |  |  |     if (max == min) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         return bins; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         return bins;  | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     double bin_width = (max - min) / bin_count; | 
			
		
	
		
			
				
					|  |  |  |  |     for (double number : numbers) { | 
			
		
	
		
			
				
					|  |  |  |  |         size_t bin_index = static_cast<size_t>((number - min) / bin_width); | 
			
		
	
		
			
				
					|  |  |  |  |         if (bin_index >= bin_count) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             bin_index = bin_count - 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             bin_index = bin_count - 1;  | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         bins[bin_index]++; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     return bins; | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void show_histogram_svg(const std::vector<size_t>& bins) { | 
			
		
	
		
			
				
					|  |  |  |  |     const auto IMAGE_WIDTH = 400; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto IMAGE_HEIGHT = 300; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto TEXT_LEFT = 20; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto TEXT_BASELINE = 20; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto TEXT_WIDTH = 50; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto BIN_HEIGHT = 30; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto BLOCK_WIDTH = 10; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT); | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t i = 0; i < bins.size(); ++i) { | 
			
		
	
		
			
				
					|  |  |  |  |         const double bin_width = BLOCK_WIDTH * bins[i]; | 
			
		
	
		
			
				
					|  |  |  |  |         const double top = i * BIN_HEIGHT; | 
			
		
	
		
			
				
					|  |  |  |  |         svg_text(TEXT_LEFT, top + TEXT_BASELINE, std::to_string(bins[i])); | 
			
		
	
		
			
				
					|  |  |  |  |         svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "black", "#aaffaa");  | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     svg_end(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |