Beispiel #1
0
        private static bool AskForCorrect(SolveInstance si, ref List <Tuple <int, string> > tl, Form1.ResultCallBack callback)
        {
            var ret = (from x in tl.OrderBy(s => s.Item1)
                       select si.SolvedStrings[x.Item2]).Aggregate("", (q1, q2) => q1 + q2 + " ");

            return(callback(ret));
        }
Beispiel #2
0
        private static IEnumerable <Tuple <SolveInstance, string> > Unencrypt(SolveInstance si, String encrypted)
        {
            //get all possible words of this length
            List <string> okstrs = DictionaryWords.Where((a, b) => si.Compare(a, encrypted)).ToList();

            if (okstrs.Count == 0)
            {
                yield break;
            }

            foreach (var s in okstrs)
            {
                var si2 = si.Clone();
                var ok  = si2.CompareChange(s, encrypted);

                if (ok == false)
                {
                    continue;
                }

                si2.SolvedStrings[encrypted] = s;

                yield return(new Tuple <SolveInstance, string>(si2, s));
            }
        }
Beispiel #3
0
        private static string GetResultText(SolveInstance si)
        {
            var ret = "";

            foreach (var s in si.SolvedStrings.Where(s => s.Value != null))
            {
                ret += s.Key + ":" + s.Value + ",";
            }
            return(ret);
        }
Beispiel #4
0
        private static void OutputResult(SolveInstance si, Form1.IncrementCounter ic)
        {
            if (ic == null)
            {
                return;
            }

            String ret = GetResultText(si);

            ic(ret);
        }
Beispiel #5
0
        public static void Solve(string words, Form1.ResultCallBack callback, Form1.IncrementCounter ic)
        {
            callback("--START--");
            var si = new SolveInstance();

            var s  = words.Split(new[] { ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
            var tl = s.Select((t, a) => new Tuple <int, string>(a, t)).ToList();

            //shortest first
            foreach (var s1 in tl.OrderByDescending(s1 => s1.Item2.Length))
            {
                if (si.SolvedStrings.ContainsKey(s1.Item2) == false)
                {
                    si.SolvedStrings.Add(s1.Item2, null);
                }
            }

            Solve(si, ref tl, callback, ic);
            callback("--FINISHED--");
        }
Beispiel #6
0
            public SolveInstance Clone()
            {
                var si = new SolveInstance();

                foreach (var k in worden)
                {
                    si.worden.Add(k.Key, k.Value);
                }

                foreach (var k2 in enword)
                {
                    si.enword.Add(k2.Key, k2.Value);
                }

                foreach (var k3 in SolvedStrings)
                {
                    si.SolvedStrings.Add(k3.Key, k3.Value);
                }

                return(si);
            }
Beispiel #7
0
        /// <summary>
        /// tuple enc unenc
        /// </summary>
        /// <param name="si"></param>
        /// <returns></returns>
        private static IEnumerable <Tuple <string, string> > Solve(SolveInstance si, ref List <Tuple <int, string> > tl, Form1.ResultCallBack callback, Form1.IncrementCounter ic)
        {
            var left = si.SolvedStrings.Where(s => s.Value == null);
            var lc   = left.Count();

            if (lc == 0)
            {
                if (AskForCorrect(si, ref tl, callback) == false)
                {
                    return(null);
                }

                return(new List <Tuple <string, string> >());
            }

            var en = left.First().Key;

            foreach (var s in Unencrypt(si, en))
            {
                if (ic != null)
                {
                    OutputResult(s.Item1, ic);
                }

                var retr = Solve(s.Item1, ref tl, callback, ic);
                if (retr != null)
                {
                    var r   = new Tuple <string, string>(en, s.Item2);
                    var ret = new List <Tuple <string, string> >();
                    ret.Add(r);
                    ret.AddRange(retr);
                    return(ret);
                }
            }
            return(null);
        }
Beispiel #8
0
        public static void Solve(string words, Form1.ResultCallBack callback, Form1.IncrementCounter ic)
        {
            callback("--START--");
            var si = new SolveInstance();

            var s = words.Split(new[] { ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
            var tl = s.Select((t, a) => new Tuple<int, string>(a, t)).ToList();

            //shortest first
            foreach (var s1 in tl.OrderByDescending(s1 => s1.Item2.Length))
            {
                if (si.SolvedStrings.ContainsKey(s1.Item2) == false)
                    si.SolvedStrings.Add(s1.Item2, null);
            }

            Solve(si, ref tl, callback, ic);
            callback("--FINISHED--");
        }
Beispiel #9
0
            public SolveInstance Clone()
            {
                var si = new SolveInstance();
                foreach (var k in worden)
                {
                    si.worden.Add(k.Key, k.Value);
                }

                foreach (var k2 in enword)
                {
                    si.enword.Add(k2.Key, k2.Value);
                }

                foreach (var k3 in SolvedStrings)
                {
                    si.SolvedStrings.Add(k3.Key, k3.Value);
                }

                return si;
            }
Beispiel #10
0
        private static IEnumerable<Tuple<SolveInstance, string>> Unencrypt(SolveInstance si, String encrypted)
        {
            //get all possible words of this length
            List<string> okstrs = DictionaryWords.Where((a, b) => si.Compare(a, encrypted)).ToList();

            if (okstrs.Count == 0)
                yield break;

            foreach (var s in okstrs)
            {
                var si2 = si.Clone();
                var ok = si2.CompareChange(s, encrypted);

                if (ok == false)
                    continue;

                si2.SolvedStrings[encrypted] = s;

                yield return new Tuple<SolveInstance, string>(si2, s);
            }
        }
Beispiel #11
0
        /// <summary>
        /// tuple enc unenc
        /// </summary>
        /// <param name="si"></param>
        /// <returns></returns>
        private static IEnumerable<Tuple<string, string>> Solve(SolveInstance si, ref  List<Tuple<int, string>> tl, Form1.ResultCallBack callback, Form1.IncrementCounter ic)
        {
            var left = si.SolvedStrings.Where(s => s.Value == null);
            var lc = left.Count();
            if (lc == 0)
            {
                if (AskForCorrect(si, ref tl, callback) == false)
                    return null;

                return new List<Tuple<string, string>>();
            }

            var en = left.First().Key;

            foreach (var s in Unencrypt(si, en))
            {
                if (ic != null)
                    OutputResult(s.Item1, ic);

                var retr = Solve(s.Item1, ref tl, callback, ic);
                if (retr != null)
                {
                    var r = new Tuple<string, string>(en, s.Item2);
                    var ret = new List<Tuple<string, string>>();
                    ret.Add(r);
                    ret.AddRange(retr);
                    return ret;
                }
            }
            return null;
        }
Beispiel #12
0
        private static void OutputResult(SolveInstance si, Form1.IncrementCounter ic)
        {
            if (ic == null)
                return;

            String ret = GetResultText(si);

            ic(ret);
        }
Beispiel #13
0
 private static string GetResultText(SolveInstance si)
 {
     var ret = "";
     foreach (var s in si.SolvedStrings.Where(s => s.Value != null))
     {
         ret += s.Key + ":" + s.Value + ",";
     }
     return ret;
 }
Beispiel #14
0
        private static bool AskForCorrect(SolveInstance si, ref  List<Tuple<int, string>> tl, Form1.ResultCallBack callback)
        {
            var ret = (from x in tl.OrderBy(s => s.Item1)
                       select si.SolvedStrings[x.Item2]).Aggregate("", (q1, q2) => q1 + q2 + " ");

            return callback(ret);
        }