# Учебная практика. Понедельник 05.07.2021. Чачко Натан Леонидович ## 1. Задача [Reverse a Number](https://www.codewars.com/kata/555bfd6f9f9f52680f0000c5/train/java), сложность 7 kyu Given a number, write a function to output its reverse digits. (e.g. given 123 the answer is 321) Numbers should preserve their sign; i.e. a negative number should still be negative when reversed. ### Examples ``` 123 -> 321 -456 -> -654 1000 -> 1 ``` Для данного числа напишите функцию для вывода его обратных цифр. (например, если дано 123, ответ будет 321) Числа должны сохранять свой знак; т.е. отрицательное число должно быть отрицательным при обратном преобразовании. ### Примеры ``` 123 -> 321 -456 -> -654 1000 -> 1 ``` ### Решение на языке **С++**. ```c= long long reverseNumber(long long n) { long long reverse = 0, rem; while(n != 0){ rem = n % 10; reverse = reverse * 10 + rem; n /= 10; } return reverse; } ``` ### Решение на языке **Java**. ```java= public class ReverseNumber { public static int reverse(int number) { int reverse = 0, rem; while(number != 0){ rem = number % 10; reverse = reverse * 10 + rem; number /= 10; } return reverse; } } ``` ## 2. Задача [max diff - easy](https://www.codewars.com/kata/588a3c3ef0fbc9c8e1000095/train/java), сложность 7 kyu You must implement a function that return the difference between the biggest and the smallest value in a list(```lst```) received as parameter. The list(```lst```) contains integers, that means it may contain some negative numbers. If the list is empty or contains a single element, ```return 0```. The list(```lst```) is not sorted. ### Examples ``` maxDiff([1, 2, 3, 4]); // return 3, because 4 - 1 == 3 maxDiff([1, 2, 3, -4]); // return 7, because 3 - (-4) == 7 ``` Вы должны реализовать функцию, которая возвращает разницу между наибольшим и наименьшим значением в списке (```lst```), полученном в качестве параметра. Список (```lst```) содержит целые числа, что означает, что он может содержать некоторые отрицательные числа. Если список пуст или содержит единственный элемент, возвращается 0. Список (```lst```) не отсортирован. ### Примеры ``` maxDiff([1, 2, 3, 4]); // возвращает 3, потому что 4 - 1 == 3 maxDiff([1, 2, 3, -4]); // возвращает 7, потому что 3 - (-4) == 7 ``` ### Решение на языке **С++**. ```c= #include <bits/stdc++.h> #include <vector> using namespace std; int maxDiff(int lst[], int n) { std::vector<int> dest(lst, lst + n); std::sort (dest.begin(), dest.end()); return n > 0 ? dest[n-1]-dest[0] : 0; } int main(){ int n = 7; int arr[n] = { 1, 2, 3, 4, 10, 5, 4 }; cout << maxDiff(arr, n); } ``` Решение реализовал вместе с функцией ```main```, так как на сайте не было возможности проверить эту задачу на языке **С++**. ### Решение на языке **Java**. ```java= import java.util.Arrays; public class Kata { public static int maxDiff(int[] lst) { Arrays.sort(lst); return lst.length > 0 ? lst[lst.length-1]-lst[0] : 0; } } ``` ## 3. Задача [Find the GCF of Two Numbers](https://www.codewars.com/kata/579e3476cf1fa55592000045/train/cpp), сложность 7 kyu Your task here is the find the GCF (Greatest Common Factor) of any two numbers passed into a method, which will return one integer answer as an output. ### Examples ``` findGCF(4, 6); // Should return 2 findGCF(93, 186); // Should return 93 findGCF(20, 5); // Should return 5 ``` Ваша задача здесь - найти НОД (наибольший общий делитель) любых двух чисел, переданных в метод, который вернет один целочисленный ответ в качестве вывода. ### Примеры ``` findGCF(4, 6); // должно вернуть 2 findGCF(93, 186); // должно вернуть 93 findGCF(20, 5); // должно вернуть 5 ``` ### Решение на языке **С++**. ```c= int findGCF(int num1, int num2){ return num2 == 0 ? num1 : findGCF(num2, num1%num2); } ``` ### Решение на языке **Java**. ```java= class Kata { public static int findGCF(int num1, int num2){ return num2 == 0 ? num1 : findGCF(num2, num1%num2); } } ``` В решении задачи была использована рекурсивная функция, которая считает НОД по алгоритму Евклида. ## 4. Задача [Number of Decimal Digits](https://www.codewars.com/kata/58fa273ca6d84c158e000052), сложность 7 kyu Determine the total number of digits in the integer (n>=0) given as input to the function. For example, 9 is a single digit, 66 has 2 digits and 128685 has 6 digits. Be careful to avoid overflows/underflows. All inputs will be valid. Определите общее количество цифр целого числа (```n >= 0```), заданного в качестве входных данных для функции. Например, 9 - это одна цифра, 66 - 2 цифры, а 128685 - 6 цифр. Будьте осторожны, чтобы избежать переполнения ### Решение на языке **С++**. ```c= #include <cstdint> unsigned digits(std::uint64_t n) { unsigned res = 1; while (n >= 10) { res++; n /= 10; } return res; } ``` ### Решение на языке **Java**. ```java= public class DecTools { public static int Digits(long n) { int res = 1; while(n >= 10) { res++; n /= 10; } return res; } } ``` ## 5. Задача [Complementary DNA](https://www.codewars.com/kata/554e4a2f232cdd87d9000038/cpp), сложность 7 kyu 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". You have function with one side of the DNA (string, except for Haskell); you need to get the other complementary side. DNA strand is never empty or there is no DNA at all (again, except for Haskell). ### Examples ``` DNA_strand ("ATTGC") # return "TAACG" DNA_strand ("GTAT") # return "CATA" ``` Дезоксирибонуклеиновая кислота (ДНК) --- это химическое вещество, обнаруженное в ядре клеток и несущее «инструкции» для развития и функционирования живых организмов. Если вы хотите узнать больше, http://en.wikipedia.org/wiki/DNA В цепочках ДНК символы «А» и «Т» дополняют друг друга, как «С» и «G». У вас есть функция с одной стороной ДНК (строка, кроме Haskell); вам нужно получить другую дополнительную сторону. Нить ДНК никогда не бывает пустой или ДНК вообще не бывает (опять же, за исключением Haskell). ### Примеры ``` DNA_strand ("ATTGC") # возвращает "TAACG" DNA_strand ("GTAT") # возвращает "CATA" ``` ### Решение на языке **С++**. ```c= using namespace std; string DNAStrand(string dna) { string res; for(int i = 0;i<dna.length();i++){ if(dna[i] == 'A') res += "T"; if(dna[i] == 'T') res += "A"; if(dna[i] == 'C') res += "G"; if(dna[i] == 'G') res += "C"; } return res; } ``` ### Решение на языке **Java**. ```java= public class DnaStrand { public static String makeComplement(String dna) { return dna.replace("A","B") .replace("C","D") .replace("T","A") .replace("G","C") .replace("B","T") .replace("D","G"); } } ``` На языке **Java** есть встроенная функция ```replace()```, позволяющая легко заменять символы в строке. Эту функцию я и использовал при оформлении кода на **Java**. А для **С++** пришлось выкручиваться через массив. ## 6. Задача [If you can't sleep, just count sheep!!](https://www.codewars.com/kata/5b077ebdaf15be5c7f000077), сложность 8 kyu If you can't sleep, just count sheep!! **Task:** Given a non-negative integer, ```3``` for example, return a string with a murmur: ```"1 sheep...2 sheep...3 sheep..."```. Input will always be valid, i.e. no negative integers. Если не можешь заснуть, считай овец !! **Задача:** Если задано неотрицательное целое число, например `` 3``, вернуть строку с бормотанием: ```" 1 овца ... 2 овцы ... 3 овцы ... "```. Ввод всегда будет действительным, т.е. отрицательных целых чисел нет. ### Решение на языке **С++**. ```c= #include <string> std::string countSheep(int number) { std::string res(""); for (int i = 1; i<=number; i++) res = res + std::to_string(i) + " sheep..."; return res; } ``` ### Решение на языке **Java**. ```java= class Kata { public static String countingSheep(int num) { String res = ""; for (int i = 1; i<=num; i++) res = res + i + " sheep..."; return res; } } ``` ## 7. Задача [Thinkful - String Drills: Repeater](https://www.codewars.com/kata/585a1a227cb58d8d740001c3/train/cpp), сложность 7 kyu Write a function named ```repeater()``` that takes two arguments (a string and a number), and returns a new string where the input string is repeated that many times. Напишите функцию с именем ```repeater()```, которая принимает два аргумента (строку и число) и возвращает новую строку, в которой входная строка повторяется столько раз, сколько показывает это число. ### Решение на языке **С++**. ```c= #include <string> std::string repeater(std::string str, int n){ std::string res(""); for (int i = 1; i<=n; i++) res += str; return res; } ``` ### Решение на языке **Java**. ```java= public class Repeater{ public static String repeat(String string,long n){ String res = ""; for (long i = 1; i<=n; i++) res += string; return res; } } ``` ## 8. Задача [Largest 5 digit number in a series](https://www.codewars.com/kata/51675d17e0c1bed195000001), сложность 7 kyu In the following 6 digit number: `283910` `91` is the greatest sequence of 2 consecutive digits. In the following 10 digit number: `1234567890` `67890` is the greatest sequence of 5 consecutive digits. Complete the solution so that it returns the greatest sequence of five consecutive digits found within the number given. The number will be passed in as a string of only digits. It should return a five digit integer. The number passed may be as large as 1000 digits. В следующем шестизначном числе: `283910` `91` - это наибольшая последовательность из 2-х последовательных цифр. В следующем 10-значном числе: `1234567890` `67890` - это наибольшая последовательность из 5 последовательных цифр. Завершите решение так, чтобы оно возвращало наибольшую последовательность из пяти последовательных цифр, найденных в данном числе. Номер будет передан в виде строки, состоящей только из цифр. Он должен возвращать пятизначное целое число. Передаваемое число может быть до 1000 цифр. ### Решение на языке **С++**. ```c= #include <string> int largest_five_digits(const std::string &digits){ int max = 0; for (size_t i = 0; i <= digits.size()-5; i++){ if (std::stoi(digits.substr(i, 5)) > max) max = std::stoi(digits.substr(i, 5)); } return max; } ``` ### Решение на языке **Java**. ```java= public class LargestFiveDigitNumber { public static int solve(final String digits) { int max = 0; for (int i = 0; i <= digits.length() - 5; i++) { int sub = Integer.valueOf(digits.substring(i, i+5)); if (sub > max) max = sub; } return max; } } ``` > **Заключение**: на занятии успел защитить 3 задачи, остальные доделал в течение дня. Также показал свое [прошлое задание](https://replit.com/@Natanius18/PRACTICE-DAY-4#script.js) с визуализацией вагонетки, но нужно переделать построение циклоиды. > Язык **Java** на мой взгляд в некоторых аспектах лучше **С++**, в основном потому, что в нем уже есть много полезных функций, которые позволяют решить задачу буквально в две строчки, в то время как на С++ приходится самому придумывать реализацию. > Еще была некоторая сложность с выбором задач на сайте codewars.com, так как нужно было найти задачу, которую можно было бы решить и на **Jav'e**, и на **С++**, и чтоб она ещё не была занята коллегами.