Added day 6 solution.
This commit is contained in:
		
							parent
							
								
									6f71ac93cb
								
							
						
					
					
						commit
						aa2d9cd442
					
				| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
Time:        41     96     88     94
 | 
			
		||||
Distance:   214   1789   1127   1055
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
Time:      7  15   30
 | 
			
		||||
Distance:  9  40  200
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
import std.stdio;
 | 
			
		||||
import std.array;
 | 
			
		||||
import std.algorithm;
 | 
			
		||||
import std.string;
 | 
			
		||||
import std.conv;
 | 
			
		||||
import std.math;
 | 
			
		||||
 | 
			
		||||
struct Race {
 | 
			
		||||
    long time, dist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Race[] parseRaces(string filename) {
 | 
			
		||||
    string[] lines = File(filename).byLineCopy.array;
 | 
			
		||||
    long[] times = lines[0].split(":")[1].strip.split.map!(to!long).array;
 | 
			
		||||
    long[] distances = lines[1].split(":")[1].strip.split.map!(to!long).array;
 | 
			
		||||
    Race[] result = new Race[](times.length);
 | 
			
		||||
    foreach (size_t i, long time; times) {
 | 
			
		||||
        result[i] = Race(time, distances[i]);
 | 
			
		||||
    }
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Race parseKernedRace(string filename) {
 | 
			
		||||
    string[] lines = File(filename).byLineCopy.array;
 | 
			
		||||
    long time = lines[0].split(":")[1].strip.split.join.to!long;
 | 
			
		||||
    long dist = lines[1].split(":")[1].strip.split.join.to!long;
 | 
			
		||||
    return Race(time, dist);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long computeSolutions(in Race r) {
 | 
			
		||||
    double D = r.time * r.time - 4 * r.dist;
 | 
			
		||||
    double t1 = (-r.time + sqrt(D)) / -2;
 | 
			
		||||
    double t2 = (-r.time - sqrt(D)) / -2;
 | 
			
		||||
    long minWinningTime = cast(long) (ceil(t1) == t1 ? t1 + 1 : ceil(t1));
 | 
			
		||||
    long maxWinningTime = cast(long) (floor(t2) == t2 ? t2 - 1 : floor(t2));
 | 
			
		||||
    return maxWinningTime - minWinningTime + 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void part1() {
 | 
			
		||||
    parseRaces("input.txt").map!computeSolutions.fold!((a, b) => a * b).writeln;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void part2() {
 | 
			
		||||
    parseKernedRace("input.txt").computeSolutions.writeln;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void main() {
 | 
			
		||||
    part1();
 | 
			
		||||
    part2();
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue