コード例 #1
0
    public FractionData GetRandomByDifficulty(Constants.Difficulty difficulty, bool forceProper = false, bool forceAlwaysOne = false, bool forceNumeratorOne = false)
    {
        Debug.Log("forceProper: " + forceProper + ", forceAlwaysOne: " + forceAlwaysOne + ", forceNumeratorOne: " + forceNumeratorOne);
        //if (difficulty == Constants.Difficulty.EASY)
        //    throw new ArgumentException("Easy difficulty can't have improper fractions!");

        List <FractionData> fractionData = Data[(int)difficulty];

        if (forceAlwaysOne)
        {
            fractionData = fractionData.Where(fd => fd.Value.numerator == fd.Value.denominator).ToList();
        }
        else if (forceNumeratorOne)
        {
            fractionData = fractionData.Where(fd => fd.Value.numerator == 1).ToList();
        }
        else if (forceProper)
        {
            fractionData = fractionData.Where(fd => fd.Value.numerator < fd.Value.denominator).ToList();
        }

        /* Choose a random bit of data from the list */
        FractionData choice = fractionData[UnityEngine.Random.Range(0, fractionData.Count)];

        return(choice);
    }
コード例 #2
0
    /// <summary>
    /// Creates a dictionary of keys 1-5
    /// For each level, takes every fraction combination from the previous level and adds an atomic fraction to it to generate the next level
    /// </summary>
    /// <returns>
    /// FractionDatabase consisting of a Dictionary with 5 levels of fraction combinations
    ///     Level 1: All fractions made up of adding 1 atomic fraction from 1/2 to 1/10
    ///     Level 2: All fractions made up of adding 2 atomic fraction
    /// </returns>
    private static FractionDatabase BuildFractionDatabase()
    {
        FractionDatabase database = new FractionDatabase();

        /* Create every combination of single pieces, two pieces, ..., up to a limit of 5 (for now?) */
        /* For each difficulty level (number of pieces) */
        List <FractionData> atomicList = new List <FractionData>();

        /* Build the atomicList of fractions with one component (atomic) */
        /* For every possible atomic fraction */
        for (int denominator = 2; denominator <= 10; denominator++)
        {
            FractionData data     = new FractionData();
            Fraction     fraction = new Fraction(1, denominator);
            data.Value += fraction;
            data.Components.Add(fraction);

            /* Add it to the atomicList */
            atomicList.Add(data);
        }
        database.Data.Add(1, atomicList);

        /* If more than one component needs to be generated, combine every item in atomicList with every possible atomic fraction */
        for (int numComponents = 2; numComponents <= 5; numComponents++)
        {
            List <FractionData> fractionList = new List <FractionData>();
            /* Loop through the previous difficulty level, adding every combination of atomic fraction */
            foreach (FractionData fractionFromPreviousLevel in database.Data[numComponents - 1])
            {
                /* For every possible atomic fraction */
                for (int denominator = 2; denominator <= 10; denominator++)
                {
                    Fraction fraction = new Fraction(1, denominator);

                    /* Only add the new fraction if the base is within 2-10 */
                    Fraction sum = fractionFromPreviousLevel.Value + fraction;
                    if (sum.denominator <= 10)
                    {
                        FractionData data = new FractionData(fractionFromPreviousLevel)
                        {
                            Value = sum
                        };
                        data.Components.Add(fraction);

                        /* Ensure this new item is unique (1/2 + 1/4 === 1/4 + 1/2) */
                        if (IsDistinct(data, fractionList))
                        {
                            /* Add this fraction data to the list */
                            fractionList.Add(data);
                        }
                    }
                }
            }
            /* Add the list of fractionData to the database */
            database.Data.Add(numComponents, fractionList);
        }

        return(database);
    }
コード例 #3
0
    /// <summary>
    /// Returns the fraction value which is the value its filled fragments should add up to solve it.
    /// </summary>
    /// <returns>Fraction Value</returns>
    public FractionData GetFraction()
    {
        FractionData fraction = new FractionData();

        fraction.numerator   = (int)this.GetNumerator();
        fraction.denominator = (int)this.GetDenominator();

        return(fraction);
    }
コード例 #4
0
        //<summary>
        //Code snippet by Eric Lippert from stackexchange
        //</summary>
        public static IEnumerable <FractionSet> SubsetSum(FractionSet fractions, FractionData target)
        {
            return(from subset in fractions.EnumeratePowerSet()
                   where General.SimplifyFraction(subset.FractionSum().numerator, subset.FractionSum().denominator) [0] == General.SimplifyFraction(target.numerator, target.denominator) [0] &&
                   General.SimplifyFraction(subset.FractionSum().numerator, subset.FractionSum().denominator) [1] == General.SimplifyFraction(target.numerator, target.denominator) [1]
                   select subset);
//			return from subset in fractions.EnumeratePowerSet ()
//			       where subset.FractionSum ().numerator == target.numerator && subset.FractionSum ().denominator == target.denominator
//			       select subset;

//			return from subset in fractions.EnumeratePowerSet ()
//			       where subset.Sum () == (target.numerator / (float)target.denominator)
//			       select subset;
        }
