• Из текста в картинку с текстом?

    @Sumor
    Более точно с помощью DrawString
    Ответ написан
    Комментировать
  • Выскакивает ошибка, как решить?

    @Sumor
    Попробуйте
    WanderingAI behavior = GetComponent<WanderingAI>();
    Ответ написан
    1 комментарий
  • Как перебрать все элементы множества в псевдо-произвольном порядке?

    @Sumor
    Небольшой код для перемешивания с помощью порождающего элемента.
    Математическое обоснование основано на теории групп.
    Кратко:
    В конечном поле, мощностью равному простому числу p есть мультипликативная группа, которая включает в себя все элементы кроме нуля.
    В этой мультипликативной группе обязательно есть порождающий элемент.
    Что такое порождающий элемент? Это элемент (a), который можно последовательно возводить в степень и получить все элементы мультипликативной группы, то есть все элементы нашего поля, кроме нуля. Причём единица получится всегда последней. a^(p-1) = 1 (mod p)
    На том, что степени порождающего элемента проходят все элементы ровно по одному разу и построен предложенный алгоритм генерации перестановок. Он не годится для реальных дел, но в некоторых научных или ненаучных целях его можно использовать.
    Нужно взять простое число большее как минимум на 2 максимальной длины строки.
    0 в результате умножения не получается, а 1 будем считать признаком завершения подсчётов, элементы больше длины строки + 2 будем пропускать.
    Для поиска порождающих элементов нужно разложить число (p-1) на множители. Если элемент a является порождающим, то возведение его в степени полученных множителей не должно равняться 1 по модулю p.
    Как только один порождающий элемент найден, то порождающими будут его степени, взаимно простые с (p-1).

    Для примера взял число 19. (19-1)=18=2*3*3
    Проверяем число 2: 2^2 = 4≢1(mod p) 2^3 = 8≢1(mod p) - значит 2 - порождающий элемент.
    Числа 1, 5, 7, 11, 13, 17 - взаимно простые с 18, поэтому 2^1, 2^5, 2^7, 2^11, 2^13, 2^17 - порождающие элементы
    Это числа 2, 3, 10, 13, 14, 15. В данном случае у нас получится 6 вариантов перемешивания.
    И теперь код:
    public static void Main()
      {
        var str = "abcdefghijklmnop";
        Console.WriteLine(str);
        Console.WriteLine(string.Concat(Shuffle(str)));
      }
      private static Random Rnd = new Random((int)DateTime.Now.Ticks);
      public static IEnumerable<char> Shuffle(string str)
      {
        var prime = 19;	
        var makers = new [] {2, 3, 10, 13, 14, 15};
        var maker = makers[Rnd.Next(makers.Length)];
        if(prime < str.Length + 2) throw new Exception("Слишком длинная строка");
        var current = maker;
        while(current != 1)
        {		
          if(current < str.Length + 2)
            yield return str[current - 2];
          current *= maker;
          current %= prime;			
        }
      }
    Ответ написан
    1 комментарий
  • [Машина Тьюринга] Каким образом можно разделить число (в десятичной системе счисления) на 5?

    @Sumor
    Надо действительно умножать на два и удалить последнюю цифру.
    Умножать можно со старшего разряда, можно с младшего.
    Умножение на два алгоритмически достаточно простое и требует небольшого количества состояний.
    Нужно определиться с тем что будут означать состояния машины.
    Вот, примерная схема, деления на 5, оно же умножения на два со старшего разряда:
    Qt - Начало умножения текущей цифры
    Qr - На следующем шаге просто пойдём направо
    Qrr - Следующие два шага пойдём направо
    Ql - Следующий шаг пойдём налево для прибавления единицы
    Q1 - Добавление единицы от переполнения на предыдущих шагах
    Qlast - Дошли до конца и удаляем последнюю цифру
    Qend - Конец

    Остальное дело техники - внимательно прописать переходы между состояниями. Вот часть переходов
    1 + Qt -> 2 + Qr - на текущей позиции единица, мы вместо неё пишем двойку и готовимся на следующем шаге перейти к следующей цифре.
    2 + Qr -> Right + Qt - перешли направо к следующей цифре
    6 + Qt -> 2 + Ql - У нас переполнение, поэтому нужно вернуться налево и добавить единичку
    2 + Ql -> Left + Q1 - перешли налево для последующего добавления единички
    3 + Q1 -> 4 + Qrr - добавили единичку и планируем переместиться на две позиции направо для продолжения работы.
    4 + Qrr -> Right + Qr - перемещаемся направо к текущей позиции (остался один переход направо для продолжения алгоритма)
    _ + Qt -> Left + Qlast - мы дошли до конца числа - перемещаемся на последнюю цифру для затирания
    0 + Qlast -> _ + Qend - затёрли последнюю цифру и заканчиваем работу.

    Занимательный факт 1: 9 + Q1 - невозможное состояние
    Занимательный факт 2: когда состояние машины Qlast, то она должна указывать на 0.
    Ответ написан
    Комментировать
  • Как сделать эффект бесконечного холста?

    @Sumor
    Берёте канвас размером больше экрана, вплоть до двукратной ширины и высоты.
    При скролировании перемещаете канвас. Как только вы приблизитесь к границе - добавьте с той стороны новый канвас такого же размера. Перемещайте оба канваса пока первый не скроется из виду и вы его можете спокойно удалить.
    При таком подходе достаточно двух канвасов, если у вас перемещается по одной оси, и четырёх, если перемещение по двум осям.
    Ответ написан
    Комментировать
  • Как добавить в индекс массива 2 символа из текст бокса?

    @Sumor
    for (int i=0; i<text.Length; i+=2)
    {
      if(text[i] == ' ') break;
      if(i != text.Length-1)
      {
          sed.Add(byte.Parse(text.Substring(i, 2)));
      }
      else
      {
          sed.Add(byte.Parse(text.Substring(i, 1)));
      }
    }
    Ответ написан
    Комментировать
  • Одинаковый ли результат имеют записи?

    @Sumor
    Всё что создано через new должно быть удалено через delete.
    Ответ написан
    Комментировать
  • Как сделать Поиск анаграмм в заданном словаре?

    @Sumor
    Простая идея для русского языка.
    Для словаря строите следующий индекс:
    Каждой букве (кроме Е=Ё) ставите в соответствие число: А=0 Б=1 ... Я=31
    Если буква встречается в слове, то взводите соответствующий бит числа (вне зависимости от количества букв)
    В этом случае вам для русского языка хватит UInt32 (unsigned int).
    АБАК = 1000000011

    Для поиска анаграммы составляете такое же число и отбираете претендентов из словаря. Затем претендентов окончательно выбираете по точному совпадению встречающихся букв.
    Ответ написан
  • Как получить контрольную сумму для папки?

    @Sumor
    Всё зависит от степени "уникальности" папок.
    Можно предложить следующий способ:
    Берёте имена файлов, их размеры и даты изменения.
    Сортируете их по имени файла.
    Складываете в один файл/строку и считаете хеш.
    Это будет работать при определённых допущениях: что у вас нет злоумышленника, который подменит содержимое файлов без изменения их размера и даты изменения.
    Ответ написан
    1 комментарий
  • Как создать combobox с кастомными шрифтами в коде?

    @Sumor
    Берёте список FontFamily и присваиваете в Source ComboBox.
    <ComboBox>
      <ComboBox.ItemTemplate>
        <DataTemplate>
          <TextBlock FontFamily="{Binding}" Text="{Binding Name}" />
        <DataTemplate>
      </ComboBox.ItemTemplate>
    </ComboBox>
    Ответ написан
    Комментировать
  • Передача большого файла по UDP - частями?

    @Sumor
    UDP не гарантирует доставку. Пакеты могут потеряться. Пакеты могут прийти в другом порядке.
    Длина файла возможно не будет кратно 8192. В RemoteIpEndPoint возможно ошибка. Брендмауэр возможно включён.
    Ваше ПО должно быть к этому готово.
    Ответ написан
    Комментировать
  • Как перенести форматированный текст из двух RichTextBox в один в C#?

    @Sumor
    Всё достаточно просто. Block может принадлежать только одному тексту. Вы его добавляете в новый текст - и он пропадает из старого. Следующий блок "подвигается" на i-ое место и не попадает в обработку.
    Ответ написан
    1 комментарий
  • Три игральные кости подбрасывают по одному разу. которая вероятность того, что при этом все числа на трех гранях будут разными?

    @Sumor
    var cntAll = 0;
    var cntCase = 0;
    for(int i = 0; i < 6; i ++)
      for(int j = 0; j < 6; j++)
        for(int k = 0; k < 6; k++)
        {
          cntAll++;
          if(i == j || i == k || j == k)
            continue;
          cntCase++;
        }
    Console.WriteLine((double)cntCase/(double)cntAll);
    Ответ написан
    Комментировать
  • Как обеспечить уникальность данных в таблице?

    @Sumor
    CREATE UNIQUE INDEX PK_dic_id ON dic (dic_id) INCLUDE (dic_value)

    Этой командой вы создаёте уникальный индекс по полю dic_id. И уникальность обеспечивается только по этому полю. Поле dic_value включается в индекс дополнительно, для того, чтобы быстрее выполнять SELECT, в котором участвуют только эти поля.
    CONSTRAINT PK_dic_id PRIMARY KEY (dic_id, dic_value))

    Создаёт уникальный индекс с двумя полями, то есть уникальность обеспечивается на пару полей в совокупности. так как dic_id у вас уникальный, то уникальность обеспечивается независимо от значения dic_value.

    Правильно создать отдельный уникальный индекс на dic_value:
    CREATE UNIQUE INDEX IX_dic_value ON dic (dic_value)
    Ответ написан
    Комментировать
  • Как из символа '\t' получить табуляцию?

    @Sumor
    var sIn = "1 2\t3";		
    // Первый способ
    var sOut1 = new String(sIn.Select(ch => {switch(ch) 
    		{
    			case '\t': return ' ';
    			case '\n': return ' ';
    			default: return ch;
    		}
    			 }).ToArray());
    // Второй способ
    var sOut2 = String.Concat(sIn.Select(ch => {switch(ch) 
    		{
    			case '\t': return ' ';
    			case '\n': return ' ';
    			default: return ch;
    		}
    			 }));

    Хоть это и выглядит очень страшно, но вот мои аргументы:
    - при использовании Replace происходит полный просмотр строки и создание новой строки. При увеличении количества заменяемых символов - увеличивается число просмотров строки:
    "1 2\t3".replace("\t", " ").replace("\n", " "); - два просмотра строки и два создания строки
    "1 2\t3".replace("\t", " ").replace("\n", " ").replace("|", " "); - три просмотра строки и три создания строки
    - в моём варианте, вне зависимости от количества заменяемых символов просмотр строки происходит только один раз, и один раз создаётся строка. Для расширения проверяемых символов - нужно просто добавить case.

    Хотите более понятно, пожалуйста:
    var sIn = "1 2\t3";		
    var sb = new StringBuilder(sIn.Length);
    foreach(var ch in sIn)
    {
      switch(ch) 
      {
        case '\t': 
        case '\n': 
          sb.Append(' ');
          break;
        default: 
          sb.Append(ch);
          break;
      }
    };
    var sOut = sb.ToString();
    Ответ написан
    4 комментария
  • Задача заполнения поля пазлами. Какие варианты решения?

    @Sumor
    Мне видится метод ветвей и границ (умный перебор).
    Грубо говоря, когда ты ставишь фигуру на поле ты получаешь такую же задачу, но с меньшим количеством элементов и с меньшей площадью поля. Пробуя фигуру, ты по определённым критериям можешь оценить доступность варианта, и если он пока доступен - продолжить процедуру рекурсивно.

    Алгоритм, примерно, следующий:
    1. Выбор фигуры: любой, но для уменьшения количество возможных ветвей решения нужно выбрать фигуру, которая на текущем поле может находиться в наименьших местах. Для этого берём каждый вид фигуры и примеряем на каждое место. При проверке помечаем использованные места поля. Если обнаружится, что есть места, которые невозможно покрыть, то решение в такой конфигурации не существует - отбраковываем ветвь решения.
    2. Ставим фигуру в одно из возможных мест, тем самым мы уменьшаем количество фигур и размер доски. И рекурсивно переходим на шаг 1.

    Для отсекания ветвей можно разработать дополнительные быстрые проверки.
    Выбор места для следующей фигуры также можно делать не случайным образом, а по какому-либо алгоритму.

    Для первого примера: 1х2 - 18 возможных мест, 1х3 - 11 мест, 2х3 - 7 мест. Поэтому мы выбираем третью фигуру для первого шага ветвления.
    Ставим первую фигуру в угол (0,0) вертикально, получаем такую картину:
    0011
    0011
    0011
    0100
    При выполнении первого шага алгоритма выясняется, что поле (1,3) невозможно покрыть ни одной фигурой - ветвь обрывается, переходим к следующему варианту.

    Данный алгоритм точно найдёт нужное решение, так как он сводится, в худшем случае, к полному перебору.
    Ответ написан
    Комментировать
  • Где скачать Microsoft Profect?

    @Sumor
    https://www.projectlibre.com/ - бесплатная альтернатива
    Ответ написан
    Комментировать
  • Как подключится к Telnet из C#?

    @Sumor
    Попробуйте вместо
    string response = Encoding.ASCII.GetString(buffer).Trim();

    string response = Encoding.GetEncoding(1251).GetString(buffer).Trim();

    И ещё проблема может быть в том, что консоль, в которой вы выполняете настроена на однобайтную кодировку, а вы через Console.WriteLine выводите unicode.
    Ответ написан
  • C# - как выбрать хранилище данных в памяти?

    @Sumor
    Всё зависит от того, что необходимо.
    Если необходимо просто проводить последовательную обработку, то нужен IEnumerable.
    Если нужно знать заранее количество элементов, то нужен ICollection.
    Если нужна работа доступ по индексам элементов, то нужен IList.
    Если нужна работа по ключам, то нужен IDictionary.
    Если нужно связывание/отработка изменений элементов, то нужны IBindingList или IObservableCollection.
    Это базовые возможности, которые будет наследовать любой класс для хранения элементов. Дальше если важен способ хранения элементов или особенный доступ - выбираете или реализуете класс с нужными интерфейсами и возможностями.
    Базовые классы: массив, List<T>
    Queue<T> - очередь
    Stack<T> - стек
    Dictionary<TK,TV> - словарь
    ObservableCollection<T> - коллекция с поддержкой событий изменения
    Ответ написан
    2 комментария
  • Как изменять/получить ширину listbox из кода?

    @Sumor
    <Listbox x:name="listbox" ... />
    Затем по имени получаете ширину.
    Ответ написан