using System.Collections.Generic;
internal class TaskSolver
public static void Main(string[] args)
TestGenerateWordsFromWord();
TestGetPreviousMaxDigital();
TestSearchQueenOrHorse();
Console.WriteLine("All Test completed!");
public static List<string> GenerateWordsFromWord(string word, List<string> wordDictionary)
if(!CheckWordNotNull(word)) return new List<string>();
if(!CheckKeyWordLength(word)) return new List<string>();
if(!CheckWordsDictionaryLength(wordDictionary)) return new List<string>();
List<string> matchingWords = new List<string>();
char[] wordToChars = ConvertToCharArray(word);
foreach (string eachWord in wordDictionary){
char [] dictionaryWordToChars = ConvertToCharArray(eachWord);
List<char> chars = new List<char>(dictionaryWordToChars);
for(int i = 0; i < wordToChars.Length; i++){
for(int j = 0; j < chars.Count ; j++){
if(wordToChars[i] == chars[j]){
matchingWords.Add(eachWord);
if (matchingWords.Count == 0){
matchingWords.Add("{} - из букв заданного слова нельзя собрать ни одно слово из словаря, результат пустой массив");
return new List<string>(matchingWords);
public static char[] ConvertToCharArray(string word){
return word.Replace(" ", "").ToLower().ToCharArray();
public static bool CheckWordsDictionaryLength(List<string> words){
if(words.Count>=0 && words.Count<=15000){
Console.WriteLine("Количество слов в словаре не входит в заданный диапазон! (длина списка должна быть в диапазоне от нуля до 15000 включительно)");
public static bool CheckKeyWordLength(string keyWord){
if (keyWord.Length > 2 && keyWord.Length<=15){
Console.WriteLine("Слово которое вы представили не подходит по длине символов, введите другое слово! (условие: символов в слове больше 2 но не более 15)");
public static bool CheckWordNotNull(string keyWord){
Console.WriteLine("Слово которое вы представили - null, введите слово!");
public static bool CheckIfNotNull(string word){
Console.WriteLine("Последовательость является null, введите последовательность отличную от null!");
public static int MaxLengthTwoChar(string word)
int maxUniqueSymbolsInFinalSequence = 2;
List<string> resultString = new List<string>();
string symbolsSet = "abcdefghijklmnopqrstuvwxyz";
char [] symbolsSetTochars = SpecifySymbolsForVerification(symbolsSet);
foreach(char each in symbolsSetTochars){
foreach(char other in symbolsSetTochars){
var result = word.Where(i => i == each || i == other);
resultString.Add(new String(result.ToArray()));
foreach(string each in resultString){
char [] temp = each.ToCharArray();
if(CheckForDuplicateCharacters(each.ToCharArray()) && CheckForUniqueCharactersLeft(symbolsSetTochars, temp, maxUniqueSymbolsInFinalSequence)){
Console.WriteLine( "Итоговая строка: " + each);
if(CountMaxSequenceLength(resultString) >= 2){
return CountMaxSequenceLength(resultString);
Console.WriteLine( "Получить валидную строку нельзя!");
public static int CountMaxSequenceLength(List<string> resultString){
foreach(string each in resultString){
public static bool CheckForUniqueCharactersLeft(char [] symbolsSetTochars, char [] originalStringToChars, int maxUniqueSymbolsInFinalSequence){
for (int i = 0; i < symbolsSetTochars.Length; i++){
for (int j = 0; j < originalStringToChars.Length; j++){
if (originalStringToChars[j] == symbolsSetTochars[i]){
if(occurrences!=maxUniqueSymbolsInFinalSequence){
public static bool CheckForDuplicateCharacters(char [] charSequence){
for (int i = 0; i < charSequence.Length-1; i++){
char temp = charSequence[i+1];
if (charSequence[i]==temp){
public static char [] SpecifySymbolsForVerification(String charsequence){
return charsequence.ToCharArray();
public static char [] SpecifySymbolsFromOriginalString(String originalString){
return originalString.Replace(" ", "").ToLower().Trim().ToCharArray();
public static bool CheckOriginalStringLength(string originalString){
if(originalString.Length>=1 && originalString.Length<=1000){
Console.WriteLine("Количество символов в строке не входит в заданный диапазон! (длина строки должна быть в диапазоне от 1 до 1000 включительно)");
public static long GetPreviousMaxDigital(long value)
string charsToString = value.ToString();
char [] digits = charsToString.ToCharArray();
for(int i = digits.Length - 1; i>=0; i--){
for(int j = digits.Length - 1; j > i; j --){
if (digits[i] > digits[j]){
string s = new string(FindGreatestNumberToTheRight(digits, i));
long l = Convert.ToInt64(s);
static char [] FindGreatestNumberToTheRight(char [] digits, int i){
for(int l = k+1 ; l <= digits.Length-1; l++){
if(digits[l] < digits[k] && digits[l] > temp ){
Array.Sort(digits, i+1, digits.Length-1-i);
Array.Reverse(digits, i+1, digits.Length-1-i);
static void swap(char []ar, int i, int j)
public static List<int> SearchQueenOrHorse(char[][] gridMap)
return new List<int>{-1, -1};
public static long CalculateMaxCoins(int[][] mapData, int idStart, int idFinish)
private static void TestGenerateWordsFromWord()
var wordsList = new List<string>
"кот", "ток", "око", "мимо", "гром", "ром", "мама",
"рог", "морг", "огр", "мор", "порог", "бра", "раб", "зубр"
AssertSequenceEqual( GenerateWordsFromWord("арбуз", wordsList), new []{ "бра", "зубр", "раб"} );
AssertSequenceEqual( GenerateWordsFromWord("лист", wordsList), new List<string>() );
AssertSequenceEqual( GenerateWordsFromWord("маг", wordsList), new List<string>() );
AssertSequenceEqual( GenerateWordsFromWord("погром", wordsList), new List<string>{ "гром", "мор", "морг", "огр", "порог", "рог", "ром"} );
private static void TestMaxLengthTwoChar()
AssertEqual(MaxLengthTwoChar("beabeeab"), 5);
AssertEqual(MaxLengthTwoChar("а"), 0);
AssertEqual(MaxLengthTwoChar("ab"), 2);
private static void TestGetPreviousMaxDigital()
AssertEqual(GetPreviousMaxDigital(21), 12l);
AssertEqual(GetPreviousMaxDigital(531), 513l);
AssertEqual(GetPreviousMaxDigital(1027), -1l);
AssertEqual(GetPreviousMaxDigital(2071), 2017l);
AssertEqual(GetPreviousMaxDigital(207034), 204730l);
AssertEqual(GetPreviousMaxDigital(135), -1l);
private static void TestSearchQueenOrHorse()
new[] {'s', '#', '#', '#', '#', '#'},
new[] {'#', 'x', 'x', 'x', 'x', '#'},
new[] {'#', '#', '#', '#', 'x', '#'},
new[] {'#', '#', '#', '#', 'x', '#'},
new[] {'#', '#', '#', '#', '#', 'e'},
AssertSequenceEqual(SearchQueenOrHorse(gridA), new []{3, 2});
new[] {'s', '#', '#', '#', '#', 'x'},
new[] {'#', 'x', 'x', 'x', 'x', '#'},
new[] {'#', 'x', '#', '#', 'x', '#'},
new[] {'#', '#', '#', '#', 'x', '#'},
new[] {'x', '#', '#', '#', '#', 'e'},
AssertSequenceEqual(SearchQueenOrHorse(gridB), new []{-1, 3});
new[] {'s', '#', '#', '#', '#', 'x'},
new[] {'x', 'x', 'x', 'x', 'x', 'x'},
new[] {'#', '#', '#', '#', 'x', '#'},
new[] {'#', '#', '#', 'e', 'x', '#'},
new[] {'x', '#', '#', '#', '#', '#'},
AssertSequenceEqual(SearchQueenOrHorse(gridC), new []{2, -1});
AssertSequenceEqual(SearchQueenOrHorse(gridD), new []{-1, 1});
AssertSequenceEqual(SearchQueenOrHorse(gridE), new []{1, -1});
new[] {'x', '#', '#', 'x'},
new[] {'#', 'x', 'x', '#'},
new[] {'#', 'x', '#', 'x'},
new[] {'e', 'x', 'x', 's'},
new[] {'#', 'x', 'x', '#'},
new[] {'x', '#', '#', 'x'},
AssertSequenceEqual(SearchQueenOrHorse(gridF), new []{-1, 5});
private static void TestCalculateMaxCoins()
AssertEqual(CalculateMaxCoins(mapA, 0, 3), 11l);
AssertEqual(CalculateMaxCoins(mapB, 0, 5), -1l);
AssertEqual(CalculateMaxCoins(mapC, 0, 5), 19l);
private static void Assert(bool value)
throw new Exception("Assertion failed");
private static void AssertEqual(object value, object expectedValue)
if (value.Equals(expectedValue))
throw new Exception($"Assertion failed expected = {expectedValue} actual = {value}");
private static void AssertSequenceEqual<T>(IEnumerable<T> value, IEnumerable<T> expectedValue)
if (ReferenceEquals(value, expectedValue))
throw new ArgumentNullException(nameof(value));
if (expectedValue is null)
throw new ArgumentNullException(nameof(expectedValue));
var valueList = value.ToList();
var expectedValueList = expectedValue.ToList();
if (valueList.Count != expectedValueList.Count)
throw new Exception($"Assertion failed expected count = {expectedValueList.Count} actual count = {valueList.Count}");
for (var i = 0; i < valueList.Count; i++)
if (!valueList[i].Equals(expectedValueList[i]))
throw new Exception($"Assertion failed expected value at {i} = {expectedValueList[i]} actual = {valueList[i]}");