public bool IsPrime(int candidate, int degree) { int mx = _primes.Max(); if (mx >= Convert.ToInt32(Math.Sqrt(candidate))) { var t = Execute(2, candidate / 2, degree); } return(CheckPrime(candidate)); }
public List <int> Execute(int minPrime, int maxPrime, int degree) { var subTasks = new Task[degree]; int mx = _primes.Max(); if (mx < maxPrime) { int current = mx + 1; for (int i = 0; i < degree; i++, current++) { int c1 = current; subTasks[i] = new Task(() => { if (CheckPrime(c1)) { AddToPrimesList(c1); } }); subTasks[i].Start(); } while (current < maxPrime) { int t = Task.WaitAny(subTasks); int c = current; subTasks[t].Dispose(); subTasks[t] = new Task(() => { if (CheckPrime(c)) { AddToPrimesList(c); } }); subTasks[t].Start(); current++; } Task.WaitAll(subTasks); } return(_primes.ToList()); }
public object Solve() { var program = GetProgram(); var input = new BlockingCollection <long>(); var output = new BlockingCollection <long>(); var computer = new IntcodeComputer(); var runTask = Task.Run(() => { while (!computer.IsHalted) { computer.Run(program, input, output); } }); long answer = 0; var summingTask = Task.Run(() => { var currentLocation = new Point(0, 0); var view = new Dictionary <Point, char>(); while (!computer.IsHalted || output.Count > 0) { if (!output.TryTake(out var result, TimeSpan.FromMilliseconds(25))) { break; } if (result == Ascii.NewLine) { Console.WriteLine(); currentLocation = new Point(0, currentLocation.Y + 1); } else { var character = (char)result; Console.Write(character); view[currentLocation] = character; currentLocation = new Point(currentLocation.X + 1, currentLocation.Y); } } var movementRules = GetMovementRules(view); var movementInstructions = GenerateMovementInstructions(movementRules); // As instructed program = GetProgram(2); foreach (var movementInstruction in movementInstructions) { input.Add(movementInstruction); } computer.Run(program, input, output); answer = output.Max(); }); Task.WaitAll(runTask, summingTask); return(answer); }