• Как сделать Поиск анаграмм в заданном словаре?

    Для поиска анаграмм состоящих из одинакового количества букв или меньшего числа букв я делал так:
    Для того чтобы слово из словаря можно было считать анаграммой нашего слова должно совпасть три условия:
    1. Количество букв в словарном слове не должно превышать количество букв в нашем слове (простая проверка на длину слова).
    2. Также слово в словаре не должно содержать такие буквы, которые отсутствует в нашем слове. Например - слово "бур" не является анаграммой слова "робот".
    3. Количество одинаковых букв в словарном слове не должно превышать их количество в искомом слове. Данный пункт проверял через составление и сравнение двух ассоциативных массивов вида: "буква" -> "количество ее повторений". Например: "тара" - [т] -> 1, [а] -> 2, [р] -> 1.
    Когда эти три условия совпадут слово можно считать анаграммой.
    Вот рабочий код: https://tinyurl.com/rskes9g
    Ответ написан
  • Как переместить файл?

    Если я правильно понял, что начальный путь в title, а конечный в mydir, то:
    File.Move(title, mydir);
    Я бы добавил еще проверку на существование файла в указанном пути, потому что, если файл уже существует, то выпадет исключение IOException. В итоге:
    if (File.Exists(mydir))	
         File.Delete(mydir);
    File.Move(title, mydir);
    Ответ написан
  • Перебор массива на совпадения!?

    Если я правильно понял вопрос, то через словарь это делается вот так:
    using System;
    using System.Collections.Generic;
    
    namespace GetRepetitions
    {
        class Program
        {
            static void Main(string[] args)
            {
                var scoreCombo = new int[] { 1, 2, 1, 1, 1 };
                var repetitions = GetRepetitionsCount(scoreCombo);   
                
                foreach (var kv in repetitions)           
                    Console.WriteLine($"Num: {kv.Key}, Rep. Count: {kv.Value}");            
            }
    
            static Dictionary<int, int> GetRepetitionsCount(int[] arr)
            {
                var repetitions = new Dictionary<int, int>();
                foreach (var num in arr)
                    if (repetitions.ContainsKey(num))
                        repetitions[num]++;
                    else
                        repetitions.Add(num, 0);
                return repetitions;
            }
        }
    }
    Ответ написан
    Комментировать
  • C#. Как посчитать количество слова из словаря в тексте?

    Возможно не очень хорошо понял вашу проблему, но может вот так:
    class Program
    {
        static void Main(string[] args)
        {
            var text_path = Environment.CurrentDirectory + @"/files/text.txt";
            var text = File.ReadAllText(text_path);
    
            var good_dict_path = Environment.CurrentDirectory + @"/files/good.txt";
            var good_dict = File.ReadAllLines(good_dict_path).ToHashSet();
    
            var bad_dict_path = Environment.CurrentDirectory + @"/files/bad.txt";
            var bad_dict = File.ReadAllLines(bad_dict_path).ToHashSet();
    
            var text_arr = GetTextAsArray(text);
            
            var good_count = GetWordsCount(text_arr, good_dict);
            var bad_count = GetWordsCount(text_arr, bad_dict);
    
            Console.WriteLine(good_count);
            Console.WriteLine(bad_count);
        }
    
        static IEnumerable<string> GetTextAsArray(string text)
        {
            return text.Split('.', ' ', ',', ':', ';', '!', '?', '\t', '\n', '\r', '(', ')')
                .Where(x => x.Length > 0);                       
        }
    
        static int GetWordsCount(IEnumerable<string> text_arr, HashSet<string> dictionary)
        {
            var count = 0;                      
            foreach (var str in text_arr)            
                if (dictionary.Contains(str))
                    count++;
            return count;
        }
    }
    Ответ написан
    Комментировать
  • Где ошибка в переборе?

    Не понимаю зачем внутри метода этот цикл. Можно сделать несколько проще. Смысл в том, чтобы на каждом вызове метода AlternateCharCases менять регистр буквы word[startIndex] на нижний и вызывать этот же метод со смещением startIndex, затем менять регистр на верхний и снова вызывать этот же метод . Наверно не очень ясно выразился, вот работающий код:
    static void AlternateCharCases(char[] word, int startIndex, List<string> result)
    {
         if (word.Length == startIndex)
         {
              result.Add(new string(word));
              return;
         }
         word[startIndex] = char.ToLower(word[startIndex]);
         AlternateCharCases(word, startIndex + 1, result);
         word[startIndex] = char.ToUpper(word[startIndex]);
         AlternateCharCases(word, startIndex + 1, result);
    }
    Ответ написан