コード例 #5
0
    public BuildZone[] SetupBuildZones()
    {
        List <FractionData> data = new List <FractionData>();

        foreach (BuildZone bz in buildZones)//activeBuildZones)
        {
            FractionData fractionData = Constants.fractionDatabase.GetRandomByDifficulty(Constants.difficulty
                                                                                         , (!Constants.gapAllowImproperFractions && !Constants.gapAllowMixedNumbers)
                                                                                         , Constants.gapAlwaysOne
                                                                                         , Constants.gapAlwaysAtomic);
            bz.SetFractionData(fractionData);
            data.Add(fractionData);
            bz.gameObject.SetActive(true);
        }

        return(buildZones);
    }
コード例 #6
0
        public void Start()
        {
            if (File.Exists(downloadFolderPath + "\\" + fileName))
            {
                File.Delete(downloadFolderPath + "\\" + fileName);
            }
            FileStream fileStream = File.Open(downloadFolderPath + "\\" + fileName, FileMode.Create);

            downloadedBytes = new byte[fileSize];

            List <FractionData> fractions = new List <FractionData>();
            int fractionSize = fileSize / sourcesIP.Count;
            //int remainder = fileSize;
            int remainder = fileSize - (fractionSize * (sourcesIP.Count - 1));

            DownloadFileInfo info = new DownloadFileInfo(this.fileName, this.fileSize, "Downloading", DateTime.Now.ToString());

            MyDownloadEvent(info, false);
            FractionData fraction;

            for (int i = 0; i < sourcesIP.Count - 1; i++)
            {
                fraction = new FractionData(sourcesIP[i], fileName, fileSize, fractionSize * i, fractionSize);
                fractions.Add(fraction);
                fraction.DownTask.Start();
            }
            fraction = new FractionData(sourcesIP[sourcesIP.Count - 1], fileName, fileSize, fractionSize * (sourcesIP.Count - 1), remainder);
            fractions.Add(fraction);
            fraction.DownTask.Start();

            for (int i = 0; i < fractions.Count; i++)
            {
                Task.WaitAll(fractions[i].DownTask);
                fileStream.Write(fractions[i].RecvBytesArr, 0, fractions[i].RecvBytesArr.Length);
                //fileStream.Write(fractions[i].RecvBytesArr, fractionSize * i, fractions[i].RecvBytesArr.Length);
            }
            fileStream.Close();
            TimeSpan timeSpan = DateTime.Now - DateTime.Parse(info.Time);

            info.Time   = String.Format("{0:hh\\:mm\\:ss}", timeSpan);
            info.Kbps   = (int)(fileSize / timeSpan.TotalSeconds / 1000);
            info.Status = "Downloaded/Uploading";
            MyDownloadEvent(info, true);
        }
コード例 #7
0
    /// <summary>
    /// Sets the fraction value of the ghost block.
    ///
    /// Its value will be added to the stability number line when this is solved.
    /// </summary>
    /// <param name="fraction">Fraction</param>
    /// <param name="block">Referenced Sky Block, if necessary.</param>
    public void SetFraction(FractionData fraction, SkyBlock block)
    {
        this.numerator   = fraction.numerator;
        this.denominator = fraction.denominator;

        if (block != null)
        {
            this.SolvedFromPrefill();
            this.fillCount  = (int)this.numerator;
            this.sliceCount = (int)this.denominator;
            this.skyBlock   = block;
            this.SetPreFilled(true);
            this.SolvedFromPrefill();
            this.BlockProcessOn();
        }
        else
        {
            this.SetPreFilled(false);
        }
    }
コード例 #8
0
        Attitude GetAttitude(ref FractionData from, int to)
        {
            foreach (var it in from.enemyFractions)
            {
                if (it == to)
                {
                    return(Attitude.enemy);
                }
            }

            foreach (var it in from.friendlyFractions)
            {
                if (it == to)
                {
                    return(Attitude.friendly);
                }
            }

            return(Attitude.neutral);
        }
