forked from Bananymous/banan-os
				
			AOC2023: Implement 10 hour solution to day19 part2
This commit is contained in:
		
							parent
							
								
									64323c51e6
								
							
						
					
					
						commit
						4146f2777b
					
				| 
						 | 
				
			
			@ -1,8 +1,12 @@
 | 
			
		|||
#include <BAN/Array.h>
 | 
			
		||||
#include <BAN/HashMap.h>
 | 
			
		||||
#include <BAN/HashSet.h>
 | 
			
		||||
#include <BAN/Sort.h>
 | 
			
		||||
#include <BAN/String.h>
 | 
			
		||||
#include <BAN/Vector.h>
 | 
			
		||||
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -192,8 +196,74 @@ i64 puzzle1(FILE* fp)
 | 
			
		|||
 | 
			
		||||
i64 puzzle2(FILE* fp)
 | 
			
		||||
{
 | 
			
		||||
	(void)fp;
 | 
			
		||||
	return -1;
 | 
			
		||||
	auto workflows = parse_workflows(fp);
 | 
			
		||||
 | 
			
		||||
	BAN::Array<BAN::HashSet<i64>, 4> values;
 | 
			
		||||
	for (const auto& workflow : workflows)
 | 
			
		||||
	{
 | 
			
		||||
		for (const auto& rule : workflow.value)
 | 
			
		||||
		{
 | 
			
		||||
			if (rule.comparison != Comparison::Always)
 | 
			
		||||
			{
 | 
			
		||||
				MUST(values[rule.operand1].insert(rule.operand2));
 | 
			
		||||
				MUST(values[rule.operand1].insert(rule.operand2 + 1));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for (i64 i = 0; i < 4; i++)
 | 
			
		||||
	{
 | 
			
		||||
		MUST(values[i].insert(1));
 | 
			
		||||
		MUST(values[i].insert(4001));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BAN::Array<BAN::Vector<i64>, 4> values_sorted;
 | 
			
		||||
	for (i64 i = 0; i < 4; i++)
 | 
			
		||||
	{
 | 
			
		||||
		MUST(values_sorted[i].reserve(values[i].size()));
 | 
			
		||||
		for (i64 value : values[i])
 | 
			
		||||
			MUST(values_sorted[i].push_back(value));
 | 
			
		||||
		BAN::sort::sort(values_sorted[i].begin(), values_sorted[i].end());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	i64 result = 0;
 | 
			
		||||
	for (u64 xi = 0; xi < values_sorted[0].size() - 1; xi++)
 | 
			
		||||
	{
 | 
			
		||||
		timespec time_start;
 | 
			
		||||
		clock_gettime(CLOCK_MONOTONIC, &time_start);
 | 
			
		||||
 | 
			
		||||
		for (u64 mi = 0; mi < values_sorted[1].size() - 1; mi++)
 | 
			
		||||
		{
 | 
			
		||||
			for (u64 ai = 0; ai < values_sorted[2].size() - 1; ai++)
 | 
			
		||||
			{
 | 
			
		||||
				for (u64 si = 0; si < values_sorted[3].size() - 1; si++)
 | 
			
		||||
				{
 | 
			
		||||
					Item item {{
 | 
			
		||||
						values_sorted[0][xi],
 | 
			
		||||
						values_sorted[1][mi],
 | 
			
		||||
						values_sorted[2][ai],
 | 
			
		||||
						values_sorted[3][si]
 | 
			
		||||
					}};
 | 
			
		||||
					if (!is_accepted(item, "in"sv, workflows))
 | 
			
		||||
						continue;
 | 
			
		||||
					
 | 
			
		||||
					i64 x_count = values_sorted[0][xi + 1] - values_sorted[0][xi];
 | 
			
		||||
					i64 m_count = values_sorted[1][mi + 1] - values_sorted[1][mi];
 | 
			
		||||
					i64 a_count = values_sorted[2][ai + 1] - values_sorted[2][ai];
 | 
			
		||||
					i64 s_count = values_sorted[3][si + 1] - values_sorted[3][si];
 | 
			
		||||
 | 
			
		||||
					result += x_count * m_count * a_count * s_count;
 | 
			
		||||
				}	
 | 
			
		||||
			}	
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		timespec time_stop;
 | 
			
		||||
		clock_gettime(CLOCK_MONOTONIC, &time_stop);
 | 
			
		||||
 | 
			
		||||
		u64 duration_us = (time_stop.tv_sec * 1'000'000 + time_stop.tv_nsec / 1'000) - (time_start.tv_sec * 1'000'000 + time_start.tv_nsec / 1'000);
 | 
			
		||||
		printf("took %lu.%03lu ms, estimate %lu s\n", duration_us / 1000, duration_us % 1000, (values_sorted[0].size() - xi - 2) * duration_us / 1'000'000);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue