Добро пожаловать на новый выпуск рубрики "Algo1C", в которой я стараюсь регулярно решать новые задачи по программированию и делиться своими решениями с вами!
Цель рубрики заключается в тренировке практик по применению различных алгоритмов и в поддержании навыка "Писать код" в тонусе!
Что было раньше:
В предыдущей части (нажмите на строку) мы решили:
- Mumbling(Бормотание) (Нажмите на строку)
- How Many Streets?(Сколько улиц?) (Нажмите на строку)
- Odder Than the Rest(Более нечетный чем остальные) (Нажмите на строку)
- Channelling power of Primes into a new Number(Преобразование силы простых чисел в новое число) (Нажмите на строку)
- Simple string characters(Простые строковые символы) (Нажмите на строку)
В этой части вас ждут еще более интересные алгоритмические задачи. Давайте приступим!
Перед началом чтения решения задачи хочу призвать каждого к самостоятельному решению задачи, чтобы после вы могли сравнить своё решение с моим и обсудить это в комментариях. Буду рад послушать ваше мнение!
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Jaden Casing Strings (Строки в стиле Джейдена)
Ссылка на задачу: https://www.codewars.com/kata/5390bac347d09b7da40006f6 (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Строки, Фундаментальные
Оригинальное описание задачи:
Jaden Smith, the son of Will Smith, is the star of films such as The Karate Kid (2010) and After Earth (2013). Jaden is also known for some of his philosophy that he delivers via Twitter. When writing on Twitter, he is known for almost always capitalizing every word. For simplicity, you'll have to capitalize each word, check out how contractions are expected to be in the example below. Your task is to convert strings to how they would be written by Jaden Smith. The strings are actual quotes from Jaden Smith, but they are not capitalized in the same way he originally typed them.
Example:
Not Jaden-Cased: "How can mirrors be real if our eyes aren't real"
Jaden-Cased: "How Can Mirrors Be Real If Our Eyes Aren't Real"
Пояснение:
В условиях задачи описывается привычка актёра Джейдена Смита (сын Уилла Смита) писать каждое слово с большой буквы в своём твиттере. Наша задача перевести исходную строку в стиль "Джейдена".
Например:
Обычный текст: "How can mirrors be real if our eyes aren't real"
Текст в стиле Джейдена: "How Can Mirrors Be Real If Our Eyes Aren't Real"
Звучит просто, давайте попробуем решить:
Решение:
Для начала разобьем исходное предложение на массив, где каждый элемент будет отдельным словом. Далее напишем цикл для перебора всех элементов этого массива. Затем в каждой итерации будем брать первый символ каждого слова и ставить его в верхний регистр и затем всё это прибавлять к конечной строке. Вот как это будет выглядеть в коде:
ИсходнаяСтрока = "How can mirrors be real if our eyes aren't real";
//
Вывод = "";
Для Каждого Стр Из СтрРазделить(ИсходнаяСтрока," ",Ложь) Цикл
Вывод = Вывод + ВРег(Сред(Стр,1,1)) + Прав(Стр,СтрДлина(Стр)-1) + " ";
КонецЦикла;
Вывод = Лев(Вывод,СтрДлина(Вывод)-1);
Результат:
How Can Mirrors Be Real If Our Eyes Aren't Real
Весьма познавательная получилась задача ибо я не слышал про привычку этого актера писать каждое слово с большой буквы. Видимо это настолько часто обсуждалось что даже до задач по программированию дошло!
Задача 2
Платформа: CodeWars
Название задачи: Sum of two lowest positive integers (Сумма двух наименьших положительных чисел)
Ссылка на задачу: https://www.codewars.com/kata/558fc85d8fd1938afb000014 (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Массивы, Фундаментальные
Оригинальное описание задачи:
Create a function that returns the sum of the two lowest positive numbers given an array of minimum 4 positive integers. No floats or non-positive integers will be passed.
For example, when an array is passed like [19, 5, 42, 2, 77], the output should be 7.
[10, 343445353, 3453445, 3453545353453] should return 3453455.
Пояснение:
Суть задачи заключается в том вывести из массива два наименьших положительных числа и вернуть их сумму.
Например: [19, 5, 42, 2, 77] вернёт 7
Более чем понятно. Давайте попробуем решить:
Решение:
Для начала напишем цикл и в каждой итерации этого цикла будем искать наименьшее значение. Затем напишем второй цикл, который делает тоже самое но он будет исключать первое число. Ну и затем прибавляем эти числа друг к другу и возвращаем. Вот как это будет выглядеть в коде:
ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить(10);
ИсходныйМассив.Добавить(343445353);
ИсходныйМассив.Добавить(3453445);
ИсходныйМассив.Добавить(3453545353453);
//
ПервыйМин = 0;
ВторойМин = 0;
//
Для Каждого Стр Из ИсходныйМассив Цикл
Если Стр > 0 Тогда
Если ПервыйМин= 0 Или Стр < ПервыйМин Тогда
ПервыйМин = Стр;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//
Для Каждого Стр Из ИсходныйМассив Цикл
Если Стр <> ПервыйМин И Стр > 0 Тогда
Если ВторойМин= 0 Или Стр < ВторойМин Тогда
ВторойМин = Стр;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//
Вывод = ПервыйМин + ВторойМин;
Результат:
3,453,455
Простая задача, подойдет в качестве разминки!
Задача 3
Платформа: CodeWars
Название задачи: Credit Card Mask (Маска как у кредитной карты)
Ссылка на задачу: https://www.codewars.com/kata/5412509bd436bd33920011bc (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Строки, Алгоритмы
Оригинальное описание задачи:
Usually when you buy something, you're asked whether your credit card number, phone number or answer to your most secret question is still correct. However, since someone could look over your shoulder, you don't want that shown on your screen. Instead, we mask it. Your task is to write a function maskify, which changes all but the last four characters into '#'.
Examples (input --> output): "4556364607935616" --> "############5616"
"64607935616" --> "#######5616"
"1" --> "1"
"" --> ""
// "What was the name of your first pet?"
"Skippy" --> "##ippy"
"Nananananananananananananananana Batman!" --> "####################################man!"
Пояснение:
Цель задачи заключается в том чтобы скрыть часть данных строки, так, как это обычно делают при работе с номерами карт, оставляя только последние 4 цифры.
Например: "4556364607935616" --> "############5616"
Всем знакомо, всем понятно, давайте попробуем решить:
Решение:
Для начала сразу проверим длину строки. Если она меньше или равна 4 то просто возвращаем исходную строку. Если нет то пишем цикл, количество итераций которого будет равно длине исходной строки но с вычетом 4 значений. В каждой итерации записываем в конечную строку знак решётки. Ну и затем делаем срез последних 4 цифр исходной строки и прибавляем к конечной строке. Вот каким получился код:
ИсходнаяСтрока = "4556364607935616";
//
Если СтрДлина(ИсходнаяСтрока) > 4 Тогда
Вывод = "";
Для НомерЭлемента = 1 По СтрДлина(ИсходнаяСтрока)-4 Цикл
Вывод = Вывод + "#";
КонецЦикла;
//
Вывод = Вывод + Прав(ИсходнаяСтрока,4);
Иначе
Вывод = ИсходнаяСтрока;
КонецЕсли;
Результат:
############5616
Весьма занимательная задача!
Задача 4
Платформа: CodeWars
Название задачи: Complementary DNA (Комплементарная ДНК)
Ссылка на задачу: https://www.codewars.com/kata/554e4a2f232cdd87d9000038 (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Строки, Фундаментальные
Оригинальное описание задачи:
Deoxyribonucleic acid (DNA) is a chemical found in the nucleus of cells and carries the "instructions" for the development and functioning of living organisms. If you want to know more: http://en.wikipedia.org/wiki/DNA In DNA strings, symbols "A" and "T" are complements of each other, as "C" and "G". Your function receives one side of the DNA (string, except for Haskell); you need to return the other complementary side. DNA strand is never empty or there is no DNA at all (again, except for Haskell). More similar exercise are found here: http://rosalind.info/problems/list-view/ (source)
Example:
(input --> output)
"ATTGC" --> "TAACG"
"GTAT" --> "CATA"
Пояснение:
Немного теории. Цепочка ДНК состоит из двух цепей Нуклеодидов. Нуклеотиды это органические соединения, которые взаимодействуют между собой в цепочке ДНК. Особенность этого взаимодействия в том что нуклеотиды всегда взаимодействуют только с определенными нуклеотидами. Например "Аденин" взаимодействует с "Тимином", "Гуанин" с "Цитозином". По условию задачи нам будет дана только одна цепочка нуклеотидов, исходя из которой мы должны собрать вторую цепочку, подбирая нуклеотиды друг к другу. Звучит просто, давайте попробуем решить:
Решение:
Для начала напишем цикл для перебора всех элементов исходной строки. Затем в зависимости от символа, будем подбирать другой символ и записывать его в конечную строку. Вот какой код в итоге получился:
ИсходнаяСтрока = "ATTGC";
//
Вывод = "";
Для НомерЭлемента = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Если Сред(ИсходнаяСтрока,НомерЭлемента,1) = "A" Тогда
Вывод = Вывод + "T";
ИначеЕсли Сред(ИсходнаяСтрока,НомерЭлемента,1) = "T" Тогда
Вывод = Вывод + "A";
ИначеЕсли Сред(ИсходнаяСтрока,НомерЭлемента,1) = "G" Тогда
Вывод = Вывод + "C";
ИначеЕсли Сред(ИсходнаяСтрока,НомерЭлемента,1) = "C" Тогда
Вывод = Вывод + "G";
КонецЕсли;
КонецЦикла;
Результат:
TAACG
Очень занимательная получилась задача!
Задача 5
Платформа: CodeWars
Название задачи: Exes and Ohs (Иксы и О)
Ссылка на задачу: https://www.codewars.com/kata/55908aad6620c066bc00002a (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Фундаментальные
Оригинальное описание задачи:
Check to see if a string has the same amount of 'x's and 'o's. The method must return a boolean and be case insensitive. The string can contain any char.
Examples input/output:
XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true
// when no 'x' and 'o' is present should return true XO("zzoo") => false
Пояснение:
Суть задачи заключается в том чтобы посчитать количество Иксов и О и в зависимости от их количества вернуть Истину или Ложь. Если количество Иксов и О одинаково то возвращаем Истину, иначе возвращаем Ложь
Например: "ooxx" - Истина
Более чем понятно, давайте попробуем решить:
Решение:
Для начала напишем цикл для перебора всех элементов строки. Затем в каждой итерации будем проверять является ли эта буква Иксом или О и в зависимости от результата проверки увеличивать количество букв. Затем просто сравниваем их друг с другом и по правилам из описания возвращаем булево. Вот как это выглядит в коде:
ИсходнаяСтрока = "xooxx";
//
КоличествоИкс = 0;
КоличествоО = 0;
Для НомерСтроки = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Если ВРег(Сред(ИсходнаяСтрока,НомерСтроки,1)) = "X" Тогда
КоличествоИкс = КоличествоИкс + 1;
ИначеЕсли ВРег(Сред(ИсходнаяСтрока,НомерСтроки,1)) = "O" Тогда
КоличествоО = КоличествоО + 1;
КонецЕсли;
КонецЦикла;
//
Если КоличествоИкс = КоличествоО Тогда
Вывод = Истина;
Иначе
Вывод = Ложь;
КонецЕсли;
Результат:
Нет
Простая и интересная задача!
Новое в конфигурации Algo1C:
Заключение:
Платформа: CodeWars
Название задачи: Jaden Casing Strings (Строки в стиле Джейдена)
Ссылка на задачу: https://www.codewars.com/kata/5390bac347d09b7da40006f6 (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Строки, Фундаментальные
Оригинальное описание задачи:
Jaden Smith, the son of Will Smith, is the star of films such as The Karate Kid (2010) and After Earth (2013). Jaden is also known for some of his philosophy that he delivers via Twitter. When writing on Twitter, he is known for almost always capitalizing every word. For simplicity, you'll have to capitalize each word, check out how contractions are expected to be in the example below. Your task is to convert strings to how they would be written by Jaden Smith. The strings are actual quotes from Jaden Smith, but they are not capitalized in the same way he originally typed them.
Example:
Not Jaden-Cased: "How can mirrors be real if our eyes aren't real"
Jaden-Cased: "How Can Mirrors Be Real If Our Eyes Aren't Real"
Пояснение:
В условиях задачи описывается привычка актёра Джейдена Смита (сын Уилла Смита) писать каждое слово с большой буквы в своём твиттере. Наша задача перевести исходную строку в стиль "Джейдена".
Например:
Обычный текст: "How can mirrors be real if our eyes aren't real"
Текст в стиле Джейдена: "How Can Mirrors Be Real If Our Eyes Aren't Real"
Звучит просто, давайте попробуем решить:
Решение:
Для начала разобьем исходное предложение на массив, где каждый элемент будет отдельным словом. Далее напишем цикл для перебора всех элементов этого массива. Затем в каждой итерации будем брать первый символ каждого слова и ставить его в верхний регистр и затем всё это прибавлять к конечной строке. Вот как это будет выглядеть в коде:
ИсходнаяСтрока = "How can mirrors be real if our eyes aren't real";
//
Вывод = "";
Для Каждого Стр Из СтрРазделить(ИсходнаяСтрока," ",Ложь) Цикл
Вывод = Вывод + ВРег(Сред(Стр,1,1)) + Прав(Стр,СтрДлина(Стр)-1) + " ";
КонецЦикла;
Вывод = Лев(Вывод,СтрДлина(Вывод)-1);
Результат:
How Can Mirrors Be Real If Our Eyes Aren't Real
Весьма познавательная получилась задача ибо я не слышал про привычку этого актера писать каждое слово с большой буквы. Видимо это настолько часто обсуждалось что даже до задач по программированию дошло!
Платформа: CodeWars
Название задачи: Sum of two lowest positive integers (Сумма двух наименьших положительных чисел)
Ссылка на задачу: https://www.codewars.com/kata/558fc85d8fd1938afb000014 (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Массивы, Фундаментальные
Оригинальное описание задачи:
Create a function that returns the sum of the two lowest positive numbers given an array of minimum 4 positive integers. No floats or non-positive integers will be passed.
For example, when an array is passed like [19, 5, 42, 2, 77], the output should be 7.
[10, 343445353, 3453445, 3453545353453] should return 3453455.
Пояснение:
Суть задачи заключается в том вывести из массива два наименьших положительных числа и вернуть их сумму.
Например: [19, 5, 42, 2, 77] вернёт 7
Более чем понятно. Давайте попробуем решить:
Решение:
Для начала напишем цикл и в каждой итерации этого цикла будем искать наименьшее значение. Затем напишем второй цикл, который делает тоже самое но он будет исключать первое число. Ну и затем прибавляем эти числа друг к другу и возвращаем. Вот как это будет выглядеть в коде:
ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить(10);
ИсходныйМассив.Добавить(343445353);
ИсходныйМассив.Добавить(3453445);
ИсходныйМассив.Добавить(3453545353453);
//
ПервыйМин = 0;
ВторойМин = 0;
//
Для Каждого Стр Из ИсходныйМассив Цикл
Если Стр > 0 Тогда
Если ПервыйМин= 0 Или Стр < ПервыйМин Тогда
ПервыйМин = Стр;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//
Для Каждого Стр Из ИсходныйМассив Цикл
Если Стр <> ПервыйМин И Стр > 0 Тогда
Если ВторойМин= 0 Или Стр < ВторойМин Тогда
ВторойМин = Стр;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//
Вывод = ПервыйМин + ВторойМин;
Результат:
3,453,455
Простая задача, подойдет в качестве разминки!
Платформа: CodeWars
Название задачи: Credit Card Mask (Маска как у кредитной карты)
Ссылка на задачу: https://www.codewars.com/kata/5412509bd436bd33920011bc (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Строки, Алгоритмы
Оригинальное описание задачи:
Usually when you buy something, you're asked whether your credit card number, phone number or answer to your most secret question is still correct. However, since someone could look over your shoulder, you don't want that shown on your screen. Instead, we mask it. Your task is to write a function maskify, which changes all but the last four characters into '#'.
Examples (input --> output): "4556364607935616" --> "############5616"
"64607935616" --> "#######5616"
"1" --> "1"
"" --> ""
// "What was the name of your first pet?"
"Skippy" --> "##ippy"
"Nananananananananananananananana Batman!" --> "####################################man!"
Пояснение:
Цель задачи заключается в том чтобы скрыть часть данных строки, так, как это обычно делают при работе с номерами карт, оставляя только последние 4 цифры.
Например: "4556364607935616" --> "############5616"
Всем знакомо, всем понятно, давайте попробуем решить:
Решение:
Для начала сразу проверим длину строки. Если она меньше или равна 4 то просто возвращаем исходную строку. Если нет то пишем цикл, количество итераций которого будет равно длине исходной строки но с вычетом 4 значений. В каждой итерации записываем в конечную строку знак решётки. Ну и затем делаем срез последних 4 цифр исходной строки и прибавляем к конечной строке. Вот каким получился код:
ИсходнаяСтрока = "4556364607935616";
//
Если СтрДлина(ИсходнаяСтрока) > 4 Тогда
Вывод = "";
Для НомерЭлемента = 1 По СтрДлина(ИсходнаяСтрока)-4 Цикл
Вывод = Вывод + "#";
КонецЦикла;
//
Вывод = Вывод + Прав(ИсходнаяСтрока,4);
Иначе
Вывод = ИсходнаяСтрока;
КонецЕсли;
Результат:
############5616
Весьма занимательная задача!
Платформа: CodeWars
Название задачи: Complementary DNA (Комплементарная ДНК)
Ссылка на задачу: https://www.codewars.com/kata/554e4a2f232cdd87d9000038 (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Строки, Фундаментальные
Оригинальное описание задачи:
Deoxyribonucleic acid (DNA) is a chemical found in the nucleus of cells and carries the "instructions" for the development and functioning of living organisms. If you want to know more: http://en.wikipedia.org/wiki/DNA In DNA strings, symbols "A" and "T" are complements of each other, as "C" and "G". Your function receives one side of the DNA (string, except for Haskell); you need to return the other complementary side. DNA strand is never empty or there is no DNA at all (again, except for Haskell). More similar exercise are found here: http://rosalind.info/problems/list-view/ (source)
Example:
(input --> output)
"ATTGC" --> "TAACG"
"GTAT" --> "CATA"
Пояснение:
Немного теории. Цепочка ДНК состоит из двух цепей Нуклеодидов. Нуклеотиды это органические соединения, которые взаимодействуют между собой в цепочке ДНК. Особенность этого взаимодействия в том что нуклеотиды всегда взаимодействуют только с определенными нуклеотидами. Например "Аденин" взаимодействует с "Тимином", "Гуанин" с "Цитозином". По условию задачи нам будет дана только одна цепочка нуклеотидов, исходя из которой мы должны собрать вторую цепочку, подбирая нуклеотиды друг к другу. Звучит просто, давайте попробуем решить:
Решение:
Для начала напишем цикл для перебора всех элементов исходной строки. Затем в зависимости от символа, будем подбирать другой символ и записывать его в конечную строку. Вот какой код в итоге получился:
ИсходнаяСтрока = "ATTGC";
//
Вывод = "";
Для НомерЭлемента = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Если Сред(ИсходнаяСтрока,НомерЭлемента,1) = "A" Тогда
Вывод = Вывод + "T";
ИначеЕсли Сред(ИсходнаяСтрока,НомерЭлемента,1) = "T" Тогда
Вывод = Вывод + "A";
ИначеЕсли Сред(ИсходнаяСтрока,НомерЭлемента,1) = "G" Тогда
Вывод = Вывод + "C";
ИначеЕсли Сред(ИсходнаяСтрока,НомерЭлемента,1) = "C" Тогда
Вывод = Вывод + "G";
КонецЕсли;
КонецЦикла;
Результат:
TAACG
Очень занимательная получилась задача!
Платформа: CodeWars
Название задачи: Exes and Ohs (Иксы и О)
Ссылка на задачу: https://www.codewars.com/kata/55908aad6620c066bc00002a (Нажмите на строку)
Сложность: 7 kyu (7 / 8)
Тэги: Фундаментальные
Оригинальное описание задачи:
Check to see if a string has the same amount of 'x's and 'o's. The method must return a boolean and be case insensitive. The string can contain any char.
Examples input/output:
XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true
// when no 'x' and 'o' is present should return true XO("zzoo") => false
Пояснение:
Суть задачи заключается в том чтобы посчитать количество Иксов и О и в зависимости от их количества вернуть Истину или Ложь. Если количество Иксов и О одинаково то возвращаем Истину, иначе возвращаем Ложь
Например: "ooxx" - Истина
Более чем понятно, давайте попробуем решить:
Решение:
Для начала напишем цикл для перебора всех элементов строки. Затем в каждой итерации будем проверять является ли эта буква Иксом или О и в зависимости от результата проверки увеличивать количество букв. Затем просто сравниваем их друг с другом и по правилам из описания возвращаем булево. Вот как это выглядит в коде:
ИсходнаяСтрока = "xooxx";
//
КоличествоИкс = 0;
КоличествоО = 0;
Для НомерСтроки = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Если ВРег(Сред(ИсходнаяСтрока,НомерСтроки,1)) = "X" Тогда
КоличествоИкс = КоличествоИкс + 1;
ИначеЕсли ВРег(Сред(ИсходнаяСтрока,НомерСтроки,1)) = "O" Тогда
КоличествоО = КоличествоО + 1;
КонецЕсли;
КонецЦикла;
//
Если КоличествоИкс = КоличествоО Тогда
Вывод = Истина;
Иначе
Вывод = Ложь;
КонецЕсли;
Результат:
Нет
Простая и интересная задача!
Ну что ж, пока на этом всё, надеюсь, статья была увлекательной для вас, благодарю за внимание. Подключайтесь к решению алгоритмических задач вместе со мной, делитесь вашим мнением и решениями в комментариях! Увидимся в новой статье!