コード例 #9
0
    private static bool IsDistinct(FractionData item, List <FractionData> list)
    {
        bool result = true;

        List <Fraction> a = item.Components;

        a.Sort();
        foreach (FractionData toCheck in list)
        {
            if (item.Value == toCheck.Value && item.Components.Count == toCheck.Components.Count)
            {
                List <Fraction> b = toCheck.Components;
                b.Sort();

                /* Iterate over both lists. If we reach the end of both, then the lists are the same */
                int counter;
                for (counter = 0; counter < item.Components.Count; counter++)
                {
                    if (item.Components[counter] != toCheck.Components[counter])
                    {
                        break;
                    }
                }

                /* If the counter reached the end of the array, these two lists were equal */
                if (counter == item.Components.Count)
                {
                    Debug.Log("Duplicate found!");
                    Debug.Log("    " + item.Value + ": " + item.Components.ToDelimitedString());
                    Debug.Log("    " + toCheck.Value + ": " + toCheck.Components.ToDelimitedString());
                    return(false);
                }
            }
        }

        return(result);
    }
コード例 #10
0
        public FractionData FractionSum()
        {
            FractionData fractionSum = new FractionData();

            fractionSum.numerator   = 0;
            fractionSum.denominator = 1;

            foreach (FractionData fraction in fractions)
            {
                int          denom = General.LCD(fractionSum.denominator, (int)fraction.denominator);
                FractionData temp  = new FractionData();
                temp.denominator = denom;
                temp.numerator   = (denom / fractionSum.denominator) * fractionSum.numerator;

                FractionData temp2 = new FractionData();
                temp2.denominator = denom;
                temp2.numerator   = (denom / fraction.denominator) * fraction.numerator;

                fractionSum.numerator   = temp.numerator + temp2.numerator;
                fractionSum.denominator = denom;
            }

            return(fractionSum);
        }
コード例 #11
0
        public float Sum()
        {
            float        total       = 0f;
            FractionData fractionSum = new FractionData();

            fractionSum.numerator   = 0;
            fractionSum.denominator = 1;

            foreach (FractionData fraction in fractions)
            {
                int          denom = General.LCD(fractionSum.denominator, (int)fraction.denominator);
                FractionData temp  = new FractionData();
                temp.denominator = denom;
                temp.numerator   = (denom / fractionSum.denominator) * fractionSum.numerator;

                Debug.Log("Temp Frac 1: " + temp.numerator + "/" + temp.denominator);

                FractionData temp2 = new FractionData();
                temp2.denominator = denom;
                temp2.numerator   = (denom / fraction.denominator) * fraction.numerator;

                Debug.Log("Temp Frac 2: " + temp2.numerator + "/" + temp2.denominator);

                fractionSum.numerator   = temp.numerator + temp2.numerator;
                fractionSum.denominator = denom;

//				total += (fraction.numerator / (float)fraction.denominator);
            }

            total = fractionSum.numerator / (float)fractionSum.denominator;

            Debug.Log("Fraction Sum: " + fractionSum.numerator + "/" + fractionSum.denominator);
            Debug.Log("Total: " + total);

            return(total);
        }
コード例 #12
0
    // Use this for initialization
    void Start()
    {
        FractionSet set = new FractionSet();

        set.fractions.AddRange(fractions);
        int index = 0;

        FractionData target = new FractionData();

        target.numerator   = 1;
        target.denominator = 2;

        foreach (FractionSet s in SubsetSumFractions.SubsetSum(set, target))
        {
            string log = "Set " + index + ": ";
            foreach (FractionData fraction in s.fractions)
            {
                log += fraction.numerator.ToString() + "/" + fraction.denominator.ToString() + ", ";
            }

            Debug.Log(log);
            index++;
        }
    }
コード例 #13
0
    public void SetFractionData(FractionData data)
    {
        fractionData = data;

        UpdateEquationUI();
    }
