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); }
/// <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); }
/// <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); }
//<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; }
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); }
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); }
/// <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); } }
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); }
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); }
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); }
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); }
// 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++; } }
public void SetFractionData(FractionData data) { fractionData = data; UpdateEquationUI(); }
/// <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); }
public void AddFraction(FractionData fraction) { this.fractions.Add(fraction); this.numerators.Add(fraction.numerator); this.denominators.Add(fraction.denominator); }
/// <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); }
/// <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); }
/// <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); } } }
/// <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); } }
public FractionData(FractionData toCopy) { Value = new FractionTools.Fraction(toCopy.Value); Components = new List <FractionTools.Fraction>(toCopy.Components); }