コード例 #1
0
        public void FizzBuzzTest()
        {
            rules.AddRule(3, "Fizz");
            rules.AddRule(5, "Buzz");

            Assert.AreEqual(rules.GetNumberAsSingleKeyword(3), "Fizz");
            Assert.AreEqual(rules.GetNumberAsSingleKeyword(5), "Buzz");

            Assert.AreEqual(rules.GetNumberAsWholeKeyword(15), "FizzBuzz");
            Assert.AreEqual(rules.GetNumberAsWholeKeyword(30), "FizzBuzz");
            Assert.AreEqual(rules.GetNumberAsWholeKeyword(315), "FizzBuzz");
            Assert.AreEqual(rules.GetNumberAsWholeKeyword(630), "FizzBuzz");
        }
コード例 #2
0
    public static (List <List <IShape> >, List <(IShape, List <IShape>)>) Run(int min, int max, uint times)
    {
        Rules rules = new Rules();

        rules.AddRule(
            new Attributes(

                ),
            (Quad quad) => {
            Vertex b1 = quad.l1.Bisect();
            Vertex b2 = quad.l2.Bisect();
            Vertex b3 = quad.l3.Bisect();
            Vertex b4 = quad.l4.Bisect();

            Vertex c = (b1 + b2 + b3 + b4) / 4f;

            Quad q4 = new Quad(rules, quad.Attributes.Copy(), (0, 0), (b4, c, b3, quad.v4));
            Quad q1 = new Quad(rules, quad.Attributes.Copy(), (1, 0), (quad.v1, b1, c, b4));
            Quad q3 = new Quad(rules, quad.Attributes.Copy(), (0, 1), (c, b2, quad.v3, b3));
            Quad q2 = new Quad(rules, quad.Attributes.Copy(), (1, 1), (b1, quad.v2, b2, c));

            if (quad.VC == null || !quad.VC.Persistant)
            {
                VirtualConnection.Connect(q4, q1, false, false, true);
                VirtualConnection.Connect(q3, q2, true, false, true);
            }

            return(new List <IShape> {
                q1, q2, q3, q4
            });
        }
コード例 #3
0
        internal IRuleDefinition <T> Define()
        {
            CurrentRule = new Rule <T>();
            Rules.AddRule(CurrentRule);

            return(this);
        }
コード例 #4
0
ファイル: Day19.cs プロジェクト: sehra/advent-of-code
    private int Solve(bool part2)
    {
        var rules = new Rules(part2);
        var tests = new List <string>();

        foreach (var line in _input)
        {
            if (line.Contains(':'))
            {
                rules.AddRule(line);
            }
            else
            {
                tests.Add(line);
            }
        }

        var regex = new Regex($"^{rules.GetRegex(0)}$", RegexOptions.Compiled);

        return(tests.Count(regex.IsMatch));
    }
コード例 #5
0
    public static (List <List <IShape> >, List <(IShape, List <IShape>)>) Run(int min, int max, uint times)
    {
        Rules rules = new Rules();

        rules.AddRule(
            new Attributes(
                ("Floors", new ScalarAttribute(3f))
                ),
            (Start start) => {
            Vertex[] v1 = start.l2.Sections(0.3f, 0.65f);
            Vertex[] v2 = start.l4.Sections(0.35f, 0.7f);

            Floor f1 = new Floor(rules, start.Attributes.Copy(), (0, 2), (start.v1, start.v2, v1[1], v2[0]));
            Floor f2 = new Floor(rules, start.Attributes.Copy(), (0, 1), (v2[0], v1[1], v1[0], v2[1]));
            Floor f3 = new Floor(rules, start.Attributes.Copy(), (0, 0), (v2[1], v1[0], start.v3, start.v4));

            return(new List <IShape> {
                f1, f2, f3
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Floors", new ScalarAttribute(2f)),
                ("Wide", new ScalarAttribute(0f))
                ),
            (Start start) => {
            Vertex[] v1 = start.l1.Sections(4);
            Vertex[] v2 = start.l3.Sections(4);

            Attributes a = start.Attributes.Copy();
            a.Set("RoofSlanted", new ScalarAttribute(1f));

            Vertical s1 = new Vertical(rules, a.Copy(), (0, 0), (start.v1, v1[3], v2[0], start.v4));
            Vertical s2 = new Vertical(rules, start.Attributes.Copy(), (1, 0), (v1[3], v1[2], v2[1], v2[0]));
            Vertical s3 = new Vertical(rules, start.Attributes.Copy(), (2, 0), (v1[2], v1[1], v2[2], v2[1]));
            Vertical s4 = new Vertical(rules, start.Attributes.Copy(), (3, 0), (v1[1], v1[0], v2[3], v2[2]));
            Vertical s5 = new Vertical(rules, a.Copy(), (4, 0), (v1[0], start.v2, start.v3, v2[3]));

            VirtualConnection.Connect(s1, s5, true, false, true);

            return(new List <IShape> {
                s1, s2, s3, s4, s5
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Floors", new ScalarAttribute(2f)),
                ("Wide", new ScalarAttribute(1f))
                ),
            (Start start) => {
            Vertex[] v1 = start.l1.Sections(10);
            Vertex[] v2 = start.l3.Sections(10);

            Vertical s1  = new Vertical(rules, start.Attributes.Copy(), (0, 0), (start.v1, v1[9], v2[0], start.v4));
            Vertical s2  = new Vertical(rules, start.Attributes.Copy(), (1, 0), (v1[9], v1[8], v2[1], v2[0]));
            Vertical s3  = new Vertical(rules, start.Attributes.Copy(), (2, 0), (v1[8], v1[7], v2[2], v2[1]));
            Vertical s4  = new Vertical(rules, start.Attributes.Copy(), (3, 0), (v1[7], v1[6], v2[3], v2[2]));
            Vertical s5  = new Vertical(rules, start.Attributes.Copy(), (4, 0), (v1[6], v1[5], v2[4], v2[3]));
            Vertical s6  = new Vertical(rules, start.Attributes.Copy(), (5, 0), (v1[5], v1[4], v2[5], v2[4]));
            Vertical s7  = new Vertical(rules, start.Attributes.Copy(), (6, 0), (v1[4], v1[3], v2[6], v2[5]));
            Vertical s8  = new Vertical(rules, start.Attributes.Copy(), (7, 0), (v1[3], v1[2], v2[7], v2[6]));
            Vertical s9  = new Vertical(rules, start.Attributes.Copy(), (8, 0), (v1[2], v1[1], v2[8], v2[7]));
            Vertical s10 = new Vertical(rules, start.Attributes.Copy(), (9, 0), (v1[1], v1[0], v2[9], v2[8]));
            Vertical s11 = new Vertical(rules, start.Attributes.Copy(), (10, 0), (v1[0], start.v2, start.v3, v2[9]));

            return(new List <IShape> {
                s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSlanted", new ScalarAttribute(0f))
                ),
            (Vertical vertical) => {
            Vertex[] v1 = vertical.l2.Sections(0.3f, 0.65f);
            Vertex[] v2 = vertical.l4.Sections(0.35f, 0.7f);

            Section s1 = new Section(rules, vertical.Attributes.Copy(), (0, 2), (vertical.v1, vertical.v2, v1[1], v2[0]));
            Section s2 = new Section(rules, vertical.Attributes.Copy(), (0, 1), (v2[0], v1[1], v1[0], v2[1]));
            Roof r     = new Roof(rules, vertical.Attributes.Copy(), (0, 0), (v2[1], v1[0], vertical.v3, vertical.v4));

            return(new List <IShape> {
                s1, s2, r
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSlanted", new ScalarAttribute(1f))
                ),
            (Vertical vertical) => {
            Vertex[] v1 = vertical.l2.Sections(0.3f, 0.65f);
            Vertex[] v2 = vertical.l4.Sections(0.35f, 0.7f);

            Section s = new Section(rules, vertical.Attributes.Copy(), (0, 2), (vertical.v1, vertical.v2, v1[1], v2[0]));
            Roof r    = new Roof(rules, vertical.Attributes.Copy(), (0, 1), (v2[0], v1[1], v1[0], v2[1]));

            return(new List <IShape> {
                s, r
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSlanted", new ScalarAttribute(1f))
                ),
            (Roof roof) => {
            Vertex v = roof.l2.Bisect();
            Triad t  = new Triad(rules, roof.Attributes.Copy(), (0, 0), (v, roof.v1, roof.v2));

            return(new List <IShape> {
                t
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSize", new ScalarAttribute(1f)),
                ("RoofSlanted", new ScalarAttribute(0f))
                ),
            (Roof roof) => {
            Vertex v1 = roof.l2.Bisect(0.6f);
            Vertex v2 = roof.l4.Bisect(0.4f);

            Quad q = new Quad(rules, roof.Attributes.Copy(), (0, 0), (roof.v2, v1, v2, roof.v1));

            return(new List <IShape> {
                q
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSize", new ScalarAttribute(2f)),
                ("RoofSlanted", new ScalarAttribute(0f))
                ),
            (Roof roof) => {
            Vertex v1 = roof.l2.Bisect(0.7f);
            Vertex v2 = roof.l4.Bisect(0.3f);

            Quad q = new Quad(rules, roof.Attributes.Copy(), (0, 0), (roof.v2, v1, v2, roof.v1));

            return(new List <IShape> {
                q
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSize", new ScalarAttribute(3f)),
                ("RoofSlanted", new ScalarAttribute(0f))
                ),
            (Roof roof) => {
            Vertex v1 = roof.l2.Bisect(0.8f);
            Vertex v2 = roof.l4.Bisect(0.2f);

            Quad q = new Quad(rules, roof.Attributes.Copy(), (0, 0), (roof.v2, v1, v2, roof.v1));

            return(new List <IShape> {
                q
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Sections", new ScalarAttribute(5f))
                ),
            (Floor floor) => {
            Vertex[] v1 = floor.l1.Sections(4);
            Vertex[] v2 = floor.l3.Sections(4);

            Section s1 = new Section(rules, floor.Attributes.Copy(), (0, 0), (floor.v1, v1[3], v2[0], floor.v4));
            Section s2 = new Section(rules, floor.Attributes.Copy(), (1, 0), (v1[3], v1[2], v2[1], v2[0]));
            Section s3 = new Section(rules, floor.Attributes.Copy(), (2, 0), (v1[2], v1[1], v2[2], v2[1]));
            Section s4 = new Section(rules, floor.Attributes.Copy(), (3, 0), (v1[1], v1[0], v2[3], v2[2]));
            Section s5 = new Section(rules, floor.Attributes.Copy(), (4, 0), (v1[0], floor.v2, floor.v3, v2[3]));

            return(new List <IShape> {
                s1, s2, s3, s4, s5
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Sections", new ScalarAttribute(4f))
                ),
            (Floor floor) => {
            Vertex[] v1 = floor.l1.Sections(3);
            Vertex[] v2 = floor.l3.Sections(3);

            Section s1 = new Section(rules, floor.Attributes.Copy(), (0, 0), (floor.v1, v1[2], v2[0], floor.v4));
            Section s2 = new Section(rules, floor.Attributes.Copy(), (1, 0), (v1[2], v1[1], v2[1], v2[0]));
            Section s3 = new Section(rules, floor.Attributes.Copy(), (2, 0), (v1[1], v1[0], v2[2], v2[1]));
            Section s4 = new Section(rules, floor.Attributes.Copy(), (4, 0), (v1[0], floor.v2, floor.v3, v2[2]));

            return(new List <IShape> {
                s1, s2, s3, s4
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Door", new ScalarAttribute(0f)),
                ("Corn", new ScalarAttribute(1f)),
                ("Bar", new ScalarAttribute(1f)),
                ("Stairs", new ScalarAttribute(0f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l2.Sections(0.1f, 0.85f);
            Vertex[] v2 = section.l4.Sections(0.15f, 0.9f);

            Attributes a = section.Attributes.Copy();
            a.Set("Corn", new ScalarAttribute(0f));
            a.Set("Bar", new ScalarAttribute(0f));

            Attributes b = a.Copy();
            b.Set("R", new ScalarAttribute(255f));
            b.Set("G", new ScalarAttribute(255f));
            b.Set("B", new ScalarAttribute(255f));

            Cornice c = new Cornice(rules, b.Copy(), (0, 0), (section.v1, section.v2, v1[1], v2[0]));
            Section s = new Section(rules, a, (0, 1), (v2[0], v1[1], v1[0], v2[1]));
            Bar bar   = new Bar(rules, b.Copy(), (0, 2), (v2[1], v1[0], section.v3, section.v4));

            return(new List <IShape> {
                c, s, bar
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Door", new ScalarAttribute(0f)),
                ("Corn", new ScalarAttribute(1f)),
                ("Bar", new ScalarAttribute(0f)),
                ("Stairs", new ScalarAttribute(0f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l2.Sections(0.1f);
            Vertex[] v2 = section.l4.Sections(0.9f);

            Attributes a = section.Attributes.Copy();
            a.Set("Corn", new ScalarAttribute(0f));
            a.Set("Bar", new ScalarAttribute(0f));

            Attributes b = a.Copy();
            b.Set("R", new ScalarAttribute(255f));
            b.Set("G", new ScalarAttribute(255f));
            b.Set("B", new ScalarAttribute(255f));

            Section s = new Section(rules, a, (0, 0), (section.v1, section.v2, v1[0], v2[0]));
            Cornice c = new Cornice(rules, b, (0, 1), (v2[0], v1[0], section.v3, section.v4));

            return(new List <IShape> {
                s, c
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Corn", new ScalarAttribute(0f)),
                ("Bar", new ScalarAttribute(0f)),
                ("Door", new ScalarAttribute(0f)),
                ("Sections", new ScalarAttribute(4f)),
                ("Stairs", new ScalarAttribute(0f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l1.Sections(0.25f, 0.75f);
            Vertex[] v2 = section.l3.Sections(0.25f, 0.75f);

            Line l1 = new Line(v1[0], v2[1]);
            Line l2 = new Line(v1[1], v2[0]);

            Vertex[] v3 = l1.Sections(0.1f, 0.82f);
            Vertex[] v4 = l2.Sections(0.1f, 0.82f);

            Quad q1 = new Quad(rules, section.Attributes.Copy(), (0, 0), (section.v1, section.v4, v2[0], v1[1]));
            Quad q2 = new Quad(rules, section.Attributes.Copy(), (0, 2), (v1[0], v2[1], section.v3, section.v2));

            Quad q3 = new Quad(rules, section.Attributes.Copy(), (0, 3), (v2[0], v4[0], v3[0], v2[1]));
            Quad q4 = new Quad(rules, section.Attributes.Copy(), (0, 4), (v1[1], v4[1], v3[1], v1[0]));

            Attributes a = section.Attributes.Copy();
            a.Set("R", new ScalarAttribute(255f));
            a.Set("G", new ScalarAttribute(255f));
            a.Set("B", new ScalarAttribute(255f));

            Window w = new Window(rules, a, (1, 0), (v4[0], v4[1], v3[1], v3[0]));

            return(new List <IShape> {
                q1, q2, q3, q4, w
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Corn", new ScalarAttribute(0f)),
                ("Bar", new ScalarAttribute(0f)),
                ("Door", new ScalarAttribute(0f)),
                ("Sections", new ScalarAttribute(5f)),
                ("Stairs", new ScalarAttribute(0f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l1.Sections(0.2f, 0.8f);
            Vertex[] v2 = section.l3.Sections(0.2f, 0.8f);

            Line l1 = new Line(v1[0], v2[1]);
            Line l2 = new Line(v1[1], v2[0]);

            Vertex[] v3 = l1.Sections(0.1f, 0.82f);
            Vertex[] v4 = l2.Sections(0.1f, 0.82f);

            Quad q1 = new Quad(rules, section.Attributes.Copy(), (0, 0), (section.v1, section.v4, v2[0], v1[1]));
            Quad q2 = new Quad(rules, section.Attributes.Copy(), (0, 2), (v1[0], v2[1], section.v3, section.v2));

            Quad q3 = new Quad(rules, section.Attributes.Copy(), (0, 3), (v2[0], v4[0], v3[0], v2[1]));
            Quad q4 = new Quad(rules, section.Attributes.Copy(), (0, 4), (v1[1], v4[1], v3[1], v1[0]));

            Window w = new Window(rules, section.Attributes.Copy(), (1, 0), (v4[0], v4[1], v3[1], v3[0]));

            return(new List <IShape> {
                q1, q2, q3, q4, w
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Stairs", new ScalarAttribute(1f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l1.Sections(0.15f, 0.85f);
            Vertex[] v2 = section.l3.Sections(0.15f, 0.85f);

            Quad q1 = new Quad(rules, section.Attributes.Copy(), (0, 0), (section.v1, section.v4, v2[0], v1[1]));
            Quad q2 = new Quad(rules, section.Attributes.Copy(), (0, 2), (v1[0], v2[1], section.v3, section.v2));

            Window w = new Window(rules, section.Attributes.Copy(), (1, 0), (v2[0], v1[1], v1[0], v2[1]));

            return(new List <IShape> {
                q1, q2, w
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Door", new RangeAttribute(1f, 2f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l2.Sections(0.20f, 0.25f);
            Vertex[] v2 = section.l4.Sections(0.75f, 0.8f);

            Line l = new Line(v1[1], v2[0]);

            Vertex[] v3 = l.Sections(0.07f, 0.93f);
            Vertex[] v4 = section.l1.Sections(0.07f, 0.93f);


            // Upper area
            Door door  = new Door(rules, section.Attributes.Copy(), (1, 0), (v4[1], v4[0], v3[1], v3[0]));
            Quad mid   = new Quad(rules, section.Attributes.Copy(), (2, 0), (v2[0], v1[1], v1[0], v2[1]));
            Quad upper = new Quad(rules, section.Attributes.Copy(), (3, 0), (v2[1], v1[0], section.v3, section.v4));

            // Sides
            Quad side1 = new Quad(rules, section.Attributes.Copy(), (0, 1), (section.v1, v2[0], v3[0], v4[1]));
            Quad side2 = new Quad(rules, section.Attributes.Copy(), (1, 1), (section.v2, v4[0], v3[1], v1[1]));

            return(new List <IShape> {
                door, mid, upper, side1, side2
            });
        }
            );

        rules.AddRule(
            new Attributes(

                ),
            (Window window) => {
            Vertex[] v1 = window.l1.Sections(0.05f, 0.95f);
            Vertex[] v2 = window.l3.Sections(0.05f, 0.95f);

            Line l1 = new Line(v1[0], v2[1]);
            Line l2 = new Line(v1[1], v2[0]);

            Vertex[] v3 = l1.Sections(0.1f, 0.9f);
            Vertex[] v4 = l2.Sections(0.1f, 0.9f);

            Quad q1 = new Quad(rules, window.Attributes.Copy(), (0, 0), (window.v1, window.v4, v2[0], v1[1]));
            Quad q2 = new Quad(rules, window.Attributes.Copy(), (0, 2), (v1[0], v2[1], window.v3, window.v2));

            Quad q3 = new Quad(rules, window.Attributes.Copy(), (0, 3), (v2[0], v4[0], v3[0], v2[1]));
            Quad q4 = new Quad(rules, window.Attributes.Copy(), (0, 4), (v1[1], v4[1], v3[1], v1[0]));

            Glass g = new Glass(rules, window.Attributes.Copy(), (1, 0), (v4[0], v4[1], v3[1], v3[0]));

            return(new List <IShape> {
                q1, q2, q3, q4, g
            });
        }
コード例 #6
0
 private void AddRule(Rule <T> rule)
 {
     rule.Engine = this;
     Rules.AddRule(rule);
 }
コード例 #7
0
    public static (List <List <IShape> >, List <(IShape, List <IShape>)>) Run(int min, int max, uint times)
    {
        Rules rules = new Rules();

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(0f))
                ),
            (Quad quad) => {
            Vertex b1 = quad.l1.Bisect();
            Vertex b2 = quad.l2.Bisect();
            Vertex b3 = quad.l3.Bisect();
            Vertex b4 = quad.l4.Bisect();

            Vertex c = (b1 + b2 + b3 + b4) / 4f;

            Quad q4 = new Quad(rules, quad.Attributes.Copy(), (0, 0), (b4, c, b3, quad.v4));
            Quad q1 = new Quad(rules, quad.Attributes.Copy(), (1, 0), (quad.v1, b1, c, b4));
            Quad q3 = new Quad(rules, quad.Attributes.Copy(), (0, 1), (c, b2, quad.v3, b3));
            Quad q2 = new Quad(rules, quad.Attributes.Copy(), (1, 1), (b1, quad.v2, b2, c));

            return(new List <IShape> {
                q1, q2, q3, q4
            });
        });

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(1f))
                ),
            (Quad quad) => {
            Vertex th = quad.l1.Bisect();

            Triad t1 = new Triad(rules, quad.Attributes.Copy(), (quad.v1, th, quad.v4));
            Triad t2 = new Triad(rules, quad.Attributes.Copy(), (quad.v4, th, quad.v3));
            Triad t3 = new Triad(rules, quad.Attributes.Copy(), (th, quad.v2, quad.v3));

            return(new List <IShape> {
                t1, t2, t3
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(2f))
                ),
            (Quad quad) => {
            Vertex[] v1 = quad.l1.Sections(2);
            Vertex[] v2 = quad.l3.Sections(2);

            Attributes na = quad.Attributes.Copy();
            na.Set("Wave", new ScalarAttribute(3f));

            Quad q1 = new Quad(rules, na.Copy(), (quad.v1, v1[1], v2[0], quad.v4));
            Quad q2 = new Quad(rules, na.Copy(), (v1[1], v1[0], v2[1], v2[0]));
            Quad q3 = new Quad(rules, na.Copy(), (v1[0], quad.v2, quad.v3, v2[1]));

            return(new List <IShape> {
                q1, q2, q3
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(3f))
                ),
            (Quad quad) => {
            return(new List <IShape>());
        }
            );

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(4f))
                ),
            (Quad quad) => {
            Vertex[] v1 = quad.l1.Sections(2);
            Vertex[] v2 = quad.l2.Sections(2);
            Vertex[] v3 = quad.l3.Sections(2);
            Vertex[] v4 = quad.l4.Sections(2);

            Vertex c1 = v1[1] * 0.75f + v2[0] * 0.25f;
            Vertex c2 = v1[1] * 0.25f + v2[0] * 0.75f;
            Vertex c3 = v3[1] * 0.75f + v4[0] * 0.25f;
            Vertex c4 = v3[1] * 0.25f + v4[0] * 0.75f;

            Attributes qa = quad.Attributes.Copy();
            qa.Set("Wave", new ScalarAttribute(3f));

            // Quads
            // Quad q1 = new Quad(rules, qa.Copy(), (v1[0], c1, c4, v4[1]));
            // Quad q2 = new Quad(rules, qa.Copy(), (c1, v1[1], v2[0], c2));
            // Quad q3 = new Quad(rules, qa.Copy(), (v3[0], c3, c2, v2[1]));
            // Quad q4 = new Quad(rules, qa.Copy(), (v4[0], c4, c3, v3[1]));
            // Quad q5 = new Quad(rules, qa.Copy(), (c1, c2, c3, c4));

            // Triangles
            Triad t1 = new Triad(rules, qa.Copy(), (quad.v1, v1[1], v4[0]));
            Triad t2 = new Triad(rules, qa.Copy(), (v1[1], v1[0], c1));
            Triad t3 = new Triad(rules, qa.Copy(), (v1[0], quad.v2, v2[1]));
            Triad t4 = new Triad(rules, qa.Copy(), (c2, v2[1], v2[0]));
            Triad t5 = new Triad(rules, qa.Copy(), (v3[1], v2[0], quad.v3));
            Triad t6 = new Triad(rules, qa.Copy(), (v3[0], c3, v3[1]));
            Triad t7 = new Triad(rules, qa.Copy(), (quad.v4, v4[1], v3[0]));
            Triad t8 = new Triad(rules, qa.Copy(), (v4[1], v4[0], c4));

            // return new List<IShape> {q1, q2, q3, q4, t1, t2, t3, t4, t5, t6, t7, t8};
            return(new List <IShape> {
                t1, t2, t3, t4, t5, t6, t7, t8
            });
        }
            );

        rules.AddRule(null, (Triad triad) => {
            return(new List <IShape>());
        });

        Quad start = new Quad(
            rules,
            new Attributes(
                ("Wave", new ScalarAttribute(0f))
                ),
            (new Vertex(min, max),
             new Vertex(max, max),
             new Vertex(max, min),
             new Vertex(min, min))
            );

        // Define the control grammar
        Control control = new Control();

        // Add a simple control grammar that evokes WFC1
        control.Grammar.AddRule("S", ((0, 0), "WFC1"));

        // Add a WFC
        control.AddWFC("WFC1");
        control.WFC["WFC1"].AddRule("A", ("Wave", 0f, "S"), 1f, "B", "C");
        control.WFC["WFC1"].AddRule("B", ("Wave", 1f, ""), 1f, "A", "C", "D");
        control.WFC["WFC1"].AddRule("C", ("Wave", 2f, ""), 1f, "A", "B", "D");
        control.WFC["WFC1"].AddRule("D", ("Wave", 4f, ""), 1f, "B", "C");

        start.Control.Add("S");

        // List<IShape> shapes = Interpreter.Interpret(start, 10);
        List <List <IShape> > shapes = Interpreter2.Interpret(start, rules, control, times);

        return(shapes, rules.RuleExamples(100f));
    }
コード例 #8
0
    public static void Main(string[] args)
    {
        // build up a very simple vowel inventory
        // make sure features are within simple set in Inventory's place/manner/voicing
        Inventory inventory = new Inventory();

        inventory.AddConsonant("b", "voiced", "bilabial", "plosive");
        inventory.AddConsonant("p", "voiceless", "bilabial", "plosive");
        inventory.AddConsonant("g", "voiced", "velar", "plosive");
        inventory.AddConsonant("k", "voiceless", "velar", "plosive");
        inventory.AddConsonant("d", "voiced", "dental", "plosive");
        inventory.AddConsonant("t", "voiceless", "dental", "plosive");
        inventory.AddConsonant("h", "voiceless", "glottal", "fricative");
        inventory.AddConsonant("l", "voiced", "alveolar", "lateral");
        inventory.AddConsonant("r", "voiced", "alveolar", "approximant");
        inventory.AddConsonant("w", "voiced", "velar", "approximant");
        // build up very simple consonant inventory
        // make sure features are within simple set in Inventory's height/backness/rounding
        inventory.AddVowel("i", "close", "front", "unrounded");
        inventory.AddVowel("a", "open", "central", "unrounded");
        inventory.AddVowel("u", "close", "back", "rounded");

        // recall features using any letter
        Debug.Log(inventory.GetFeatures("b"));

        // This finds "b":
        List <string> testFeaturesList = new List <string> {
            "voiced", "bilabial", "plosive"
        };

        inventory.GetLetter(testFeaturesList);
        // This will not find "b":
        testFeaturesList [0] = "bilabial";
        testFeaturesList [1] = "voiced";
        inventory.GetLetter(testFeaturesList);

        Syllable syllableStructure = new Syllable();

        syllableStructure.AddStructure(new List <string> {
            "C", "V"
        });
        syllableStructure.AddStructure(new List <string> {
            "C", "V", "V"
        });
        syllableStructure.AddStructure(new List <string> {
            "C", "V", "C"
        });
        syllableStructure.AddStructure(new List <string> {
            "C", "V", "V", "C"
        });

        Rules rules = new Rules();

        rules.AddRule("voiced", "voiceless", "_ voiceless");

        Affixes affixes = new Affixes();

        // add prefixes and suffixes
        // trusts you to use only characters found in inventory (matters for rule application)
        affixes.AddAffix("human", "-", "g", "u", "d");
        affixes.AddAffix("nonhuman", "-", "i", "d");
        affixes.AddAffix("strong", "t", "-");
        affixes.AddAffix("small", "l", "-");
        affixes.AddAffix("strange", "g", "-");

        // TODO structure language
        Language language = new Language(inventory, syllableStructure, rules, affixes);

        // build a long proper noun
        List <string> properNoun = language.BuildWord(3, true, "strong", "nonhuman");

        Debug.Log(string.Join("", properNoun.ToArray()));

        // build a short regular noun
        List <string> justSomeNoun = language.BuildWord(2);

        // add both to the dictionary
        language.AddEntry(properNoun, "Wolf");
        language.AddEntry(justSomeNoun, "food");
        Debug.Log(language.PrintDictionary());
    }
コード例 #9
0
    public static (List <List <IShape> >, List <(IShape, List <IShape>)>) Run(int min, int max, uint times)
    {
        Rules rules = new Rules();

        rules.AddRule(
            new Attributes(
                ("Diamond", new ScalarAttribute(1f))
                ),
            (Quad quad) => {
            Vertex nv1 = quad.l1.Bisect(0.5f);
            Vertex nv2 = quad.l2.Bisect(0.5f);
            Vertex nv3 = quad.l3.Bisect(0.5f);
            Vertex nv4 = quad.l4.Bisect(0.5f);

            // A quad with the vertices as bipartitions of original's edges
            Attributes attrs = new Attributes(quad.Attributes);
            if (quad.Attributes.Get("Angle").Start == 1f)
            {
                attrs.Set("Angle", new ScalarAttribute(0f));
            }


            else
            {
                attrs.Set("Angle", new ScalarAttribute(1f));
            }

            Quad q = new Quad(
                rules,
                attrs,
                (1, 0),
                (nv1, nv2, nv3, nv4)
                );

            // Triangles
            Triad t1 = new Triad(rules, quad.Attributes.Copy(), (0, 0), (nv1, quad.v2, nv2));
            Triad t2 = new Triad(rules, quad.Attributes.Copy(), (0, 1), (nv2, quad.v3, nv3));
            Triad t3 = new Triad(rules, quad.Attributes.Copy(), (0, 2), (nv3, quad.v4, nv4));
            Triad t4 = new Triad(rules, quad.Attributes.Copy(), (0, 3), (nv4, quad.v1, nv1));

            return(new List <IShape> {
                q, t1, t2, t3, t4
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Angle", new ScalarAttribute(0f))
                ),

            (Quad quad) => {
            Vertex[] nv1 = quad.l1.Sections(3);
            Vertex[] nv2 = quad.l3.Sections(3);

            Quad q1 = new Quad(rules, quad.Attributes.Copy(), (0, 0), (quad.v1, nv1[2], nv2[0], quad.v4));
            Quad q2 = new Quad(rules, quad.Attributes.Copy(), (1, 0), (nv1[2], nv1[1], nv2[1], nv2[0]));
            Quad q3 = new Quad(rules, quad.Attributes.Copy(), (2, 0), (nv1[1], nv1[0], nv2[2], nv2[1]));
            Quad q4 = new Quad(rules, quad.Attributes.Copy(), (3, 0), (nv1[0], quad.v2, quad.v3, nv2[2]));

            return(new List <IShape> {
                q1, q2, q3, q4
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Angle", new ScalarAttribute(1f))
                ),

            (Quad quad) => {
            Vertex nv1 = quad.l1.Bisect(0.5f);
            Vertex nv2 = quad.l3.Bisect(0.5f);

            Quad q1 = new Quad(rules, quad.Attributes.Copy(), (0, 0), (quad.v1, nv1, nv2, quad.v4));
            Quad q2 = new Quad(rules, quad.Attributes.Copy(), (1, 0), (nv1, quad.v2, quad.v3, nv2));

            return(new List <IShape> {
                q1, q2
            });
        }
            );

        rules.AddRule(null, (Triad triad) => {
            return(new List <IShape> {
                new Epsilon()
            });
        });

        rules.AddRule(null, (Triad triad) => {
            return(new List <IShape>());
        });

        Quad start = new Quad(
            rules,
            new Attributes(
                ("Angle", new ScalarAttribute(0f)),
                ("Diamond", new ScalarAttribute(0f))
                ),
            (new Vertex(min, max),
             new Vertex(max, max),
             new Vertex(max, min),
             new Vertex(min, min))
            );

        start.Control.Add("A");

        // Define the control grammar
        Control control = new Control();

        control.Grammar.AddRule("A", new string[] { "N", "Y", "Y" });
        control.Grammar.AddRule("N", ((~0u, 0), "Diamond", 0f, ""));
        control.Grammar.AddRule("Y", ((1, 0), "Diamond", 1f, "A"));
        control.Grammar.AddRule("Y", ((2, 0), "Diamond", 1f, "A"));

        // List<IShape> shapes = Interpreter.Interpret(start, 10);
        List <List <IShape> > shapes = Interpreter2.Interpret(start, rules, control, times);

        return(shapes, null);
    }