コード例 #14
0
    /// <summary>
    /// Updates the stability number line's target value given the instantiated ghost blocks in the room.
    ///
    /// Target value is kept if the stability number line is set to arbitrary.
    /// </summary>
    /// <param name="blocks">All instantiated ghost blocks in the room.</param>
    /// <returns>Fraction Target Value</returns>
    public FractionData UpdateStabilityNumberLine(List <HollowBlock> blocks)
    {
        FractionData frac = new FractionData();

        if (this.GetNumberLine() != null)
        {
            frac.numerator   = numberLine.GetTargetNumerator();
            frac.denominator = numberLine.GetTargetDenominator();

            if (!this.numberLineIsArbitrary)
            {
                blocks.Shuffle <HollowBlock> ();
                int          inclusionCount = Random.Range(1, blocks.Count + 1);
                FractionData fractionSum    = new FractionData();
                fractionSum.numerator   = 0;
                fractionSum.denominator = 1;
                float sum = 0f;

                if (blocks.Count == 1)
                {
                    if (!blocks [0].IsSolved())
                    {
                        int          denom = General.LCD(fractionSum.denominator, (int)blocks [0].GetDenominator());
                        FractionData temp  = new FractionData();
                        temp.denominator = denom;
                        temp.numerator   = (denom / fractionSum.denominator) * fractionSum.numerator;

                        Debug.Log("Temp Frac 1: " + temp.numerator + "/" + temp.denominator);

                        FractionData temp2 = new FractionData();
                        temp2.denominator = denom;
                        temp2.numerator   = (denom / (int)blocks [0].GetDenominator()) * (int)blocks [0].GetNumerator();

                        Debug.Log("Temp Frac 2: " + temp2.numerator + "/" + temp2.denominator);

                        fractionSum.numerator   = temp.numerator + temp2.numerator;
                        fractionSum.denominator = denom;

                        Debug.Log("Fraction Sum: " + fractionSum.numerator + "/" + fractionSum.denominator);

//						sum += (blocks [0].GetNumerator () / blocks [0].GetDenominator ());
                    }
                }
                else if (blocks.Count == 2)
                {
                    int count = Random.Range(1, 3);

                    if (count == 1 || blocks[0].IsSolved())
                    {
                        int index = Random.Range(0, 2);

                        if (PedagogicalComponent_v2.Instance.CurrentDenominator() != (int)blocks [index].GetDenominator() && !blocks [index].IsSolved())
                        {
                            index = Mathf.Abs(index - 1);
                        }
                        else if (blocks [index].IsSolved() && PedagogicalComponent_v2.Instance.CurrentDenominator() == (int)blocks [index].GetDenominator())
                        {
                            index = Mathf.Abs(index - 1);
                        }

                        int          denom = General.LCD(fractionSum.denominator, (int)blocks [index].GetDenominator());
                        FractionData temp  = new FractionData();
                        temp.denominator = denom;
                        temp.numerator   = (denom / fractionSum.denominator) * fractionSum.numerator;

                        Debug.Log("Temp Frac 1: " + temp.numerator + "/" + temp.denominator);

                        FractionData temp2 = new FractionData();
                        temp2.denominator = denom;
                        temp2.numerator   = (denom / (int)blocks [index].GetDenominator()) * (int)blocks [index].GetNumerator();

                        Debug.Log("Temp Frac 2: " + temp2.numerator + "/" + temp.denominator);

                        fractionSum.numerator   = temp.numerator + temp2.numerator;
                        fractionSum.denominator = denom;

                        Debug.Log("Fraction Sum: " + fractionSum.numerator + "/" + fractionSum.denominator);
                    }
                    else
                    {
                        for (int i = 0; i < count; i++)
                        {
                            int          denom = General.LCD(fractionSum.denominator, (int)blocks [i].GetDenominator());
                            FractionData temp  = new FractionData();
                            temp.denominator = denom;
                            temp.numerator   = (denom / fractionSum.denominator) * fractionSum.numerator;

                            Debug.Log("Temp Frac 1: " + temp.numerator + "/" + temp.denominator);

                            FractionData temp2 = new FractionData();
                            temp2.denominator = denom;
                            temp2.numerator   = (denom / (int)blocks [i].GetDenominator()) * (int)blocks [i].GetNumerator();

                            Debug.Log("Temp Frac 2: " + temp2.numerator + "/" + temp.denominator);

                            fractionSum.numerator   = temp.numerator + temp2.numerator;
                            fractionSum.denominator = denom;

                            Debug.Log("Fraction Sum: " + fractionSum.numerator + "/" + fractionSum.denominator);
                        }
                    }

//					sum += blocks [index].GetNumerator () / blocks [index].GetDenominator ();
                }
                else if (blocks.Count > 2)
                {
                    if (inclusionCount == blocks.Count)
                    {
                        inclusionCount = blocks.Count - 1;
                    }

                    int         index1    = blocks.FindIndex(x => x.GetDenominator() == PedagogicalComponent_v2.Instance.CurrentDenominator());
                    HollowBlock blockTemp = blocks [0];
                    blocks [0]      = blocks [index1];
                    blocks [index1] = blockTemp;

                    for (int i = 0; i < inclusionCount; i++)
                    {
                        int          denom = General.LCD(fractionSum.denominator, (int)blocks [i].GetDenominator());
                        FractionData temp  = new FractionData();
                        temp.denominator = denom;
                        temp.numerator   = (denom / fractionSum.denominator) * fractionSum.numerator;

                        Debug.Log("Temp Frac 1: " + temp.numerator + "/" + temp.denominator);

                        FractionData temp2 = new FractionData();
                        temp2.denominator = denom;
                        temp2.numerator   = (denom / (int)blocks [i].GetDenominator()) * (int)blocks [i].GetNumerator();

                        Debug.Log("Temp Frac 2: " + temp2.numerator + "/" + temp.denominator);

                        fractionSum.numerator   = temp.numerator + temp2.numerator;
                        fractionSum.denominator = denom;

                        Debug.Log("Fraction Sum: " + fractionSum.numerator + "/" + fractionSum.denominator);

//						sum += (blocks [i].GetNumerator () / blocks [i].GetDenominator ());
                    }
                }
                else
                {
                    Debug.LogError("No Blocks given.");
                }

                frac.numerator   = fractionSum.numerator;
                frac.denominator = fractionSum.denominator;

                float[] simpFrac = new float[2];
                simpFrac = General.SimplifyFraction(frac.numerator, frac.denominator);

                frac.numerator   = (int)simpFrac [0];
                frac.denominator = (int)simpFrac [1];

//				float[] fraction = General.SimplifyFraction (sum * 100f, 100f);
//				frac.numerator = (int)fraction [0];
//				frac.denominator = (int)fraction [1];

                float maxPoint = 0;
                foreach (HollowBlock block in blocks)
                {
                    Debug.LogError("STAB MAX CALC " + block.GetNumerator() + " / " + block.GetDenominator());
                    maxPoint += (block.GetNumerator() / block.GetDenominator());
                }

                //Debug.LogError("RAW MAX IS " + maxPoint);
                // TODO change last parameter (maxPoint) to the closest greater integer to the summation of all hollowblock values
                //numberLine.ChangeValue(frac.denominator, frac.numerator, frac.denominator, Mathf.CeilToInt(maxPoint));
                //numberLine.ChangeValueNoPrompt(frac.denominator, frac.numerator, frac.denominator, Mathf.CeilToInt(maxPoint));
                //Debug.LogError("STAB CONTROLLER GAVE Max pt of "+(Mathf.CeilToInt(maxPoint)));
                numberLine.ChangeValueNoPrompt(frac.denominator, frac.numerator, frac.denominator);
                //numberLine.ChangeValueNoPrompt(frac.denominator, frac.numerator, frac.denominator, Mathf.CeilToInt(maxPoint));
            }
        }
        else
        {
            frac.numerator   = 0;
            frac.denominator = 1;
        }

        return(frac);
    }
