# Учебная практика. Понедельник 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**, и на **С++**, и чтоб она ещё не была занята коллегами.