public int GoPaint()
 {
     MagicSmokeComputer.ProgramMode state = MagicSmokeComputer.ProgramMode.Start;
     state = Brain.Run(state);
     while (state == MagicSmokeComputer.ProgramMode.NeedInput)
     {
         Point pNow = new Point(XNow, YNow);
         if (!HullDict.ContainsKey(pNow))
         {
             // add hull section as black
             HullDict.Add(pNow, 0);
         }
         Brain.InputPort = HullDict[pNow];
         state           = Brain.Run(state);
         if (Brain.OutputQueueSize() > 0)
         {
             // get the color
             HullDict[pNow] = Brain.OutputPort();
             long turn = Brain.OutputPort();
             Turn(turn);
             Move();
         }
     }
     return(HullDict.Count);
 }
Esempio n. 2
0
        public Point FindOxygenSystem()
        {
            MagicSmokeComputer.ProgramMode state = MagicSmokeComputer.ProgramMode.Start;
            Point pos = null;
            // start point (0, 0) and moveable (1). Others wall (0), Oxy system (2)
            Point p = new Point(0, 0);

            HullDict.Add(p, 1);

            // north (1), south (2), west (3), and east (4)
            int direction = 1;

            while (state != MagicSmokeComputer.ProgramMode.Stop)
            {
                Brain.InputPort = direction;
                state           = Brain.Run(state);
                if (Brain.OutputQueueSize() > 0)
                {
                    long moved = Brain.OutputPort();
                    p = GetPointFromDirection(direction);
                    switch (moved)
                    {
                    case 0:
                        // wall
                        HullDict.TryAdd(p, 0);
                        // do not update X, Y
                        // change direction
                        direction = NextDirection(direction);
                        break;

                    case 1:
                        // clear space
                        HullDict.TryAdd(p, 1);
                        // update X, Y
                        XNow = p.X;
                        YNow = p.Y;
                        // keep going
                        //direction = NextDirection(direction);
                        break;

                    case 2:
                        // the oxygen system!
                        HullDict.TryAdd(p, 2);
                        pos = p;
                        // update X, Y
                        XNow = p.X;
                        YNow = p.Y;
                        // stop
                        //direction = NextDirection(direction);
                        state = MagicSmokeComputer.ProgramMode.Stop;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException($"moved is {moved}");
                    }
                }
            }
            return(pos);
        }
        public void Day13Part1_TestSolution()
        {
            List <long> pgm = DayDataUtilities.ReadMagicSmokePgmFromFile("day13.txt");

            Assert.NotNull(pgm);

            var sut = new MagicSmokeComputer(pgm);

            MagicSmokeComputer.ProgramMode status = MagicSmokeComputer.ProgramMode.Start;
            do
            {
                status = sut.Run(status);
            } while (status != MagicSmokeComputer.ProgramMode.Stop);
            Assert.Equal(MagicSmokeComputer.ProgramMode.Stop, status);

            // analyze the out put queue
            PointEqualityComparer   peqc          = new PointEqualityComparer();
            Dictionary <Point, int> dictGameBoard = new Dictionary <Point, int>(peqc);

            do
            {
                int   x      = (int)sut.OutputPort();
                int   y      = (int)sut.OutputPort();
                int   tileId = (int)sut.OutputPort();
                Point p      = new Point(x, y);
                if (dictGameBoard.ContainsKey(p))
                {
                    dictGameBoard[p] = tileId;
                }
                else
                {
                    dictGameBoard.Add(p, tileId);
                }
            } while (sut.OutputQueueSize() > 0);
            Assert.NotEmpty(dictGameBoard);
            int blocktiles = 0;

            foreach (var tile in dictGameBoard.Values)
            {
                if (tile == 2)
                {
                    blocktiles++;
                }
            }
            //int blockedTiles = dictGameBoard.Values.Select(t => t == 2).ToList().Count();
            Assert.Equal(268, blocktiles);
        }
Esempio n. 4
0
        static void Main(string[] args)
        {
            Console.WriteLine("Day13 Part 2 Start!");
            List<long> pgm = DayDataUtilities.ReadMagicSmokePgmFromFile("day13.txt");
            int blockedTiles = 0;
            int val = 0;
            var sut = new MagicSmokeComputer(pgm);
            Point pscore = new Point(-1, 0);
            Point ball = null;
            Point paddle = null;
            PointEqualityComparer peqc = new PointEqualityComparer();
            Dictionary<Point, int> dictGameBoard = new Dictionary<Point, int>(peqc);
            sut.Coins = 2;
            MagicSmokeComputer.ProgramMode status = MagicSmokeComputer.ProgramMode.Start;
            do
            {
                status = sut.Run(status);

                // dump out the screen
                while (sut.OutputQueueSize() > 0)
                {
                    int x = (int)sut.OutputPort();
                    int y = (int)sut.OutputPort();
                    int tileId = (int)sut.OutputPort();
                    Point p = new Point(x, y);
                    if (dictGameBoard.ContainsKey(p))
                    {
                        dictGameBoard[p] = tileId;
                    }
                    else
                    {
                        dictGameBoard.Add(p, tileId);
                    }
                }
                // print the score 
                //Console.Clear();
                //foreach (Point p in dictGameBoard.Keys)
                //{
                //    if (p.X != -1)
                //    {
                //        WriteAt(p, dictGameBoard[p]);
                //    }
                //}
                blockedTiles = 0;
                foreach (var item in dictGameBoard)
                {
                    if (item.Value == 2)
                    {
                        blockedTiles++;
                    }
                    if (item.Value == 3)
                    {
                        paddle = item.Key;
                    }
                    if (item.Value == 4)
                    {
                        ball = item.Key;
                    }
                }
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Score: {0}", dictGameBoard[pscore]);
                Console.WriteLine("Tiles: {0}", blockedTiles);
                Console.WriteLine();
                // put the input here
                if (ball.X < paddle.X)
                {
                    // left
                    val = -1;
                }
                else if (ball.X > paddle.X)
                {
                    // right
                    val = 1;
                }
                else
                {
                    val = 0;
                }
                sut.InputPort = val;
            } while (status != MagicSmokeComputer.ProgramMode.Stop);

            Console.WriteLine("Day13 Part 2 Done!");
        }