コード例 #15
0
 public void AddFraction(FractionData fraction)
 {
     this.fractions.Add(fraction);
     this.numerators.Add(fraction.numerator);
     this.denominators.Add(fraction.denominator);
 }
コード例 #16
0
    /// <summary>
    /// Returns a fraction based on the current denominator and topic.
    /// </summary>
    /// <returns>Fraction</returns>
    public FractionData RequestFraction()
    {
        if (this.learnerModelingComponent == null)
        {
            InitializeLearnerModelingComponent();
        }

        FractionData fraction  = new FractionData();
        int          denom     = this.currentDenominator;
        int          numerator = Random.Range(1, denom + 1);

        List <int> nums = new List <int> ();
        int        temp = denom;

        switch (this.currentTopic)
        {
        case SceneTopic.SIMILAR_ADD:
        case SceneTopic.SIMILAR_SUB:
            //do nothing
            break;

        case SceneTopic.EQUIVALENT_ADD:
        case SceneTopic.EQUIVALENT_SUB:
            if (denom % 2 == 0 && denom != 6)
            {
                FractionData[] fractemp = new FractionData[usedFractions.Count];
                usedFractions.CopyTo(fractemp, 0);

                List <FractionData> fracs = new List <FractionData> (fractemp);
                if (!fracs.Contains(fracs.Find(x => x.denominator == denom)))
                {
                    nums.Add(denom);
                }
                else
                {
                    //using + increment to include 3/6
                    temp = denom + 2;

                    //for now, limiting the denom to lower than 10 due to block slicing limitations
                    while (temp < 10)
                    {
                        if (!nums.Contains(temp))
                        {
                            nums.Add(temp);
                        }
                        temp += 2;
                    }
                    temp = denom - 2;
                    while (temp > 1)
                    {
                        if (!nums.Contains(temp))
                        {
                            nums.Add(temp);
                        }
                        temp -= 2;
                    }
                }

                denom = nums [Random.Range(0, nums.Count)];

                //control if its 6
                if (denom == 6)
                {
                    numerator = 3;
                }
                else
                {
                    numerator = Random.Range(1, denom + 1);
                }
            }
            else if (denom % 3 == 0 && denom != 6)
            {
                FractionData[] fractemp = new FractionData[usedFractions.Count];
                usedFractions.CopyTo(fractemp, 0);

                List <FractionData> fracs = new List <FractionData> (fractemp);
                if (!fracs.Contains(fracs.Find(x => x.denominator == denom)))
                {
                    nums.Add(denom);
                }
                else
                {
                    temp = denom + 3;

                    while (temp < 10)
                    {
                        if (!nums.Contains(temp))
                        {
                            nums.Add(temp);
                        }
                        temp += 3;
                    }

                    temp = denom - 3;
                    while (temp > 2)
                    {
                        if (!nums.Contains(temp))
                        {
                            nums.Add(temp);
                        }
                        temp -= 3;
                    }
                }

                denom = nums [Random.Range(0, nums.Count)];

                //control if its 6
                if (denom == 6)
                {
                    numerator = 2 * Random.Range(1, 3);
                }
                else
                {
                    numerator = Random.Range(1, denom + 1);
                }
            }
            else if (denom % 6 == 0)
            {
                FractionData[] fractemp = new FractionData[usedFractions.Count];
                usedFractions.CopyTo(fractemp, 0);

                List <FractionData> fracs = new List <FractionData> (fractemp);
                if (!fracs.Contains(fracs.Find(x => x.denominator == denom)))
                {
                    nums.Add(denom);
                }
                else
                {
                    nums.Add(2);
                    nums.Add(3);

                    temp = denom + 6;
                    while (temp < 10)
                    {
                        if (!nums.Contains(temp))
                        {
                            nums.Add(temp);
                        }
                        temp += 6;
                    }

                    temp = denom - 6;
                    while (temp > 5)
                    {
                        if (!nums.Contains(temp))
                        {
                            nums.Add(temp);
                        }
                        temp -= 6;
                    }
                }

                denom     = nums [Random.Range(0, nums.Count)];
                numerator = Random.Range(1, denom + 1);
            }
            break;

        case SceneTopic.DISSIMILAR_ADD:
        case SceneTopic.DISSIMILAR_SUB:
            FractionData[] tempFrac = new FractionData[usedFractions.Count];
            usedFractions.CopyTo(tempFrac, 0);

            List <FractionData> fracData = new List <FractionData> (tempFrac);
            if (!fracData.Contains(fracData.Find(x => x.denominator == denom)))
            {
                nums.Add(denom);
            }
            else
            {
                List <int> possibleDenoms = new List <int> ();

                if (denom % 2 == 0 && denom != 6)
                {
                    possibleDenoms.Add(3);
                    possibleDenoms.Add(9);
                }
                else if (denom % 3 == 0 && denom != 6)
                {
                    possibleDenoms.Add(2);
                    possibleDenoms.Add(4);
                    possibleDenoms.Add(8);
                }
                else if (denom == 6)
                {
                    possibleDenoms.Add(4);
                    possibleDenoms.Add(8);
                    possibleDenoms.Add(9);
                }

                for (int i = 0; i < 5; i++)
                {
                    nums.Add(possibleDenoms [Random.Range(0, possibleDenoms.Count)]);
                }
            }

            denom     = nums [Random.Range(0, nums.Count)];
            numerator = Random.Range(1, denom + 1);
            break;
        }

        fraction.numerator   = numerator;
        fraction.denominator = denom;

        if (denom > highestDenom && (denom % currentDenominator == 0 || currentDenominator % denom == 0))
        {
            highestDenom = denom;
        }

        this.usedFractions.Enqueue(fraction);

        return(fraction);
    }
