Добро пожаловать на новый выпуск рубрики "Algo1C", в которой я стараюсь регулярно находить новые задачи по программированию и делиться их решениями с вами!
Цель рубрики заключается в тренировке практик по применению различных алгоритмов, в поддержании навыка "Писать код" в тонусе ну и само собой немного поразвлечься!
Что было раньше:
В предыдущей части (нажмите на строку) мы решили:
- Satisfying numbers (Удовлетворительные числа) (Нажмите на строку)
- Triple trouble (Тройная угроза) (Нажмите на строку)
- Array element parity (Равенство элементов массива) (Нажмите на строку)
- Are they square? (Они квадратные?) (Нажмите на строку)
- Find Screen Size (Найди размер экрана) (Нажмите на строку)
В этой части вас ждут еще более интересные алгоритмические задачи. Давайте приступим!
Дисклеймер:
Перед началом просмотра решения задачи хочу призвать каждого к самостоятельному решению самой задачи, для того чтобы после вы могли сравнить своё решение с решением из этой статьи и обсудить это в комментариях, буду рад послушать ваше мнение. При этом большая просьба сохранять позитивный настрой и доброжелательность!
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: Battle of the characters (Easy) (Битва символов (Легко))
Ссылка на задачу: https://www.codewars.com/kata/595519279be6c575b5000016 (Нажмите на строку)
Сложность: 7 (7 / 8)
Уже решили (На момент написания статьи): 1,134 из 4,078
Тэги: Алгоритмы
Оригинальное описание задачи:
Groups of characters decided to make a battle. Help them to figure out which group is more powerful. Create a function that will accept 2 strings and return the one who's stronger.
Rules:
- Each character have its own power:
A = 1, B = 2, ... Y = 25, Z = 26
- Strings will consist of uppercase letters only
- Only two groups to a fight.
- Group whose total power (
A + B + C + ...
) is bigger wins.
- If the powers are equal, it's a tie.
Examples:
* "ONE", "TWO" -> "TWO"`
* "ONE", "NEO" -> "Tie!"
Related kata:
Пояснение задачи:
По условию задачи нам сказано что группа символов решила устроить схватку. Наша с вами задача помочь им в этом. Необходимо написать код, который принимает 2 строки и возвращает ту что сильнее. Для того чтобы определить какая строка сильнее, мы будем придерживаться следующих правил:
Правила:
Каждый символ имеет свою силу: A = 1, B = 2, ... Y = 25, Z = 26
Строки всегда будут в верхнем регистре
Только 2 группы символов могут участвовать в схватке
Группа, чья общая сила больше (A + B + C ...), побеждает
Если сила строк одинакова, это засчитывается за ничью
Решение задачи:
(Нажмите на спойлер чтобы увидеть решение)
Задача 2
Платформа: CodeWars
Название задачи: You Got Change? (У тебя есть сдача?)
Ссылка на задачу: https://www.codewars.com/kata/5966f6343c0702d1dc00004c (Нажмите на строку)
Сложность: 7 (7 / 8)
Уже решили (На момент написания статьи): 1,190 из 3,100
Тэги: Фундаментальные
Оригинальное описание задачи:
Create a function that will take any amount of money and break it down to the smallest number of bills as possible. Only integer amounts will be input, NO floats. This function should output a sequence, where each element in the array represents the amount of a certain bill type. The array will be set up in this manner:
array[0] ---> represents $1 bills
array[1] ---> represents $5 bills
array[2] ---> represents $10 bills
array[3] ---> represents $20 bills
array[4] ---> represents $50 bills
array[5] ---> represents $100 bills
In the case below, we broke up $365 into 1 $5 bill, 1 $10 bill, 1 $50 bill, and 3 $100 bills:
365 => [0,1,1,0,1,3]
In this next case, we broke $217 into 2 $1 bills, 1 $5 bill, 1 $10 bill, and 2 $100 bills:
217 => [2,1,1,0,0,2]
Пояснение задачи:
Цель задачи заключается в том чтобы написать код, который будет принимать какую-то сумму и возвращать максимально возможное количество купюр. Также по условию задачи уточняется что исходная сумма будет числом без дробной части.
В качестве результата нам с вами необходимо будет вернть массив, где каждый элемент будет отражать количество купюр по их типам:
array[0] ---> represents $1 bills
array[1] ---> represents $5 bills
array[2] ---> represents $10 bills
array[3] ---> represents $20 bills
array[4] ---> represents $50 bills
array[5] ---> represents $100 bills
Например сумму в 365 долларов мы можем собрать из следующего количества купюр:
365 => [0,1,1,0,1,3]
Точно также с суммой в 217 долларов: 217 => [2,1,1,0,0,2]
Решение задачи:
(Нажмите на спойлер чтобы увидеть решение)
Задача 3
Платформа: CodeWars
Название задачи: Ideal electron distribution (Идеальное распределение электронов)
Ссылка на задачу: https://www.codewars.com/kata/59175441e76dc9f9bc00000f (Нажмите на строку)
Сложность: 6 (6 / 8)
Уже решили (На момент написания статьи): 538 из 1,391
Тэги: Массивы, Списки, Алгоритмы
Оригинальное описание задачи:
You are a khmmadkhm scientist and you decided to play with electron distribution among atom's shells. You know that basic idea of electron distribution is that electrons should fill a shell until it's holding the maximum number of electrons.
Rules:
- Maximum number of electrons in a shell is distributed with a rule of 2n^2 (n being position of a shell).
- For example, maximum number of electrons in 3rd shell is 2*3^2 = 18.
- Electrons should fill the lowest level shell first.
- If the electrons have completely filled the lowest level shell, the other unoccupied electrons will fill the higher level shell and so on.
Ex.: atomicNumber(1); should return [1]
atomicNumber(10); should return [2, 8]
atomicNumber(11); should return [2, 8, 1]
atomicNumber(47); should return [2, 8, 18, 19]
Пояснение задачи:
По условию задачи мы некий учёный, который решил заняться распределением электронов по оболочкам атома. Наша с вами цель заключается в том, чтобы написать код, который распределит электроны по оболочкам атома согласно основным принципам заполнения электронных оболочек.
Правила следующие:
- Максимальная вместимость оболочки определяется формулой 2n^2, где n – номер оболочки.
- Электроны заполняют сначала самые нижние оболочки, прежде чем переходить к более высоким.
- Если самая низкая оболочка заполнена полностью, оставшиеся электроны переходят на следующую оболочку и т.д. Например:
Если количество электронов равно 1 то в качестве результата мы должны вернуть массив [1]
Точно по такому же принципу получим:
10 ---> [2, 8]
11 ---> [2, 8, 1]
47 ---> [2, 8, 18, 19]
Решение задачи:
(Нажмите на спойлер чтобы увидеть решение)
Задача 4
Платформа: CodeWars
Название задачи: Ball Upwards (Мяч вверх)
Ссылка на задачу: https://www.codewars.com/kata/566be96bb3174e155300001b (Нажмите на строку)
Сложность: 6 (6 / 8)
Уже решили (На момент написания статьи): 2,192 из 8,163
Тэги: Фундаментальные
Оригинальное описание задачи:
You throw a ball vertically upwards with an initial speed v (in km per hour)
. The height h
of the ball at each time t
is given by h = v*t - 0.5*g*t*t
where g
is Earth's gravity (g ~ 9.81 m/s**2)
. A device is recording at every tenth of second the height of the ball. For example with v = 15 km/h
the device gets something of the following form: (0, 0.0), (1, 0.367...), (2, 0.637...), (3, 0.808...), (4, 0.881..) ...
where the first number is the time in tenth of second and the second number the height in meter.
Task
Write a function max_ball
with parameter v (in km per hour)
that returns the time in tenth of second
of the maximum height recorded by the device.
Examples:
max_ball(15) should return 4
max_ball(25) should return 7
Notes
- Remember to convert the velocity from km/h to m/s or from m/s in km/h when necessary.
- The maximum height recorded by the device is not necessarily the maximum height reached by the ball.
Пояснение задачи:
Наша с вами задача состоит в том, чтобы определить момент времени (в десятых долях секунды), когда устройство зафиксирует максимальную высоту подброшенного вверх мяча.
Высота мяча описывается уравнением h=v⋅t−0.5⋅g⋅t2h=v⋅t−0.5⋅g⋅t2
где vv — начальная скорость мяча (в км/ч), t — время (в секундах)
g — ускорение свободного падения (~9.81 м/с²).
По условию задачи также необходимо учитывать, что начальная скорость задается в км/ч, а высота измеряется в метрах.
Например: Если исходное значение равно 15 то результатом вычисления должна быть 4
Точно также и с 25, где ответом будет 7
Решение задачи:
(Нажмите на спойлер чтобы увидеть решение)
Задача 5
Платформа: CodeWars
Название задачи: The furthest distance of index (Самая большая дистанция между индексами)
Ссылка на задачу: https://www.codewars.com/kata/581963edc929ba19e7000148 (Нажмите на строку)
Сложность: 6 (6 / 8)
Уже решили (На момент написания статьи): 82 из 212
Тэги: Головоломки, Фундаментальные
Оригинальное описание задачи:
"When no more interesting kata can be resolved, I just choose to create the new kata, to solve their own, to enjoy the process" -myjinxin2015 said
Description:
Give you an array arr
that contains some numbers(arr.length>=2), and give you a positive integer k
. Find such two numbers m,n: m and n at least a difference of k
, and their index is the most distant.
Returns their distance of index. If no such number found, return -1
.
Some Examples
furthestDistance([8,7,1,9],5) === 2
The difference of 8 and 1, 1 and 9 is more than 5;
The index distance of (8,1) is 2;
The index distance of (1,9) is 1;
So 2 is the furthest distance of index.
furthestDistance([8,7,1,9],100) === -1
furthestDistance([1,2,3,4],1) === 3 (1 and 4)
furthestDistance([3,4,1,2],2) === 2 (3 and 1 or 4 and 2)
Пояснение задачи:
Суть задачи заключается в поиске такой пары чисел в массиве, разница между которыми не меньше заданного значения k, при этом их индексы максимально удалены друг от друга.
Нужно вернуть расстояние между этими индексами. Если такая пара не найдена, возвращается −1.
Например:
Если дан массив [8,7,1,9] и k=5, то:
Разница между 8 и 1 больше 5, и их индексы имеют расстояние 2.
Разница между 1 и 9 также больше 5, но их индексы имеют расстояние всего 1.
Поэтому результатом будет максимальное расстояние - 2.
Решение задачи:
(Нажмите на спойлер чтобы увидеть решение)
Новое в конфигурации Algo1C:
Заключение:
Платформа: CodeWars
Название задачи: Battle of the characters (Easy) (Битва символов (Легко))
Ссылка на задачу: https://www.codewars.com/kata/595519279be6c575b5000016 (Нажмите на строку)
Сложность: 7 (7 / 8)
Уже решили (На момент написания статьи): 1,134 из 4,078
Тэги: Алгоритмы
Оригинальное описание задачи:
Groups of characters decided to make a battle. Help them to figure out which group is more powerful. Create a function that will accept 2 strings and return the one who's stronger.
Rules:
- Each character have its own power:
A = 1, B = 2, ... Y = 25, Z = 26
- Strings will consist of uppercase letters only
- Only two groups to a fight.
- Group whose total power (
A + B + C + ...
) is bigger wins.- If the powers are equal, it's a tie.
Examples:
* "ONE", "TWO" -> "TWO"` * "ONE", "NEO" -> "Tie!"
Related kata:
Пояснение задачи:
По условию задачи нам сказано что группа символов решила устроить схватку. Наша с вами задача помочь им в этом. Необходимо написать код, который принимает 2 строки и возвращает ту что сильнее. Для того чтобы определить какая строка сильнее, мы будем придерживаться следующих правил:
Правила:
Каждый символ имеет свою силу: A = 1, B = 2, ... Y = 25, Z = 26
Строки всегда будут в верхнем регистре
Только 2 группы символов могут участвовать в схватке
Группа, чья общая сила больше (A + B + C ...), побеждает
Если сила строк одинакова, это засчитывается за ничью
Решение задачи:
Платформа: CodeWars
Название задачи: You Got Change? (У тебя есть сдача?)
Ссылка на задачу: https://www.codewars.com/kata/5966f6343c0702d1dc00004c (Нажмите на строку)
Сложность: 7 (7 / 8)
Уже решили (На момент написания статьи): 1,190 из 3,100
Тэги: Фундаментальные
Оригинальное описание задачи:
Create a function that will take any amount of money and break it down to the smallest number of bills as possible. Only integer amounts will be input, NO floats. This function should output a sequence, where each element in the array represents the amount of a certain bill type. The array will be set up in this manner:
array[0] ---> represents $1 bills
array[1] ---> represents $5 bills
array[2] ---> represents $10 bills
array[3] ---> represents $20 bills
array[4] ---> represents $50 bills
array[5] ---> represents $100 bills
In the case below, we broke up $365 into 1 $5 bill, 1 $10 bill, 1 $50 bill, and 3 $100 bills:
365 => [0,1,1,0,1,3]
In this next case, we broke $217 into 2 $1 bills, 1 $5 bill, 1 $10 bill, and 2 $100 bills:
217 => [2,1,1,0,0,2]
Пояснение задачи:
Цель задачи заключается в том чтобы написать код, который будет принимать какую-то сумму и возвращать максимально возможное количество купюр. Также по условию задачи уточняется что исходная сумма будет числом без дробной части.
В качестве результата нам с вами необходимо будет вернть массив, где каждый элемент будет отражать количество купюр по их типам:
array[0] ---> represents $1 bills
array[1] ---> represents $5 bills
array[2] ---> represents $10 bills
array[3] ---> represents $20 bills
array[4] ---> represents $50 bills
array[5] ---> represents $100 bills
Например сумму в 365 долларов мы можем собрать из следующего количества купюр:
365 => [0,1,1,0,1,3]
Точно также с суммой в 217 долларов: 217 => [2,1,1,0,0,2]
Решение задачи:
Платформа: CodeWars
Название задачи: Ideal electron distribution (Идеальное распределение электронов)
Ссылка на задачу: https://www.codewars.com/kata/59175441e76dc9f9bc00000f (Нажмите на строку)
Сложность: 6 (6 / 8)
Уже решили (На момент написания статьи): 538 из 1,391
Тэги: Массивы, Списки, Алгоритмы
Оригинальное описание задачи:
You are a khmmadkhm scientist and you decided to play with electron distribution among atom's shells. You know that basic idea of electron distribution is that electrons should fill a shell until it's holding the maximum number of electrons.
Rules:
- Maximum number of electrons in a shell is distributed with a rule of 2n^2 (n being position of a shell).
- For example, maximum number of electrons in 3rd shell is 2*3^2 = 18.
- Electrons should fill the lowest level shell first.
- If the electrons have completely filled the lowest level shell, the other unoccupied electrons will fill the higher level shell and so on.
Ex.: atomicNumber(1); should return [1] atomicNumber(10); should return [2, 8] atomicNumber(11); should return [2, 8, 1] atomicNumber(47); should return [2, 8, 18, 19]
Пояснение задачи:
По условию задачи мы некий учёный, который решил заняться распределением электронов по оболочкам атома. Наша с вами цель заключается в том, чтобы написать код, который распределит электроны по оболочкам атома согласно основным принципам заполнения электронных оболочек.
Правила следующие:
- Максимальная вместимость оболочки определяется формулой 2n^2, где n – номер оболочки.
- Электроны заполняют сначала самые нижние оболочки, прежде чем переходить к более высоким.
- Если самая низкая оболочка заполнена полностью, оставшиеся электроны переходят на следующую оболочку и т.д. Например:
Если количество электронов равно 1 то в качестве результата мы должны вернуть массив [1]
Точно по такому же принципу получим:
10 ---> [2, 8]
11 ---> [2, 8, 1]
47 ---> [2, 8, 18, 19]
Решение задачи:
Платформа: CodeWars
Название задачи: Ball Upwards (Мяч вверх)
Ссылка на задачу: https://www.codewars.com/kata/566be96bb3174e155300001b (Нажмите на строку)
Сложность: 6 (6 / 8)
Уже решили (На момент написания статьи): 2,192 из 8,163
Тэги: Фундаментальные
Оригинальное описание задачи:
You throw a ball vertically upwards with an initial speed
v (in km per hour)
. The heighth
of the ball at each timet
is given byh = v*t - 0.5*g*t*t
whereg
is Earth's gravity(g ~ 9.81 m/s**2)
. A device is recording at every tenth of second the height of the ball. For example withv = 15 km/h
the device gets something of the following form:(0, 0.0), (1, 0.367...), (2, 0.637...), (3, 0.808...), (4, 0.881..) ...
where the first number is the time in tenth of second and the second number the height in meter.Task
Write a function
max_ball
with parameterv (in km per hour)
that returns thetime in tenth of second
of the maximum height recorded by the device.Examples:
max_ball(15) should return 4
max_ball(25) should return 7
Notes
- Remember to convert the velocity from km/h to m/s or from m/s in km/h when necessary.
- The maximum height recorded by the device is not necessarily the maximum height reached by the ball.
Пояснение задачи:
Наша с вами задача состоит в том, чтобы определить момент времени (в десятых долях секунды), когда устройство зафиксирует максимальную высоту подброшенного вверх мяча.
Высота мяча описывается уравнением h=v⋅t−0.5⋅g⋅t2h=v⋅t−0.5⋅g⋅t2
где vv — начальная скорость мяча (в км/ч), t — время (в секундах)
g — ускорение свободного падения (~9.81 м/с²).
По условию задачи также необходимо учитывать, что начальная скорость задается в км/ч, а высота измеряется в метрах.
Например: Если исходное значение равно 15 то результатом вычисления должна быть 4
Точно также и с 25, где ответом будет 7
Решение задачи:
Платформа: CodeWars
Название задачи: The furthest distance of index (Самая большая дистанция между индексами)
Ссылка на задачу: https://www.codewars.com/kata/581963edc929ba19e7000148 (Нажмите на строку)
Сложность: 6 (6 / 8)
Уже решили (На момент написания статьи): 82 из 212
Тэги: Головоломки, Фундаментальные
Оригинальное описание задачи:
"When no more interesting kata can be resolved, I just choose to create the new kata, to solve their own, to enjoy the process" -myjinxin2015 said
Description:
Give you an array
arr
that contains some numbers(arr.length>=2), and give you a positive integerk
. Find such two numbers m,n: m and n at least a difference ofk
, and their index is the most distant.Returns their distance of index. If no such number found, return
-1
.Some Examples
furthestDistance([8,7,1,9],5) === 2 The difference of 8 and 1, 1 and 9 is more than 5; The index distance of (8,1) is 2; The index distance of (1,9) is 1; So 2 is the furthest distance of index. furthestDistance([8,7,1,9],100) === -1 furthestDistance([1,2,3,4],1) === 3 (1 and 4) furthestDistance([3,4,1,2],2) === 2 (3 and 1 or 4 and 2)
Пояснение задачи:
Суть задачи заключается в поиске такой пары чисел в массиве, разница между которыми не меньше заданного значения k, при этом их индексы максимально удалены друг от друга.
Нужно вернуть расстояние между этими индексами. Если такая пара не найдена, возвращается −1.
Например:
Если дан массив [8,7,1,9] и k=5, то:
Разница между 8 и 1 больше 5, и их индексы имеют расстояние 2.
Разница между 1 и 9 также больше 5, но их индексы имеют расстояние всего 1.
Поэтому результатом будет максимальное расстояние - 2.
Решение задачи:
Ну что ж, пока на этом всё, надеюсь статья была увлекательной для вас, благодарю за внимание.
Подключайтесь к решению алгоритмических задач вместе со мной, делитесь вашим мнением и решениями в комментариях, сохраняя при этом позитивный настрой!
Увидимся в новой статье!