예제 #1
0
        public void GetTriangles()
        {
            /*
             * 5987
             * 5988
             * 5990
             * 6100
             *
             * 16/9709 по X и по Y
             * 1077/9709 Ч ширина и высота треугольника
             * точка 1,1 Ч это вершина с пр¤мым углом
             *
             */

            var repo         = new ProblemsRepo();
            var snapshotJson = repo.GetSnapshot(new ApiClient());
            var ps           = snapshotJson.Problems.Where(p => p.Owner == "149");

            foreach (var problem in ps)
            {
                var pr     = repo.Get(problem.Id);
                var points = pr.Points.Distinct().ToList();
                if (points.Count == 7)
                {
                    var w     = points.Max(p => p.X);
                    var h     = points.Max(p => p.Y);
                    var minW1 = points.Select(p => p.X).Where(ww => ww > 0).Min();
                    var minW2 = points.Select(p => w - p.X).Where(ww => ww > 0).Min();
                    var minH1 = points.Select(p => p.Y).Where(hh => hh > 0).Min();
                    var minH2 = points.Select(p => h - p.Y).Where(hh => hh > 0).Min();
                    var minW  = minW1 > minW2 ? minW2 : minW1;
                    var minH  = minH1 > minH2 ? minH2 : minH1;

                    Console.WriteLine($"{problem.Id}, \"{w}\", \"{h}\", \"{minW}\", \"{minH}\", {minW1 < minW2}");
                }
            }
        }
예제 #2
0
        public void DoSomething_WhenSomething(int problemId, string s887, string s112, bool toCorner)
        {
            var repo        = new ProblemsRepo();
            var problemSpec = repo.Get(problemId);

            var v887 = (Rational)s887;
            var v112 = (Rational)s112;

            var vRate = (1 - v112) / v887;

            vRate.Denomerator.Should().Be(1, $"rate={vRate.Numerator}/{vRate.Denomerator}");

            var rate       = (int)vRate.Numerator;
            var rateOddity = 1 - rate % 2;

            var sourcePoints = new List <Vector>();
            var destPoints   = new List <Vector>();
            var facets       = new List <Facet>();

            for (int iX = 0; iX <= rate; iX++)
            {
                for (int iY = 0; iY <= rate; iY++)
                {
                    sourcePoints.Add(new Vector(iX * v887, iY * v887));
                    if ((iX + iY) % 2 == 0)
                    {
                        destPoints.Add(new Vector(v887, v887));
                    }
                    else if (iX % 2 == rateOddity)
                    {
                        destPoints.Add(new Vector(0, v887));
                    }
                    else
                    {
                        destPoints.Add(new Vector(v887, 0));
                    }
                }
            }

            for (int iX = 0; iX < rate; iX++)
            {
                for (int iY = 0; iY < rate; iY++)
                {
                    if ((iX + iY) % 2 == 0)
                    {
                        facets.Add(new Facet(iX * (rate + 1) + iY, iX * (rate + 1) + iY + 1, iX * (rate + 1) + iY + rate + 1));
                        facets.Add(new Facet(iX * (rate + 1) + iY + 1, iX * (rate + 1) + iY + rate + 1, iX * (rate + 1) + iY + rate + 2));
                    }
                    else
                    {
                        facets.Add(new Facet(iX * (rate + 1) + iY, iX * (rate + 1) + iY + 1, iX * (rate + 1) + iY + rate + 2));
                        facets.Add(new Facet(iX * (rate + 1) + iY, iX * (rate + 1) + iY + rate + 2, iX * (rate + 1) + iY + rate + 1));
                    }
                }
            }

            for (int iX = 0; iX <= rate; iX++)
            {
                sourcePoints.Add(new Vector(iX * v887, 1));
                destPoints.Add(new Vector(iX % 2 == rateOddity ? 0 : v887, v887 - v112));
            }
            for (int iY = 0; iY <= rate; iY++)
            {
                sourcePoints.Add(new Vector(1, iY * v887));
                destPoints.Add(new Vector(v887 - v112, iY % 2 == rateOddity ? 0 : v887));
            }

            for (int iX = 0; iX < rate; iX++)
            {
                var start = (rate + 1) * (rate + 1);
                facets.Add(new Facet(start + iX, start + iX + 1, (iX + 2) * (rate + 1) - 1, (iX + 1) * (rate + 1) - 1));
            }

            for (int iY = 0; iY < rate; iY++)
            {
                var start  = (rate + 1) * (rate + 2);
                var start2 = (rate + 1) * rate;
                facets.Add(new Facet(start + iY, start + iY + 1, start2 + iY + 1, start2 + iY));
            }

            sourcePoints.Add(new Vector(1, 1));
            destPoints.Add(new Vector(v887 - v112, v887 - v112));
            facets.Add(new Facet((rate + 1) * (rate + 1) - 1, (rate + 1) * (rate + 2) - 1, sourcePoints.Count - 1, sourcePoints.Count - 2));

            var solution = new SolutionSpec(sourcePoints.ToArray(), facets.ToArray(), destPoints.ToArray());

            if (toCorner)
            {
                solution = solution.Reflect(new Segment(new Vector(v887, 0), new Vector(0, v887)));
            }

            Console.Out.WriteLine($"size: {solution.Size()}; packed: {solution.Pack().Size()}");
            Console.Out.WriteLine($"facets: {solution.Facets.Length}; sourcePoints: {solution.SourcePoints.Length}; destPoints: {solution.DestPoints.Length}");

            //solution.CreateVisualizerForm().ShowDialog();


            var post = ProblemsSender.Post(solution, problemSpec.id);

            Console.Out.WriteLine(post);


            //			var v775 = (Rational)"479887358674775";
            //			var rational = v887*5 + 112;

            //			var rational = (denominator - numerator)/112;
            //			var rational = v775/112;

            //			rational.Reduce();
            //			Console.Out.WriteLine($"{rational.Numerator}/{rational.Denomerator}");
            //			Console.Out.WriteLine(2399436793374547);
            //Console.Out.WriteLine((double)(Rational)"479887358674775/2399436793374547");
        }