コード例 #17
0
    /// <summary>
    /// Returns a fraction based on the topic to be used on.
    /// </summary>
    /// <param name="topic">Topic</param>
    /// <returns>Fraction</returns>
    public FractionData RequestFraction(SceneTopic topic)
    {
        if (this.learnerModelingComponent == null)
        {
            InitializeLearnerModelingComponent();
        }

        FractionData fraction  = new FractionData();
        int          denom     = this.learnerModelingComponent.RequestDenominator(topic);
        int          numerator = Random.Range(1, denom + 1);

        List <int> nums = new List <int> ();
        int        temp = denom;

        switch (topic)
        {
        case SceneTopic.SIMILAR_ADD:
        case SceneTopic.SIMILAR_SUB:
            //do nothing
            break;

        case SceneTopic.EQUIVALENT_ADD:
        case SceneTopic.EQUIVALENT_SUB:
            if (denom % 2 == 0 && denom != 6)
            {
                nums.Add(denom);

                //using + increment to include 3/6
                temp = denom + 2;

                //for now, limiting the denom to lower than 10 due to block slicing limitations
                while (temp < 10)
                {
                    if (!nums.Contains(temp))
                    {
                        nums.Add(temp);
                    }
                    temp += 2;
                }
                temp = denom - 2;
                while (temp > 1)
                {
                    if (!nums.Contains(temp))
                    {
                        nums.Add(temp);
                    }
                    temp -= 2;
                }

                denom = nums [Random.Range(0, nums.Count)];

                //control if its 6
                if (denom == 6)
                {
                    numerator = 3;
                }
                else
                {
                    numerator = Random.Range(1, denom + 1);
                }
            }
            else if (denom % 3 == 0 && denom != 6)
            {
                nums.Add(denom);

                temp = denom + 3;

                while (temp < 10)
                {
                    if (!nums.Contains(temp))
                    {
                        nums.Add(temp);
                    }
                    temp += 3;
                }

                temp = denom - 3;
                while (temp > 2)
                {
                    if (!nums.Contains(temp))
                    {
                        nums.Add(temp);
                    }
                    temp -= 3;
                }

                denom = nums [Random.Range(0, nums.Count)];

                //control if its 6
                if (denom == 6)
                {
                    numerator = 2 * Random.Range(1, 3);
                }
                else
                {
                    numerator = Random.Range(1, denom + 1);
                }
            }
            else if (denom % 6 == 0)
            {
                nums.Add(denom);
                nums.Add(2);
                nums.Add(3);

                temp = denom + 6;
                while (temp < 10)
                {
                    if (!nums.Contains(temp))
                    {
                        nums.Add(temp);
                    }
                    temp += 6;
                }

                temp = denom - 6;
                while (temp > 5)
                {
                    if (!nums.Contains(temp))
                    {
                        nums.Add(temp);
                    }
                    temp -= 6;
                }

                denom     = nums [Random.Range(0, nums.Count)];
                numerator = Random.Range(1, denom + 1);
            }
            break;

        case SceneTopic.DISSIMILAR_ADD:
        case SceneTopic.DISSIMILAR_SUB:
            //50% or more chance to encounter currentDenominator during dissimilar
            for (int i = 0; i < 5; i++)
            {
                nums.Add(denom);
            }
            for (int i = 0; i < 5; i++)
            {
                nums.Add(this.learnerModelingComponent.RequestDenominator(SceneTopic.NONE));
            }

            denom     = nums [Random.Range(0, nums.Count)];
            numerator = Random.Range(1, denom + 1);
            break;
        }

        fraction.numerator   = numerator;
        fraction.denominator = denom;

        this.usedFractions.Enqueue(fraction);

        return(fraction);
    }
