Advent of Code - Day 6, 2021

Advent of Code is back and this particular problem was fairly interesting:

Day 6 - Advent of Code 2021

The first part of the puzzle can certainly be solved with simulation. Not the second one, though. Since the second one is in the trillions, simulation will run forever. A better approach is to do the following:

1/ Use a bucket approach, where you count the instance of all numbers from 0..8

2/ Each day, save off the number of elements in bucket[0]

3/ Every bucket will receive the value from the subsequent one (j <- j+1)

4/ At the end, use the value from #2 to update bucket[6] and bucket[8]

5/ Count them all and return

The time complexity is O(9 * NDays). Since NDays is 256, this becomes ridiculously fast. Code is below, but not the answer to avoid spoilers. Cheers, ACC.


using System;
using System.Numerics;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace AdventOfCode2021
{
    class Day6
    {
        public BigInteger Puzzle1(string inputFile)
        {
            FileInfo fi = new FileInfo(inputFile);
            StreamReader sr = fi.OpenText();
            string line = sr.ReadLine().Trim();
            sr.Close();

            string[] parts = line.Split(',');
            List fish = new List();
            foreach (string part in parts) fish.Add(Int32.Parse(part));

            int NDAYS = 80;
            return LanternFishGrowth(fish, NDAYS);
        }

        public BigInteger Puzzle2(string inputFile)
        {
            FileInfo fi = new FileInfo(inputFile);
            StreamReader sr = fi.OpenText();
            string line = sr.ReadLine().Trim();
            sr.Close();

            string[] parts = line.Split(',');
            List fish = new List();
            foreach (string part in parts) fish.Add(Int32.Parse(part));

            int NDAYS = 256;
            return LanternFishGrowth(fish, NDAYS);
        }

        private BigInteger LanternFishGrowth(List fish, int nDays)
        {
            BigInteger[] timer = new BigInteger[9];

            foreach (int n in fish) timer[n]++;

            for (int i = 0; i < nDays; i++)
            {
                BigInteger timer0 = timer[0];
                for (int j = 0; j < timer.Length - 1; j++)
                    timer[j] = timer[j + 1];
                timer[6] += timer0;
                timer[8] = timer0;
            }

            BigInteger retVal = 0;
            foreach (BigInteger t in timer) retVal += t;

            return retVal;
        }
    }
}

Comments

Popular posts from this blog

Changing the root of a binary tree

ProjectEuler Problem 719 (some hints, but no spoilers)

The Power Sum, a recursive problem by HackerRank