// заглушка для получения списка public static void Add(OneTab T, int priority, List <string> WordsList, int i1, int i2 = -1, int i3 = -1) { foreach (string word in WordsList) { Add(T, priority, word, i1, i2, i3); } }
/// <summary> /// ищем гибриды по двум спискам слов /// </summary> /// <param name="OT">таб</param> /// <param name="w1">список1</param> /// <param name="w2">список2</param> /// <param name="i">номер первого слова</param> /// <param name="j">номер второго слова</param> /// <param name="min">минимальное пересечение, букв</param> /// <param name="prior">приоритет</param> /// <returns>строка ответов с разделителем \r\n</returns> private static string FindGybrids(OneTab OT, List <string> w1, List <string> w2, int i, int j, int min, int prior) { string r2 = ""; foreach (string s1 in w1) { foreach (string s2 in w2) { int mi = min; int ma = s1.Length - 1; if (s1.Length > s2.Length) { ma = s2.Length - 1; } if (ma < mi) { continue; } for (int k = mi; k <= ma; k++) { // s1 - первые символы (второе слово), s2 - последние символы (первое слово) if (s1.Substring(0, k) == s2.Substring(s2.Length - k, k)) { string ans = s2.Substring(0, s2.Length - k) + s1; Answer.Add(OT, prior, ans, i, j); r2 = r2 + ans + "\r\n"; } } } } return(r2); }
/// <summary> /// решение гапоифики /// </summary> /// <param name="T">таб</param> /// <returns>true</returns> public bool Process(OneTab T) { OT = T; task = OT.tbTextTask.Text; string[] ar1 = System.Text.RegularExpressions.Regex.Split(task, "\r\n"); string resout = ""; foreach (string s1 in ar1) { //resout = resout + s1 + ":\r\n"; string s = Books.ClearBookName(s1).ToLower(); if (s != "") { for (int i = 0; i < Books.WordsCount; i++) { if (s == Books.gapo[i].ToLower()) { Answer.Add(T, 3, Books.dict[i], -1); resout = resout + Books.dict[i] + "\r\n"; } } } resout = resout + "\r\n"; } T.tbSectors.Invoke(new Action(() => { T.btSolve.Enabled = true; })); T.tbTextHints.Invoke(new Action(() => { T.tbTextHints.Text = resout; })); T.tcTabText.Invoke(new Action(() => { T.tcTabText.SelectTab(1); })); return(true); }
/// <summary> /// разпознать и вбить слова от картинок, создание потока /// </summary> /// <param name="T">таб</param> public Picture(OneTab T) { if (T.cbImageCuttingMethod.SelectedItem.ToString() == "Указан в ручную, равные доли") { Log.Write("Pics Начали решать картинки\r\n.\r\n"); Task <bool> t1 = Task <bool> .Factory.StartNew(() => Process(T)); } }
/// <summary> /// читает игру, создает уровни и табы на форме /// </summary> private void CreateLevelsAndTabs() { GameSelect G = Program.D.Game; for (int i = 1; i <= G.gamelevels; i++) { Level lvl = new Level(G, i); Program.D.Lvl.Add(lvl); OneTab OT = new OneTab(Program.D, lvl); Program.D.OneTab.Add(OT); } Event_MainFormChangeSize(null, null); }
// режет большие картинки на мелкие, сохраняет, возвращает массив локальных путей // вход - список урлов, массив количество строк, массив количеств колонок // выход - массив локальных путей public static string[] GetSmallImagePathes(OneTab T, List <string> urls, int[] Rows, int[] Cols) { int SmallImageCount = GetSmallImageCount(urls, Rows, Cols); string[] SmallImagePath = new string[SmallImageCount]; List <string> tmplist = new List <string>(); string basename = Environment.CurrentDirectory + @"\Pics\g" + T.level.G.gameid + "_l" + T.level.number.ToString() + "_p{1}_n{2}.jpg"; for (int part = 0; part < urls.Count; part++) { System.Windows.Forms.PictureBox PictBox = new System.Windows.Forms.PictureBox(); PictBox.Load(urls[part]); Bitmap Bmp = new Bitmap(PictBox.Image); int total_parts = Rows[part] * Cols[part]; int w = Bmp.Width; int h = Bmp.Height; int dw = w / Cols[part] - 2 * image_border_width; // ширина одного блока int dh = h / Rows[part] - 2 * image_border_width; int cnt = 0; for (int r = 0; r < Rows[part]; r++) { for (int c = 0; c < Cols[part]; c++) { cnt++; int sw = image_border_width + (w * c / Cols[part]); int sh = image_border_width + (h * r / Rows[part]); System.Drawing.Bitmap nb = new System.Drawing.Bitmap(dw, dh); System.Drawing.Rectangle re = new System.Drawing.Rectangle(sw, sh, dw, dh); nb = Bmp.Clone(re, System.Drawing.Imaging.PixelFormat.Undefined); string fn = basename; fn = fn.Replace("{1}", part.ToString()); fn = fn.Replace("{2}", cnt.ToString()); nb.Save(fn, System.Drawing.Imaging.ImageFormat.Jpeg); tmplist.Add(fn); } } } SmallImagePath = new string[tmplist.Count]; for (int i = 0; i < tmplist.Count; i++) { SmallImagePath[i] = tmplist[i]; } return(SmallImagePath); }
// код основной программы static void Main(string[] args) { // инитим лог Log.Init(); Log.Write("________________________________________________________________________________"); Log.Write(" Старт программы.."); Log.Write(" Сборка от " + File.GetCreationTime(Process.GetCurrentProcess().MainModule.FileName).ToString()); Log.Write(" ПК: " + Environment.MachineName); Log.Write(" " + System.Environment.OSVersion.VersionString + ", " + Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") + ", ver:" + Environment.Version.ToString() + ", CPU: " + Environment.ProcessorCount.ToString() + ", 64bit:" + Environment.Is64BitOperatingSystem.ToString()); //создаём сплеш spl = new Splash(Properties.Resources.version); // выполняем проверки окружения if (!Components.Check()) { System.Windows.Forms.MessageBox.Show("Не все необхдимые компоненты установлены на ПК.\r\nПроверьте лог-файл."); return; } // инициализируем наши собственные компоненты Components.Init(); // создаем основную форму spl.ChangeProgress(70, "Создаём форму приложения"); AppForm AF = new AppForm(); // создаём пользовательский таб spl.ChangeProgress(70, "Создаём пользовательский уровень"); Level userlevel = new Level(D.Game, 0); D.Lvl.Add(userlevel); OneTab OT = new OneTab(D, userlevel); D.OneTab.Add(OT); // закрываем сплеш spl.ChangeProgress(100, "Готово!"); System.Windows.Forms.Application.Run(D.F); // закругляемся Components.Close(); Log.Write("Выход из программы.."); Log.Close(); }
} // нормализация вида задачи /// <summary> /// решение расчлененок /// </summary> /// <param name="T">таб</param> /// <returns>true</returns> public bool Process(OneTab T) { OT = T; task = OT.tbTextTask.Text; slov = OT.iRaschl; string resout = ""; string norm = Normalize(task); string[] ar1 = norm.Split('#'); // формируем таски, передаём им управление var Tasks2 = new List <Task <List <string> > >(); foreach (string s1 in ar1) { if (s1.Trim() == "") { continue; } Tasks2.Add(Task <List <string> > .Factory.StartNew(() => ProcessOne(s1, slov))); } // дождаться выполнения потоков Task.WaitAll(Tasks2.ToArray()); // собираем результаты List <string> SolvedWords = new List <string>(); foreach (Task <List <string> > t8 in Tasks2) { List <string> r8 = t8.Result; SolvedWords.AddRange(r8); SolvedWords.Add(""); } foreach (string s1 in SolvedWords) { resout = resout + s1 + "\r\n"; } T.tbSectors.Invoke(new Action(() => { T.btSolve.Enabled = true; })); T.tbTextHints.Invoke(new Action(() => { T.tbTextHints.Text = resout; })); T.tcTabText.Invoke(new Action(() => { T.tcTabText.SelectTab(1); })); return(true); }
// решение олимпиек public bool Process(OneTab T) { OT = T; if (T.iOlimpSize == 0) { int PicsCount = Image.GetSmallImageCount(T.level.urls, T.iRows, T.iCols); CreateLinksTable(PicsCount); } else { CreateLinksTable(T.iOlimpSize); } sended = new List <string>(); int oldsecbon = T.level.secbon; tasks = FindBlanks(T.level); foreach (OneOlimp oo in tasks) { SolveOne(T.level, oo); } bool isTrue = true; while (isTrue == true) { while (T.level.secbon == oldsecbon) { System.Threading.Thread.Sleep(5000); } oldsecbon = T.level.secbon; tasks = FindBlanks(T.level); foreach (OneOlimp oo in tasks) { SolveOne(T.level, oo); } } //T.tbSectors.Invoke(new Action(() => { T.btSolve.Enabled = true; })); return(true); }
/// <summary> /// распознание и вбивание картинок /// </summary> /// <param name="T">таб</param> /// <returns>true</returns> public bool Process(OneTab T) { string resout = ""; // создаем массив путей из больших картинок string[] SmallImagePath = Image.GetSmallImagePathes(T, T.level.urls, T.iRows, T.iCols); // отрисуем их в ГУИ string html = GetPicsHtml(SmallImagePath); T.wbPictures.Invoke(new Action(() => { T.wbPictures.DocumentText = html; })); T.wbPictures.Invoke(new Action(() => { T.tcTabWeb.SelectedIndex = 1; })); // из путей к картинкам делаем коллекции слов List <Words> TextsFromPics = Image.GetAllDescriptions(SmallImagePath); // пробуем вбить ответы (то есть передать их во вбиватор, включая указание приоритета) for (int i = 0; i < TextsFromPics.Count; i++) { Words W = TextsFromPics[i]; if (W != null) { List <string> ww5 = Words.KillDupesAndRange(W.all_base10, 5); List <string> ww100 = Words.KillDupesAndRange(W.all_base10, 100); Answer.Add(T, 4, ww5, i); foreach (string s1 in ww100) { resout = resout + s1 + " "; } } resout = resout + "\r\n"; //*** позже добавить более низкие приоритеты } T.tbSectors.Invoke(new Action(() => { T.btSolve.Enabled = true; })); T.tbTextHints.Invoke(new Action(() => { T.tbTextHints.Text = resout; })); T.tcTabText.Invoke(new Action(() => { T.tcTabText.SelectTab(1); })); return(true); }
// постановка слова в очередь // вход - Таб, приоритет, слово, 3 номера картинок // выход - нет, слово ставиться в очередь public static void Add(OneTab T, int priority, string wrd, int i1, int i2 = -1, int i3 = -1) { if ((i1 != 0) && (i2 != 0) && (i3 != 0)) { int lvlnum = T.level.number; string wrd2 = SetProtect(wrd, i1, T.sProtect); Answ q1 = new Answ(); q1.OT = T; q1.Tab = T.Tab; q1.Sec = T.tbSectors; q1.Bon = T.tbBonuses; q1.Web = T.wbPictures; q1.Txt = T.tbTextHints; q1.wrd = wrd; q1.wrd2 = wrd2; q1.lvlnum = T.level.number; q1.i1 = i1; q1.i2 = i2; q1.i3 = i3; q1.priority = priority; Queue.Add(q1); } }
/// <summary> /// создание потока для гапоифики книг /// </summary> /// <param name="T">таб</param> public GapoifikaBooks(OneTab T) { Log.Write("gaB Начали решать книжную гапоифику\r\n.\r\n"); Task <bool> t1 = Task <bool> .Factory.StartNew(() => Process(T)); }
/// <summary> /// распознание и решение гибридов картинок /// </summary> /// <param name="T">таб</param> /// <returns>true</returns> public bool Process(OneTab T) { OT = T; string resout = ""; // создаем массив путей из больших картинок string[] SmallImagePath = Image.GetSmallImagePathes(T, T.level.urls, T.iRows, T.iCols); // отрисуем их в ГУИ string html = Picture.GetPicsHtml(SmallImagePath); T.wbPictures.Invoke(new Action(() => { T.wbPictures.DocumentText = html; })); // из путей к картинкам делаем коллекции слов List <Words> TextsFromPics = Image.GetAllDescriptions(SmallImagePath); // решаем, собственно int min = T.iGybridMin; int cnt = TextsFromPics.Count; for (int i = 0; i < cnt; i++) { for (int j = 0; j < cnt; j++) { if (i == j) { continue; } // надо сравнить наборы слов для i и j Words w1 = TextsFromPics[i]; Words w2 = TextsFromPics[j]; // приоритет 3 - для гибридов по базовым словам // приоритет 4 - для остальных // приоритет 5 - для ассоциаций ко всему найденному if ((w1 != null) && (w2 != null)) { if ((w1.all_base != null) && (w2.all_base != null)) { List <string> wru1 = Words.KillDupesAndRange(w1.ru, 10); List <string> wru2 = Words.KillDupesAndRange(w2.ru, 10); wru1.AddRange(w1.all_base); wru2.AddRange(w2.all_base); string resout2 = FindGybrids(T, wru1, wru2, i, j, min, 3); resout = resout + resout2 + "\r\n"; /* * List<string> ls1 = new List<string>(); * List<string> ls2 = new List<string>(); * ls1.AddRange(w1.all_base); ls1.AddRange(w1.all_assoc25); * ls2.AddRange(w2.all_base); ls2.AddRange(w2.all_assoc25); * //ls1.AddRange(w1.all_base); ls1.AddRange(w1.all_assoc25); ls1.AddRange(w1.ru_check); ls1.AddRange(w1.en_trans); ls1.AddRange(w1.f_b_noun); ls1.AddRange(w1.f_b_adjective); * //ls2.AddRange(w2.all_base); ls2.AddRange(w2.all_assoc25); ls2.AddRange(w2.ru_check); ls2.AddRange(w2.en_trans); ls2.AddRange(w2.f_b_noun); ls2.AddRange(w2.f_b_adjective); * ls1 = Words.KillDupesAndRange(ls1); * ls2 = Words.KillDupesAndRange(ls2); * FindGybrids(T, ls1, ls2, i, j, min, 4); * * иначе получаем чрезмерно много вариантов */ } } //List<string> ass1 = Words.KillDupesAndRange(Associations.Get(ls1)); //List<string> ass2 = Words.KillDupesAndRange(Associations.Get(ls2)); //FindGybrids(T, ass1, ass2, i, j, min, 5); //иначе получаем чрезмерно много вариантов } } T.tbSectors.Invoke(new Action(() => { T.btSolve.Enabled = true; })); T.tbTextHints.Invoke(new Action(() => { T.tbTextHints.Text = resout; })); T.tcTabText.Invoke(new Action(() => { T.tcTabText.SelectTab(1); })); return(true); }
// создание потока для ассоциатора олимпиек public Olimp(OneTab T) { Log.Write("Oli Начали решать олимпийки\r\n.\r\n"); Task <bool> t1 = Task <bool> .Factory.StartNew(() => Process(T)); }
/// <summary> /// создание потока для ледиды книг /// </summary> /// <param name="T">таб</param> public LedidaBooks(OneTab T) { Log.Write("leB Начали решать книжную ледиду\r\n.\r\n"); Task <bool> t1 = Task <bool> .Factory.StartNew(() => Process(T)); }
/// <summary> /// создание потока для расчлененок /// </summary> /// <param name="T">таб</param> public Raschl(OneTab T) { Log.Write("Rasch Начали решать расчленки\r\n.\r\n"); Task <bool> t1 = Task <bool> .Factory.StartNew(() => Process(T)); }
/// <summary> /// создание потока для гапоифики фильмов /// </summary> /// <param name="T">таб</param> public GapoifikaFilms(OneTab T) { Log.Write("gaF Начали решать гапоифику по фильмам\r\n.\r\n"); Task <bool> t1 = Task <bool> .Factory.StartNew(() => Process(T)); }
/// <summary> /// решение гапоифики /// </summary> /// <param name="T">таб</param> /// <returns>true</returns> public bool Process(OneTab T) { OT = T; task = OT.tbTextTask.Text; string resout = ""; string[] ar1 = System.Text.RegularExpressions.Regex.Split(task, "\r\n"); foreach (string s1 in ar1) { if (s1 != "") { // получим возможные наименвоания фильмов List <string> names = Films.GetNameList(s1); // и маску в формате "га по и фи ка" string mask = Films.PrepareSearchString(s1); mask = mask.ToLower().Replace(" ", " ").Replace(" ", " ").Trim(); foreach (string name in names) { // уберем цифры в скобках string n = RemoveYearBrackets(name); n = RemoveYearBrackets(n); // уберем спецсимволы n = n.Replace("`", " ").Replace("~", " ").Replace("!", " ").Replace("@", " ").Replace("#", " ").Replace("№", " ").Replace("\"", " "); n = n.Replace(";", " ").Replace("$", " ").Replace("%", " ").Replace("^", " ").Replace(":", " ").Replace("&", " ").Replace("?", " "); n = n.Replace("*", " ").Replace("(", " ").Replace(")", " ").Replace("-", " ").Replace("_", " ").Replace("=", " ").Replace("+", " "); n = n.Replace("{", " ").Replace("}", " ").Replace("[", " ").Replace("]", " ").Replace("/", " ").Replace("|", " ").Replace("\\", " "); n = n.Replace(";", " ").Replace(":", " ").Replace("'", " ").Replace(",", " ").Replace(".", " ").Replace("<", " ").Replace(">", " "); n = n.Replace("«", " ").Replace("»", " "); n = n.Replace("…", " ").Replace(" ", " ").Replace(" ", " ").Replace(" ", " ").Replace(" ", " ").Replace(" ", " ").Trim(); // составим из очередного найденного названия маску в стиле "га по и фи ка" string[] ar2 = n.Split(' '); string nn = ""; foreach (string s in ar2) { if (s == "") { continue; } if (s.Length == 1) { nn = nn + s + " "; } else { nn = nn + s.Substring(0, 2) + " "; } } nn = nn.ToLower().Replace(" ", " ").Replace(" ", " ").Trim(); // проверяем, если соответствует - передаем во вбиватор if (nn == mask) { Answer.Add(T, 3, n, -1); resout = resout + n + "\r\n"; } } } resout = resout + "\r\n"; } T.tbSectors.Invoke(new Action(() => { T.btSolve.Enabled = true; })); T.tbTextHints.Invoke(new Action(() => { T.tbTextHints.Text = resout; })); T.tcTabText.Invoke(new Action(() => { T.tcTabText.SelectTab(1); })); return(true); }