コード例 #18
0
    /// <summary>
    /// Record the data of the player's attempt.
    /// Evaluates if the attempt is right or wrong by comparing the set of fllled blocks with all the instances of the subset sum set.
    /// The comparision looks if the set of attempts are closer or farther from any subset sum.
    /// </summary>
    /// <param name="data"></param>
    private void RecordData(Parameters data)
    {
        HollowBlock block  = data.GetHollowBlockExtra("hollowBlock");
        bool        solved = data.GetBoolExtra("solved", true);

        FractionSet oldFracSet = new FractionSet();

        oldFracSet.fractions.AddRange(fractionSet.fractions);
        FractionData blockFraction = block.GetFraction();

        if (solved)
        {
            fractionSet.fractions.Add(block.GetFraction());
        }
        else
        {
            fractionSet.fractions.Remove(fractionSet.fractions.Find(x => x.numerator == block.GetFraction().numerator &&
                                                                    x.denominator == block.GetFraction().denominator));
        }

        Debug.Log("Old size: " + oldFracSet.fractions.Count);

        FractionSet newFracSet = new FractionSet();

        newFracSet.fractions.AddRange(fractionSet.fractions);

        Debug.Log("New size: " + newFracSet.fractions.Count);

        bool found      = false;
        bool improve    = false;
        int  oldCounter = 0;
        int  newCounter = 0;

        foreach (FractionSet s in additionRight)
        {
            FractionSet oldTemp = oldFracSet;
            FractionSet newTemp = newFracSet;
            oldCounter = 0;
            newCounter = 0;

            for (int i = 0; i < s.fractions.Count; i++)
            {
                if (oldTemp.fractions.Remove(oldTemp.fractions.Find(x => x.numerator == s.fractions [i].numerator &&
                                                                    x.denominator == s.fractions [i].denominator)))
                {
                    oldCounter++;
                }
                else
                {
                    oldCounter--;
                }

                if (newTemp.fractions.Remove(newTemp.fractions.Find(x => x.numerator == s.fractions [i].numerator &&
                                                                    x.denominator == s.fractions [i].denominator)))
                {
                    newCounter++;
                }
                else
                {
                    newCounter--;
                }
            }

            oldCounter -= oldFracSet.fractions.Count;
            newCounter -= newFracSet.fractions.Count;

            Debug.Log("New: " + newCounter + " VS Old: " + oldCounter);

            if (newCounter > oldCounter)
            {
                improve = true;
                break;
            }
        }

        if (solved)          //This means it is Addition
        {
            if (improve)
            {
                this.currentSession.Tally(blockFraction.denominator, true, Operation.ADDITION);
            }
            else
            {
                this.currentSession.Tally(blockFraction.denominator, false, Operation.ADDITION);
            }
        }
        else            //Else, its Subtraction
        {
            if (improve)
            {
                this.currentSession.Tally(blockFraction.denominator, true, Operation.SUBTRACTION);
            }
            else
            {
                this.currentSession.Tally(blockFraction.denominator, false, Operation.SUBTRACTION);
            }
        }
    }
