Приветствую всех любителей программирования на новой статье с подборкой интересных задач для тренировки навыков решения алгоритмических проблем. В этом материале я собрал разнообразные задания из разных источников, чтобы каждый мог испытать свои силы в этой захватывающей области! Цель статьи — не только улучшить умение применять различные алгоритмы, но и поддерживать вашу способность писать качественный код, а также просто получить удовольствие от процесса.
Что было раньше:
В предыдущей части мы решили:
- Learning TypeScript. Basic Types (Обучающий типа. Основные типы)
- Are there any arrows left? (Остались стрелы?)
- Invert The Triangle (Инвертировать треугольник)
- The dropWhile Function (Функция Dropwhile)
- The Enigma Machine - Part 1: The Plugboard (Машина Enigma - Часть 1: Плзард)
- Canal Management (Управление каналом)
- Simple Fun #272: Throwing Dice (Простое веселье)
- Where did my Ether go? (Куда ушел мой эфир?)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: SpeedCode #2 - Array Madness (Скоростной код)
Ссылка на задачу: https://www.codewars.com/kata/56ff6a70e1a63ccdfa0001b1
Сложность: 8 kyu
Уже решили (На момент написания статьи): 16 992 из 57 268
Тэги: Массивы, головоломки
Оригинальное описание задачи:
SpeedCode #2 - Array Madness
Objective
Given two integer arrays a, b
, both of length >= 1
, create a program that returns true
if the sum of the squares of each element in a
is strictly greater than the sum of the cubes of each element in b
.
E.g.
array_madness([4, 5, 6], [1, 2, 3]) => True #because 4 ** 2 + 5 ** 2 + 6 ** 2 > 1 ** 3 + 2 ** 3 + 3 ** 3
Get your timer out. Are you ready? Ready, get set, GO!!!
Пояснение задачи:
Задача состоит в том, чтобы создать программу, которая сравнивает два целочисленных массива по следующему критерию: сумма квадратов элементов первого массива должна быть строго больше суммы кубов элементов второго массива.
Это означает, что для успешного выполнения программы необходимо сравнить сумму квадратов элементов первого массива с суммой кубов элементов второго массива.
Если первая сумма больше второй, то результат будет `true`.
Задача 2
Платформа: CodeWars
Название задачи: Remove the time (Удалите время)
Ссылка на задачу: https://www.codewars.com/kata/56b0ff16d4aa33e5bb00008e
Сложность: 8 kyu
Уже решили (На момент написания статьи): 18 197 из 34 097
Тэги: Время даты, анализ, основы
Оригинальное описание задачи:
Task Description
You're re-designing a blog, and the blog's posts have the Weekday Month Day, time
format for showing the date and time when a post was made, e.g., Friday May 2, 7pm
.
You're running out of screen real estate, and on some pages you want to display a shorter format, Weekday Month Day
that omits the time.
Write a function that takes the website date/time in its original string format and returns the shortened format.
Input
Input will always be a string, e.g., "Friday May 2, 7pm"
.
Output
Output will be the shortened string, e.g., "Friday May 2"
Пояснение задачи:
Задача состоит в том, чтобы создать функцию, которая принимает дату и время публикации поста в формате "Weekday Month Day, time" (например, "Friday May 2, 7pm") и возвращает сокращенную версию этой даты в формате "Weekday Month Day" (например, "Friday May 2").
Задача 3
Платформа: CodeWars
Название задачи: Simple Fun #260: Permutation Shift (Простое веселье)
Ссылка на задачу: https://www.codewars.com/kata/59115fdca53112c41c0002f4
Сложность: 7 kyu
Уже решили (На момент написания статьи): 352 из 674
Тэги: Основы
Оригинальное описание задачи:
Task
Define the permutation element shift
as the difference between the element's value
and its index
. For example, for permutation [1, 0, 2, 3]
of array [0, 1, 2, 3]
shifts for the respective elements are [1, -1, 0, 0]
.
Define the permutation shift
as the difference between the maximal and the minimal element shifts among all of the permutation elements.
Given a permutation
of integers from 0 to n - 1
for some integer n
, find its shift.
Input/Output
[input]
integer array permutation
Array of integers containing each integer from 0 to n - 1
, inclusive, exactly once (where n is the array length).
1 ≤ permutation.length ≤ 100
[output]
an integer
Example
For permutation = [1, 0, 2, 3]
, the output should be 2
.
Its maximal and the minimal element shifts are 1 and -1
, so the output is 1 - -1 = 2
.
Пояснение задачи:
Задача заключается в определении "сдвига элемента перестановки" как разности между значением элемента и его индексом.
Для примера, если у нас есть перестановка `[1, 0, 2, 3]` элементов массива `[0, 1, 2, 3]`, сдвиги для этих элементов будут `[1, -1, 0, 0]`.
Затем нужно определить общий "сдвиг перестановки", который равен разности между максимальным и минимальным значениями сдвигов среди всех элементов перестановки.
Для этого дается массив перестановки целых чисел от `0` до `n-1`, где `n` — длина массива. Нужно найти этот общий сдвиг перестановки.
Задача 4
Платформа: CodeWars
Название задачи: Find the Speedcuber's times! (Найдите время Speedcuber!)
Ссылка на задачу: https://www.codewars.com/kata/5d7c7697e8ad48001e642964
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 173 из 2 618
Тэги: Основы
Оригинальное описание задачи:
Speedcubing is the hobby involving solving a variety of twisty puzzles, the most famous being the 3x3x3 puzzle or Rubik's Cube, as quickly as possible.
In the majority of Speedcubing competitions, a Cuber solves a scrambled cube 5 times, and their result is found by taking the average of the middle 3 solves (ie. the slowest and fastest times are disregarded, and an average is taken of the remaining times).
In some competitions, the unlikely event of a tie situation is resolved by comparing Cuber's fastest times.
Write a function cube_times(times)
that, given an array of floats times
returns an array / tuple with the Cuber's result (to 2 decimal places) AND their fastest solve.
For example:
cube_times([9.5, 7.6, 11.4, 10.5, 8.1]) = (9.37, 7.6)
# Because (9.5 + 10.5 + 8.1) / 3 = 9.37 and 7.6 was the fastest solve.
Note: times
will always be a valid array of 5 positive floats (representing seconds)
Пояснение задачи:
Задача состоит в написании функции `cube_times`, которая принимает на вход массив чисел `times` и возвращает два значения: результат вычислений среднего времени (до двух знаков после запятой) и самое быстрое время решения.
Для этого нужно игнорировать самый медленный и самый быстрый результаты, а затем взять среднее значение оставшихся трёх.
Пример:
Для входного массива `[9.5, 7.6, 11.4, 10.5, 8.1]` функция должна вернуть `(9.37, 7.6)`, так как среднее значение трёх средних результатов равно 9.37, а самым быстрым решением было 7.6 секунды.
Задача 5
Платформа: CodeWars
Название задачи: up AND down (вверх и вниз)
Ссылка на задачу: https://www.codewars.com/kata/56cac350145912e68b0006f0
Сложность: 6 kyu
Уже решили (На момент написания статьи): 3 119 из 16 402
Тэги: Основы, струны
Оригинальное описание задачи:
Don't be afraid, the description is rather long but - hopefully - it is in order that the process be well understood.
You are given a string s
made up of substring s(1), s(2), ..., s(n)
separated by whitespaces. Example: "after be arrived two My so"
Task
Return a string t
having the following property:
length t(O) <= length t(1) >= length t(2) <= length t(3) >= length t(4) .... (P)
where the t(i)
are the substring of s
; you must respect the following rule:
at each step from left to right, you can only move either already consecutive strings or strings that became consecutive after a previous move. The number of moves should be minimum.
Let us go with our example:
The length of "after" is greater than the length of "be". Let us move them ->"be after arrived two My so"
The length of "after" is smaller than the length of "arrived". Let us move them -> "be arrived after two My so"
The length of "after" is greater than the length of "two" ->"be arrived two after My so"
The length of "after" is greater than the length of "My". Good! Finally the length of "My" and "so" are the same, nothing to do. At the end of the process, the substrings s(i) verify:
length s(0) <= length s(1) >= length s(2) <= length s(3) >= length (s4) <= length (s5)
Hence given a string s of substrings s(i)
the function arrange
with the previous process should return a unique string t
having the property (P).
It is kind of roller coaster or up and down. When you have property (P), to make the result more "up and down" visible t(0), t(2), ... will be lower cases and the others upper cases.
arrange("after be arrived two My so") should return "be ARRIVED two AFTER my SO"
Notes:
- The string
"My after be arrived so two"
has the property (P) but can't be obtained by the described process so it won't be accepted as a result. The property (P) doesn't give unicity by itself.
- Process: go from left to right, move only consecutive strings when needed.
- For the first fixed tests the needed number of moves to get property (P) is given as a comment so that you can know if your process follows the rule.
Пояснение задачи:
Дана строка `s`, состоящая из подстрок `s(1), s(2), ..., s(n)`, разделенных пробелами.
Пример: "after be arrived two My so"
Задача
Вернуть строку `t`, удовлетворяющую следующему свойству:
`length t(O) <= length t(1) >= length t(2) <= length t(3) >= length t(4) ... (P)`
где `t(i)` — это подстроки из `s`;
должны соблюдаться следующие правила:
на каждом шаге от левого к правому концу строки можно перемещать только уже смежные подстроки или те, которые стали смежными после предыдущего перемещения. Количество таких перемещений должно быть минимальным.
Пример:
Для строки "after be arrived two My so" процесс может выглядеть следующим образом:
1. Длина "after" больше длины "be", поэтому переставляем их -> `"be after arrived two My so"`
2. Длина "after" меньше длины "arrived", поэтому переставляем их -> `"be arrived after two My so"`
3. Длина "after" больше длины "two", поэтому переставляем их -> `"be arrived two after My so"`
4. Длина "after" больше длины "My", но они уже смежные, поэтому ничего не меняем -> `"be arrived two after MY so"`
5. Длина "MY" и "so" равны, поэтому ничего не меняем -> `"be arrived two after My SO"`
Таким образом, после выполнения всех шагов подстроки `s(i)` будут удовлетворять условию (P):
"arrange("after be arrived two My so") должна вернуть "be ARRIVED two AFTER MY SO""
Примечания:
- Строка `"My after be arrived so two"` также удовлетворяет условию (P), но не может быть получена с помощью описанного процесса, поэтому она не будет принята как результат. Условие (P) само по себе не гарантирует уникальность результата.
- Процесс: двигаемся слева направо, перемещаем только смежные подстроки, когда это необходимо.
Задача 6
Платформа: CodeWars
Название задачи: Maximum and minimum (Максимум и минимум)
Ссылка на задачу: https://www.codewars.com/kata/59c0cd4f46038781010000ac
Сложность: 6 kyu
Уже решили (На момент написания статьи): 400 из 9 531
Тэги: Основы
Оригинальное описание задачи:
Write two functions max
and min
which returns the maximum and minimum value of the argument passed into them respectively.
Example
max(1,2,3,4)
//returns 4
max(1,2,3,['4'])
//returns 4; note it returned 4 not '4'
max(1,2,[3,4])
//returns 4
max(1,2,[3,[4]])
//returns 4
max(1,2,[3,['4r']])
//returns NaN
max([[],[-4]])
// returns -4
max()
or max([])
//returns 0
And so goes for min
Further Instructions
- functions will take any number of arguments
- Arrays of numbers can be to any depth
- You can't use
Math.max
, Math.min
, and require
- If one of the arguments can not be evaluated to a number, return NaN
Пояснение задачи:
Функции `max` и `min` принимают любое количество аргументов и возвращают максимальное и минимальное значение соответственно среди переданных аргументов.
Пример:
1. `max(1,2,3,4)` // возвращает 4
2. `max(1,2,3,['4'])` // возвращает 4; здесь возвращается число, а не строка `'4'`
3. `max(1,2,3,[4])` // возвращает 4
4. `max(1,2,[3,['4']])` // возвращает 4
5. `max(1,2,[3,['4r']])` // возвращает NaN
6. `max([[],[-4]])` // возвращает -4
7. `max([])` или `max()` // возвращает 0
И аналогично для функции `min`.
Дополнительные инструкции:
1. Функции могут принимать любое количество аргументов.
2. Массивы чисел могут быть любой глубины.
3. Нельзя использовать `Math.max`, `Math.min` и `require`.
4. Если один из аргументов не может быть преобразован в число, функция должна вернуть `NaN`.
Задача 7
Платформа: CodeWars
Название задачи: ASCII Games: Flood Fill (Player) (Игры ASCII: заливка наводнения (игрок))
Ссылка на задачу: https://www.codewars.com/kata/58f573a0f6110e46a4000001
Сложность: 5 kyu
Уже решили (На момент написания статьи): 93 из 683
Тэги: Головоломки, игры
Оригинальное описание задачи:
ASCII Games is a series of hard game-based katas revolving around the classic games we love that operates on a rectangular grid.
Inspired by Kami
You will be given a rectanglar map with characters 1-5
representing different colors:
var board = '\
14441\n\
12221\n\
12333\n\
22311\n\
33355\n\
44354\n\
24345'
During every turn, you can choose a coordinate x,y
(top left origin, x and y goes rightwards and downwards) and a color 1-5
, which will turn every orthogonally adjacent tile of the same color as the tile you chosen into the new color you've chosen (i.e flood-filling):
Example map:
14441
12221
12333
22311
33355
44354
24345
1. Flood-fill (0,4) to 4:
14441 14441
12221 12221
12*** (4) 12444
22*11 ==> 22411
***55 44455
44*54 44454
24*45 24445
2. Flood-fill (0,5) to 5:
14441 14441
12221 12221
12*** (5) 12555
22*11 ==> 22511
***55 55555
***54 55554
2***5 25555
3. Flood-fill (2,2) to 2:
14441 14441
12221 12221
12*** (2) 12222
22*11 ==> 22211
***** 22222
****4 22224
2**** 22222
4. Flood-fill (1,3) to 1:
14441 14441
1***1 11111
1**** (1) 11111
***11 ==> 11111
***** 11111
****4 11114
***** 11111
5. Flood-fill (4,0) to 4:
*444* 44444
***** 44444
***** (4) 44444
***** ==> 44444
***** 44444
****4 44444
***** 44444
Hence, after these moves, we obtain a board full of 4s.
In this part of the kata, you just need to play back the moves for this game, and return the result of the transformation due to the moves. The moves will be in the form of an array of objects:
[{x:0, y:4, color:4}, {x:0, y:5, color:5}, {x:2, y:2, color:2}, {x:1, y:3, color:1}, {x:4, y:0, color:4}]
You can assume that the moves and the map are always well-formed and valid.
Пояснение задачи:
Задача состоит в том, чтобы реализовать программу, которая будет воспроизводить ходы в игре на основе ASCII карт, представленных в виде прямоугольных массивов символов.
Каждый ход представляет собой выбор координат `(x, y)` и цвета `1-5`, после чего все соседние клетки того же цвета, что и выбранная клетка, будут заменены на новый цвет.
Например, если выбрать клетку `(0, 4)` и цвет `4`, то все клетки, которые соприкасаются с этой клеткой по горизонтали или вертикали и имеют тот же цвет, будут заменены на цвет `4`.
Программа должна принимать последовательность таких ходов в виде массива объектов, каждый из которых содержит координаты `(x, y)` и новый цвет `color`, и возвращать итоговую карту после выполнения всех ходов.
Это означает, что были выбраны следующие клетки:
1. `(0, 4)` -> заменяем все клетки вокруг на цвет `4`
2. `(0, 5)` -> заменяем все клетки вокруг на цвет `5`
3. `(2, 2)` -> заменяем все клетки вокруг на цвет `2`
4. `(1, 3)` -> заменяем все клетки вокруг на цвет `1`
5. `(4, 0)` -> заменяем все клетки вокруг на цвет `4`
После выполнения всех этих ходов итоговая карта будет содержать только клетки с цветом `4`.
Задача требует от вас реализации логики для обработки этих ходов и получения конечного результата.
Задача 8
Платформа: CodeWars
Название задачи: Find number in an array # 2 (Найти номер в массиве)
Ссылка на задачу: https://www.codewars.com/kata/583fd0398a20113a83000061
Сложность: 5 kyu
Уже решили (На момент написания статьи): 44 из 1 358
Тэги: Алгоритмы, головоломки
Оригинальное описание задачи:
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:
Given an unsorted array arr
, there are numbers 1 to n in arr
, only two numbers are appear one time, all the other numbers appear two times.(That is, there are n*2-2 elements in the array) e.g. [1,2,4,3,5,4,2,1]
. Your task is to find the two unique number, and return them by an array [3,5]
(the small number in front of big number).
Note:
- All numbers are positive integers;
- The length of array always more than 3;
- Please pay attention to optimizing the code to avoid time out.
- In the performance test(1000000 elements x 100 testcases), the time consuming of each test case should be within 8ms. This means, your code should run as fast as a rocket ;-)
Some Examples
findTwoUnique([1,2,4,3,5,4,2,1]) === [3,5]
findTwoUnique([1,1,2,3,3,4]) === [2,4]
findTwoUnique([9,9,8,8,7,6,5,4,3,2,1,2,3,4,5,6]) === [1,7]
Пояснение задачи:
Дана неупорядоченная последовательность чисел `arr`, где числа от 1 до `n` встречаются ровно один раз, а все остальные числа встречаются дважды.
Например, `[1,2,4,3,5,4,2,1]`.
Необходимо найти два уникальных числа и вернуть их в виде массива `[3,5]`.
Особенности задачи:
- Все числа положительные целые числа.
- Длина массива всегда больше трёх.
- Важно оптимизировать код, чтобы избежать превышения времени выполнения (time out).
- В тестах с 1 миллионом элементов и 100 тестами время выполнения каждого теста должно быть меньше 8 мс.
Заключение:
Платформа: CodeWars
Название задачи: SpeedCode #2 - Array Madness (Скоростной код)
Ссылка на задачу: https://www.codewars.com/kata/56ff6a70e1a63ccdfa0001b1
Сложность: 8 kyu
Уже решили (На момент написания статьи): 16 992 из 57 268
Тэги: Массивы, головоломки
Оригинальное описание задачи:
SpeedCode #2 - Array Madness
Objective
Given two integer arrays
a, b
, both oflength >= 1
, create a program that returnstrue
if the sum of the squares of each element ina
is strictly greater than the sum of the cubes of each element inb
.E.g.
array_madness([4, 5, 6], [1, 2, 3]) => True #because 4 ** 2 + 5 ** 2 + 6 ** 2 > 1 ** 3 + 2 ** 3 + 3 ** 3
Get your timer out. Are you ready? Ready, get set, GO!!!
Пояснение задачи:
Задача состоит в том, чтобы создать программу, которая сравнивает два целочисленных массива по следующему критерию: сумма квадратов элементов первого массива должна быть строго больше суммы кубов элементов второго массива.
Это означает, что для успешного выполнения программы необходимо сравнить сумму квадратов элементов первого массива с суммой кубов элементов второго массива.
Если первая сумма больше второй, то результат будет `true`.
Платформа: CodeWars
Название задачи: Remove the time (Удалите время)
Ссылка на задачу: https://www.codewars.com/kata/56b0ff16d4aa33e5bb00008e
Сложность: 8 kyu
Уже решили (На момент написания статьи): 18 197 из 34 097
Тэги: Время даты, анализ, основы
Оригинальное описание задачи:
Task Description
You're re-designing a blog, and the blog's posts have the
Weekday Month Day, time
format for showing the date and time when a post was made, e.g.,Friday May 2, 7pm
.You're running out of screen real estate, and on some pages you want to display a shorter format,
Weekday Month Day
that omits the time.Write a function that takes the website date/time in its original string format and returns the shortened format.
Input
Input will always be a string, e.g.,
"Friday May 2, 7pm"
.Output
Output will be the shortened string, e.g.,
"Friday May 2"
Пояснение задачи:
Задача состоит в том, чтобы создать функцию, которая принимает дату и время публикации поста в формате "Weekday Month Day, time" (например, "Friday May 2, 7pm") и возвращает сокращенную версию этой даты в формате "Weekday Month Day" (например, "Friday May 2").
Платформа: CodeWars
Название задачи: Simple Fun #260: Permutation Shift (Простое веселье)
Ссылка на задачу: https://www.codewars.com/kata/59115fdca53112c41c0002f4
Сложность: 7 kyu
Уже решили (На момент написания статьи): 352 из 674
Тэги: Основы
Оригинальное описание задачи:
Task
Define the
permutation element shift
as the difference between the element'svalue
and itsindex
. For example, for permutation[1, 0, 2, 3]
of array[0, 1, 2, 3]
shifts for the respective elements are[1, -1, 0, 0]
.Define the
permutation shift
as the difference between the maximal and the minimal element shifts among all of the permutation elements.Given a
permutation
of integers from0 to n - 1
for some integern
, find its shift.Input/Output
[input]
integer arraypermutation
Array of integers containing each integer from
0 to n - 1
, inclusive, exactly once (where n is the array length).
1 ≤ permutation.length ≤ 100
[output]
an integerExample
For
permutation = [1, 0, 2, 3]
, the output should be2
.Its maximal and the minimal element shifts are
1 and -1
, so the output is1 - -1 = 2
.
Пояснение задачи:
Задача заключается в определении "сдвига элемента перестановки" как разности между значением элемента и его индексом.
Для примера, если у нас есть перестановка `[1, 0, 2, 3]` элементов массива `[0, 1, 2, 3]`, сдвиги для этих элементов будут `[1, -1, 0, 0]`.
Затем нужно определить общий "сдвиг перестановки", который равен разности между максимальным и минимальным значениями сдвигов среди всех элементов перестановки.
Для этого дается массив перестановки целых чисел от `0` до `n-1`, где `n` — длина массива. Нужно найти этот общий сдвиг перестановки.
Платформа: CodeWars
Название задачи: Find the Speedcuber's times! (Найдите время Speedcuber!)
Ссылка на задачу: https://www.codewars.com/kata/5d7c7697e8ad48001e642964
Сложность: 7 kyu
Уже решили (На момент написания статьи): 1 173 из 2 618
Тэги: Основы
Оригинальное описание задачи:
Speedcubing is the hobby involving solving a variety of twisty puzzles, the most famous being the 3x3x3 puzzle or Rubik's Cube, as quickly as possible.
In the majority of Speedcubing competitions, a Cuber solves a scrambled cube 5 times, and their result is found by taking the average of the middle 3 solves (ie. the slowest and fastest times are disregarded, and an average is taken of the remaining times).
In some competitions, the unlikely event of a tie situation is resolved by comparing Cuber's fastest times.
Write a function
cube_times(times)
that, given an array of floatstimes
returns an array / tuple with the Cuber's result (to 2 decimal places) AND their fastest solve.For example:
cube_times([9.5, 7.6, 11.4, 10.5, 8.1]) = (9.37, 7.6) # Because (9.5 + 10.5 + 8.1) / 3 = 9.37 and 7.6 was the fastest solve.
Note:
times
will always be a valid array of 5 positive floats (representing seconds)
Пояснение задачи:
Задача состоит в написании функции `cube_times`, которая принимает на вход массив чисел `times` и возвращает два значения: результат вычислений среднего времени (до двух знаков после запятой) и самое быстрое время решения.
Для этого нужно игнорировать самый медленный и самый быстрый результаты, а затем взять среднее значение оставшихся трёх.
Пример:
Для входного массива `[9.5, 7.6, 11.4, 10.5, 8.1]` функция должна вернуть `(9.37, 7.6)`, так как среднее значение трёх средних результатов равно 9.37, а самым быстрым решением было 7.6 секунды.
Платформа: CodeWars
Название задачи: up AND down (вверх и вниз)
Ссылка на задачу: https://www.codewars.com/kata/56cac350145912e68b0006f0
Сложность: 6 kyu
Уже решили (На момент написания статьи): 3 119 из 16 402
Тэги: Основы, струны
Оригинальное описание задачи:
Don't be afraid, the description is rather long but - hopefully - it is in order that the process be well understood.
You are given a string
s
made up of substrings(1), s(2), ..., s(n)
separated by whitespaces. Example:"after be arrived two My so"
Task
Return a string
t
having the following property:
length t(O) <= length t(1) >= length t(2) <= length t(3) >= length t(4) .... (P)
where the
t(i)
are the substring ofs
; you must respect the following rule:at each step from left to right, you can only move either already consecutive strings or strings that became consecutive after a previous move. The number of moves should be minimum.
Let us go with our example:
The length of "after" is greater than the length of "be". Let us move them ->
"be after arrived two My so"
The length of "after" is smaller than the length of "arrived". Let us move them ->
"be arrived after two My so"
The length of "after" is greater than the length of "two" ->
"be arrived two after My so"
The length of "after" is greater than the length of "My". Good! Finally the length of "My" and "so" are the same, nothing to do. At the end of the process, the substrings s(i) verify:
length s(0) <= length s(1) >= length s(2) <= length s(3) >= length (s4) <= length (s5)
Hence given a string s of substrings
s(i)
the functionarrange
with the previous process should return a unique stringt
having the property (P).It is kind of roller coaster or up and down. When you have property (P), to make the result more "up and down" visible t(0), t(2), ... will be lower cases and the others upper cases.
arrange("after be arrived two My so") should return "be ARRIVED two AFTER my SO"
Notes:
- The string
"My after be arrived so two"
has the property (P) but can't be obtained by the described process so it won't be accepted as a result. The property (P) doesn't give unicity by itself.- Process: go from left to right, move only consecutive strings when needed.
- For the first fixed tests the needed number of moves to get property (P) is given as a comment so that you can know if your process follows the rule.
Пояснение задачи:
Дана строка `s`, состоящая из подстрок `s(1), s(2), ..., s(n)`, разделенных пробелами.
Пример: "after be arrived two My so"Задача
Вернуть строку `t`, удовлетворяющую следующему свойству:`length t(O) <= length t(1) >= length t(2) <= length t(3) >= length t(4) ... (P)`
где `t(i)` — это подстроки из `s`;
должны соблюдаться следующие правила:на каждом шаге от левого к правому концу строки можно перемещать только уже смежные подстроки или те, которые стали смежными после предыдущего перемещения. Количество таких перемещений должно быть минимальным.
Пример:
Для строки "after be arrived two My so" процесс может выглядеть следующим образом:
1. Длина "after" больше длины "be", поэтому переставляем их -> `"be after arrived two My so"`
2. Длина "after" меньше длины "arrived", поэтому переставляем их -> `"be arrived after two My so"`
3. Длина "after" больше длины "two", поэтому переставляем их -> `"be arrived two after My so"`
4. Длина "after" больше длины "My", но они уже смежные, поэтому ничего не меняем -> `"be arrived two after MY so"`
5. Длина "MY" и "so" равны, поэтому ничего не меняем -> `"be arrived two after My SO"`Таким образом, после выполнения всех шагов подстроки `s(i)` будут удовлетворять условию (P):
"arrange("after be arrived two My so") должна вернуть "be ARRIVED two AFTER MY SO""
Примечания:
- Строка `"My after be arrived so two"` также удовлетворяет условию (P), но не может быть получена с помощью описанного процесса, поэтому она не будет принята как результат. Условие (P) само по себе не гарантирует уникальность результата.
- Процесс: двигаемся слева направо, перемещаем только смежные подстроки, когда это необходимо.
Платформа: CodeWars
Название задачи: Maximum and minimum (Максимум и минимум)
Ссылка на задачу: https://www.codewars.com/kata/59c0cd4f46038781010000ac
Сложность: 6 kyu
Уже решили (На момент написания статьи): 400 из 9 531
Тэги: Основы
Оригинальное описание задачи:
Write two functions
max
andmin
which returns the maximum and minimum value of the argument passed into them respectively.Example
max(1,2,3,4)
//returns 4max(1,2,3,['4'])
//returns 4; note it returned 4 not '4'max(1,2,[3,4])
//returns 4max(1,2,[3,[4]])
//returns 4max(1,2,[3,['4r']])
//returns NaNmax([[],[-4]])
// returns -4max()
ormax([])
//returns 0And so goes for
min
Further Instructions
- functions will take any number of arguments
- Arrays of numbers can be to any depth
- You can't use
Math.max
,Math.min
, andrequire
- If one of the arguments can not be evaluated to a number, return NaN
Пояснение задачи:
Функции `max` и `min` принимают любое количество аргументов и возвращают максимальное и минимальное значение соответственно среди переданных аргументов.
Пример:
1. `max(1,2,3,4)` // возвращает 4
2. `max(1,2,3,['4'])` // возвращает 4; здесь возвращается число, а не строка `'4'`
3. `max(1,2,3,[4])` // возвращает 4
4. `max(1,2,[3,['4']])` // возвращает 4
5. `max(1,2,[3,['4r']])` // возвращает NaN
6. `max([[],[-4]])` // возвращает -4
7. `max([])` или `max()` // возвращает 0
И аналогично для функции `min`.
Дополнительные инструкции:
1. Функции могут принимать любое количество аргументов.
2. Массивы чисел могут быть любой глубины.
3. Нельзя использовать `Math.max`, `Math.min` и `require`.
4. Если один из аргументов не может быть преобразован в число, функция должна вернуть `NaN`.
Платформа: CodeWars
Название задачи: ASCII Games: Flood Fill (Player) (Игры ASCII: заливка наводнения (игрок))
Ссылка на задачу: https://www.codewars.com/kata/58f573a0f6110e46a4000001
Сложность: 5 kyu
Уже решили (На момент написания статьи): 93 из 683
Тэги: Головоломки, игры
Оригинальное описание задачи:
ASCII Games is a series of hard game-based katas revolving around the classic games we love that operates on a rectangular grid.
Inspired by Kami
You will be given a rectanglar map with characters
1-5
representing different colors:var board = '\ 14441\n\ 12221\n\ 12333\n\ 22311\n\ 33355\n\ 44354\n\ 24345'
During every turn, you can choose a coordinate
x,y
(top left origin, x and y goes rightwards and downwards) and a color1-5
, which will turn every orthogonally adjacent tile of the same color as the tile you chosen into the new color you've chosen (i.e flood-filling):Example map: 14441 12221 12333 22311 33355 44354 24345 1. Flood-fill (0,4) to 4: 14441 14441 12221 12221 12*** (4) 12444 22*11 ==> 22411 ***55 44455 44*54 44454 24*45 24445 2. Flood-fill (0,5) to 5: 14441 14441 12221 12221 12*** (5) 12555 22*11 ==> 22511 ***55 55555 ***54 55554 2***5 25555 3. Flood-fill (2,2) to 2: 14441 14441 12221 12221 12*** (2) 12222 22*11 ==> 22211 ***** 22222 ****4 22224 2**** 22222 4. Flood-fill (1,3) to 1: 14441 14441 1***1 11111 1**** (1) 11111 ***11 ==> 11111 ***** 11111 ****4 11114 ***** 11111 5. Flood-fill (4,0) to 4: *444* 44444 ***** 44444 ***** (4) 44444 ***** ==> 44444 ***** 44444 ****4 44444 ***** 44444 Hence, after these moves, we obtain a board full of 4s.
In this part of the kata, you just need to play back the moves for this game, and return the result of the transformation due to the moves. The moves will be in the form of an array of objects:
[{x:0, y:4, color:4}, {x:0, y:5, color:5}, {x:2, y:2, color:2}, {x:1, y:3, color:1}, {x:4, y:0, color:4}]
You can assume that the moves and the map are always well-formed and valid.
Пояснение задачи:
Задача состоит в том, чтобы реализовать программу, которая будет воспроизводить ходы в игре на основе ASCII карт, представленных в виде прямоугольных массивов символов.
Каждый ход представляет собой выбор координат `(x, y)` и цвета `1-5`, после чего все соседние клетки того же цвета, что и выбранная клетка, будут заменены на новый цвет.
Например, если выбрать клетку `(0, 4)` и цвет `4`, то все клетки, которые соприкасаются с этой клеткой по горизонтали или вертикали и имеют тот же цвет, будут заменены на цвет `4`.
Программа должна принимать последовательность таких ходов в виде массива объектов, каждый из которых содержит координаты `(x, y)` и новый цвет `color`, и возвращать итоговую карту после выполнения всех ходов.
Это означает, что были выбраны следующие клетки:
1. `(0, 4)` -> заменяем все клетки вокруг на цвет `4`
2. `(0, 5)` -> заменяем все клетки вокруг на цвет `5`
3. `(2, 2)` -> заменяем все клетки вокруг на цвет `2`
4. `(1, 3)` -> заменяем все клетки вокруг на цвет `1`
5. `(4, 0)` -> заменяем все клетки вокруг на цвет `4`
После выполнения всех этих ходов итоговая карта будет содержать только клетки с цветом `4`.
Задача требует от вас реализации логики для обработки этих ходов и получения конечного результата.
Платформа: CodeWars
Название задачи: Find number in an array # 2 (Найти номер в массиве)
Ссылка на задачу: https://www.codewars.com/kata/583fd0398a20113a83000061
Сложность: 5 kyu
Уже решили (На момент написания статьи): 44 из 1 358
Тэги: Алгоритмы, головоломки
Оригинальное описание задачи:
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:
Given an unsorted array
arr
, there are numbers 1 to n inarr
, only two numbers are appear one time, all the other numbers appear two times.(That is, there are n*2-2 elements in the array) e.g.[1,2,4,3,5,4,2,1]
. Your task is to find the two unique number, and return them by an array[3,5]
(the small number in front of big number).Note:
- All numbers are positive integers;
- The length of array always more than 3;
- Please pay attention to optimizing the code to avoid time out.
- In the performance test(1000000 elements x 100 testcases), the time consuming of each test case should be within 8ms. This means, your code should run as fast as a rocket ;-)
Some Examples
findTwoUnique([1,2,4,3,5,4,2,1]) === [3,5] findTwoUnique([1,1,2,3,3,4]) === [2,4] findTwoUnique([9,9,8,8,7,6,5,4,3,2,1,2,3,4,5,6]) === [1,7]
Пояснение задачи:
Дана неупорядоченная последовательность чисел `arr`, где числа от 1 до `n` встречаются ровно один раз, а все остальные числа встречаются дважды.
Например, `[1,2,4,3,5,4,2,1]`.
Необходимо найти два уникальных числа и вернуть их в виде массива `[3,5]`.
Особенности задачи:
- Все числа положительные целые числа.
- Длина массива всегда больше трёх.
- Важно оптимизировать код, чтобы избежать превышения времени выполнения (time out).
- В тестах с 1 миллионом элементов и 100 тестами время выполнения каждого теста должно быть меньше 8 мс.
На этом всё, надеюсь, вам было интересно. Спасибо за внимание! Если у вас есть вопросы или пожелания, не стесняйтесь задавать их в комментариях. До новых встреч в следующих статьях, где мы продолжим решать интересные задачи вместе!