public static void CreatePalka(State state, List <ActionBase> result, int type = 0)
        {
            var k = type == 0 ? 0 : 1;

            while (true)
            {
                var boosters = state.Boosters.Where(b => b.Type == BoosterType.Extension).ToList();

                if (!boosters.Any())
                {
                    return;
                }

                var map         = state.Map;
                var me          = state.SingleWorker;
                var pathBuilder = new PathBuilder(map, me.Position, false);

                var best = boosters.OrderBy(b => pathBuilder.Distance(b.Position)).First();

                var actions = pathBuilder.GetActions(best.Position);

                var y = k / 2 + 2;
                y = k % 2 == 0 ? -y : y;
                var add = new UseExtension(new V(1, y));

                if (type == 0)
                {
                    k++;
                }
                else
                {
                    k += 2;
                }

                actions.Add(add);

                state.ApplyRange(actions);
                result.AddRange(actions);
            }
        }
        public static void CloneAttack(State state, List <List <ActionBase> > result)
        {
            if (state.Boosters.All(b => b.Type != BoosterType.MysteriousPoint))
            {
                return;
            }

            while (true)
            {
                var boosters = state.Boosters.Where(b => b.Type == BoosterType.Cloning).ToList();

                if (!boosters.Any())
                {
                    break;
                }

                var map         = state.Map;
                var me          = state.SingleWorker;
                var pathBuilder = new PathBuilder(map, me.Position, false);
                var best        = boosters.OrderBy(b => pathBuilder.Distance(b.Position)).First();

                var actions = pathBuilder.GetActions(best.Position);

                state.ApplyRange(actions);
                result[0].AddRange(actions);
            }

            if (state.CloningCount == 0)
            {
                return;
            }

            var mboosters    = state.Boosters.Where(b => b.Type == BoosterType.MysteriousPoint).ToList();
            var mpathBuilder = new PathBuilder(state.Map, state.SingleWorker.Position, false);
            var mbest        = mboosters.OrderBy(b => mpathBuilder.Distance(b.Position)).First();
            var mactions     = mpathBuilder.GetActions(mbest.Position);

            state.ApplyRange(mactions);
            result[0].AddRange(mactions);

            while (state.CloningCount > 0)
            {
                var cactions = new List <(Worker w, ActionBase action)>();
                for (var i = 0; i < state.Workers.Count; i++)
                {
                    var w = state.Workers[i];
                    if (cactions.Count < state.CloningCount)
                    {
                        var useCloning = new UseCloning();
                        cactions.Add((w, useCloning));
                        result[i].Add(useCloning);
                        result.Add(new List <ActionBase>());
                    }
                    else
                    {
                        var wait = new Wait();
                        cactions.Add((w, wait));
                        result[i].Add(wait);
                    }
                }

                state.Apply(cactions);
            }
        }