コード例 #19
0
    /// <summary>
    /// Takes all currently registered ghost blocks and checks their values to determine what topic the puzzle is.
    /// Also updates the stability number line based on the currently registered blocks' values.
    /// </summary>
    private void UpdateSession()
    {
        List <int>  denominators = new List <int> ();
        FractionSet fset         = new FractionSet();
        bool        similar      = true;
        bool        oddEquiv     = true;
        bool        evenEquiv    = true;

        int currentDenom = (int)hollowBlocks [0].GetDenominator();

        for (int i = 0; i < hollowBlocks.Count; i++)
        {
            denominators.Add((int)hollowBlocks[i].GetDenominator());
            FractionData fraction = hollowBlocks [i].GetFraction();

            if (i > 0)
            {
                if (similar && currentDenom == fraction.denominator)
                {
                    similar = true;
                }
                else
                {
                    similar = false;
                }

                if (evenEquiv && currentDenom % 2 == 0 && (currentDenom % fraction.denominator == 0 || fraction.denominator % currentDenom == 0 || (General.SimplifyFraction(fraction.numerator, fraction.denominator) [0] == 1.0f && General.SimplifyFraction(fraction.numerator, fraction.denominator) [1] == 2.0f)))
                {
                    evenEquiv = true;
                }
                else
                {
                    evenEquiv = false;
                }

                if (oddEquiv && currentDenom % 3 == 0 && (currentDenom % fraction.denominator == 0 || fraction.denominator % currentDenom == 0 || (General.SimplifyFraction(fraction.numerator, fraction.denominator) [0] == 1.0f && General.SimplifyFraction(fraction.numerator, fraction.denominator) [1] == 3.0f) || (General.SimplifyFraction(fraction.numerator, fraction.denominator) [0] == 2.0f && General.SimplifyFraction(fraction.numerator, fraction.denominator) [1] == 3.0f)))
                {
                    oddEquiv = true;
                }
                else
                {
                    oddEquiv = false;
                }

//				if (similar && fraction.denominator == (int)hollowBlocks [i - 1].GetDenominator ())
//					similar = true;
//				else
//					similar = false;
//
//				if (evenEquiv && (fraction.denominator % 2) == ((int)hollowBlocks [i - 1].GetDenominator () % 2))
//					evenEquiv = true;
//				else
//					evenEquiv = false;
//
//				if (oddEquiv && (fraction.denominator % 3) == ((int)hollowBlocks [i - 1].GetDenominator () % 3))
//					oddEquiv = true;
//				else
//					oddEquiv = false;
            }

            fset.fractions.Add(fraction);
        }

        if (similar)
        {
            topic = SessionTopic.SIMILAR;
        }
        else if (evenEquiv || oddEquiv)
        {
            topic = SessionTopic.EQUIVALENT;
        }
        else
        {
            topic = SessionTopic.DISSIMILAR;
        }

        this.currentSession = new StabilizationSession(topic, this.sceneAvgSolveTime);

        if (numberLine == null)
        {
            this.numberLine = FindObjectOfType <StabilityNumberLine> ();
        }

        FractionData target = this.stabilityController.UpdateStabilityNumberLine(hollowBlocks);

//		FractionData target = new FractionData ();
//		target.numerator = (int)numberLine.GetTargetNumerator ();
//		target.denominator = (int)numberLine.GetTargetDenominator ();

        foreach (FractionSet s in SubsetSumFractions.SubsetSum(fset, target))
        {
            additionRight.Add(s);
        }
    }
コード例 #20
0
 public FractionData(FractionData toCopy)
 {
     Value      = new FractionTools.Fraction(toCopy.Value);
     Components = new List <FractionTools.Fraction>(toCopy.Components);
 }