Приветствую всех, кто увлечён программированием! Сегодня я рад представить вам статью с разнообразными задачами, предназначенными для оттачивания навыков решения алгоритмических проблем. Независимо от вашего уровня подготовки, здесь вы найдёте задания от простых до более сложных, которые помогут не только углубить знания в области алгоритмов, но и поддерживать рабочую форму навыков программирования. Приготовьтесь проверить свои силы и получить настоящее удовольствие от процесса кодинга!
Что было раньше:
В предыдущей части мы решили:
- Reverse List Order (Обратный список)
- Push a hash/an object into array (Втянуть хеш/объект в массив)
- Simple Fun #175: Same Encryption (Простое веселье)
- Regexp Basics - is it a eight bit unsigned number? (Основы regexp - это восемь бит без знака?)
- Dude, my computer cannot count! (Чувак, мой компьютер не может считать!)
- Gambling Game Joker (Игра в азартные игры Джокер)
- Simple Fun #365: Remove Number Game I (Простое веселье)
- Basic neural networks - Machine Learning #2 (Основные нейронные сети - машинное обучение)
Решение новых задач:
Задача 1
Платформа: CodeWars
Название задачи: To square(root) or not to square(root) (К квадрату (корень) или не квадрату (корень))
Ссылка на задачу: https://www.codewars.com/kata/57f6ad55cca6e045d2000627
Сложность: 8 kyu
Уже решили (На момент написания статьи): 34 019 из 89 679
Оригинальное описание задачи:
Write a method, that will get an integer array as parameter and will process every number from this array.
Return a new array with processing every number of the input-array like this:
If the number has an integer square root, take this, otherwise square the number.
Example
[4,3,9,7,2,1] -> [2,9,3,49,4,1]
Notes
The input array will always contain only positive numbers, and will never be empty or null.
Пояснение задачи:
Эта задача требует от нас написать метод, который будет обрабатывать каждый элемент массива целых чисел. Метод должен возвращать новый массив, где числа обрабатываются следующим образом:
если число имеет целую квадратную корневую, то берется эта корневая, иначе число возводится в квадрат.
Пример:
Для входного массива `[4, 3, 9, 7, 2, 1]` результат будет следующим:
[2, 9, 3, 49, 4, 1]
Примечания
- Входной массив всегда содержит только положительные числа.
- Массив никогда не будет пустым или `null`.
Задача 2
Платформа: CodeWars
Название задачи: Sum of Multiples (Сумма мультипликации)
Ссылка на задачу: https://www.codewars.com/kata/57241e0f440cd279b5000829
Сложность: 8 kyu
Уже решили (На момент написания статьи): 24 992 из 120 832
Оригинальное описание задачи:
Your Job
Find the sum of all multiples of n
below m
Keep in Mind
n
and m
are natural numbers (positive integers)
m
is excluded from the multiples
Examples
sumMul(2, 9) ==> 2 + 4 + 6 + 8 = 20
sumMul(3, 13) ==> 3 + 6 + 9 + 12 = 30
sumMul(4, 123) ==> 4 + 8 + 12 + ... = 1860
sumMul(4, -7) ==> "INVALID"
Пояснение задачи:
Задача заключается в нахождении суммы всех кратных числа n, которые меньше числа m. Число m само не включается в сумму. Числа n и m — натуральные числа (положительные целые числа).
Примеры:
- sumMul(2, 9) → 2 + 4 + 6 + 8 = 20
- sumMul(3, 13) → 3 + 6 + 9 + 12 = 30
- sumMul(4, 123) → 4 + 8 + 12 + ... = 1860
- sumMul(4, -7) → "INVALID", так как m должно быть натуральным числом.
Задача 3
Платформа: CodeWars
Название задачи: Next Palindromic Number. (Следующее палиндромическое число.)
Ссылка на задачу: https://www.codewars.com/kata/56a6ce697c05fb4667000029
Сложность: 7 kyu
Уже решили (На момент написания статьи): 3 973 из 10 129
Оригинальное описание задачи:
There were and still are many problem in CW about palindrome numbers and palindrome strings. We suposse that you know which kind of numbers they are. If not, you may search about them using your favourite search engine.
In this kata you will be given a positive integer, val
and you have to create the function next_pal()
(nextPal
Javascript) that will output the smallest palindrome number higher than val
.
Let's see:
For Python
next_pal(11) == 22
next_pal(188) == 191
next_pal(191) == 202
next_pal(2541) == 2552
You will be receiving values higher than 10, all valid.
Enjoy it!!
Пояснение задачи:
В данном случае, мы работаем с функцией `next_pal`, которая принимает число и возвращает следующее число-палиндром, которое больше переданного значения.
Палиндром — это число, которое читается одинаково слева направо и справа налево.
Например, для числа 11 следующим палиндромом будет 22, а для 188 — 191.
Задача требует написания функции на разных языках программирования (Python, JavaScript, C#, Ruby, Haskell, C++, и т.д.), но основная идея остается той же:
-найти следующий палиндром после данного числа.
Задача 4
Платформа: CodeWars
Название задачи: Simple Physics Problem (Простая проблема физики)
Ссылка на задачу: https://www.codewars.com/kata/57c3eb9fd6cf0ffd68000222
Сложность: 7 kyu
Уже решили (На момент написания статьи): 452 из 1 415
Оригинальное описание задачи:
This just a simple physics problem:
A race car accelerates uniformly from 18.5 m/s
to 46.1 m/s
in 2.47 seconds
. Determine the acceleration of the car and the distance traveled.
Create a function solveit(vi, vf, t)
that takes in all three values and outputs a list of acceleration and distance in format [acceleration, distance]
.
Formula used:
a = (vf-vi)/t
d = vi*t + 0.5*a*(t**2)
If vi > vf then it should return empty list. The solution must be rounded off to double decimal place. Example: [11.17, 79.78]
Пояснение задачи:
Задача состоит в том, чтобы написать функцию `solveit`, которая решает физическую задачу о движении гоночного автомобиля.
Автомобиль разгоняется с начальной скоростью `vi = 18.5 м/с` до конечной скорости `vf = 46.1 м/с` за время `t = 2.47 секунды`.
Функция должна определить ускорение автомобиля и пройденное им расстояние.
Формулы для решения задачи:
1. Ускорение `a` рассчитывается как разница конечной и начальной скоростей, делённая на время разгона:
a = (vf-vi)/t
2. Расстояние, пройденное автомобилем, можно найти по формуле:
vi*t + 0.5*a*(t**2)
Если начальная скорость больше конечной (vi > vf), функция должна вернуть пустой список.
Результат должен быть округлен до двух десятичных знаков.
Пример результата:
`[11.17, 79.78]`
Эта задача требует использования математических формул и понимания работы с циклами и условиями в коде.
Задача 5
Платформа: CodeWars
Название задачи: Sorting Madness: part 3 (Сортировка безумия: часть 3)
Ссылка на задачу: https://www.codewars.com/kata/64c231b5edf1bc1ca78281a8
Сложность: 6 kyu
Уже решили (На момент написания статьи): 74 из 289
Оригинальное описание задачи:
As a data analyst at an online store, you are analyzing the purchasing behavior of your customers. Each customer can have multiple transactions, each transaction is either a purchase (represented by is_return
column value of false) or a return (represented by is_return
column value of true).
The transactions are recorded in a table called orders
. The table structure is as follows:
customer_id | is_return
-----------------------
1 | true
1 | true
1 | false
1 | false
2 | true
2 | true
2 | true
2 | false
3 | false
Your task is to write a PostgreSQL SQL query that orders the data in the following way:
- First, order by
customer_id.
- Then, within each customer, try to alternate between
is_return
= true (return) and is_return
= false (purchase) as much as possible (starting with true
). This means that, ideally, each return transaction should be followed by a purchase transaction, and vice versa. However, please note that it might not always be possible to alternate perfectly if a customer has more returns than purchases, or vice versa.
Here is an example of the desired output from the sample data above:
customer_id | is_return
-----------------------
1 | true
1 | false
1 | true
1 | false
2 | true
2 | false
2 | true
2 | true
3 | false
In this output, within each customer group, the is_return values alternate as much as possible. For instance, for customer 1, the sequence is true, false, true, false
. For customer 2, the sequence is true, false, true, true
. The perfect alternation is not possible for 2 as there are more returns than purchases. Lastly, for customer 3, there is only a purchase, so no alternation is possible.
Пояснение задачи:
Задача заключается в упорядочивании транзакций клиентов интернет-магазина таким образом, чтобы чередовались возвраты товаров (is_return = true) и покупки (is_return = false) насколько возможно. В идеале, каждая операция возврата должна следовать за покупкой, и наоборот. Однако идеальное чередование не всегда достижимо, особенно если у клиента больше возвратов, чем покупок, или наоборот.
Ниже приведён пример желаемого результата на основе предоставленного набора данных:
customer_id | is_return
-----------------------
1 | true
1 | false
1 | true
1 | false
2 | true
2 | false
2 | true
2 | true
3 | false
В этом примере, для каждого клиента группы, значения is_return чередуются настолько, насколько это возможно. Например, для клиента 1 последовательность составляет true, false, true, false.
Для клиента 2 последовательность составляет true, false, true, true.
Идеальное чередование невозможно для клиента 2, так как у него больше возвратов, чем покупок.
Наконец, для клиента 3 имеется только покупка, поэтому чередование невозможно
Задача 6
Платформа: CodeWars
Название задачи: [Code Golf] Luhn Check Digit ([Code Golf] Luhn проверьте цифру)
Ссылка на задачу: https://www.codewars.com/kata/6112e90fda33cb002e3f3e44
Сложность: 6 kyu
Уже решили (На момент написания статьи): 49 из 783
Оригинальное описание задачи:
Luhn algorithm
The Luhn algorithm is a simple checksum formula used to validate credit card numbers and other identification numbers.
Validation
- Take the decimal representation of the number.
- Starting from rightmost digit and moving left, double every second digit; if the new value is greater than
9
, replace it with the sum of its digits.
- Sum up all the resulting values.
- The number is valid if (and only if) the checksum is a multiple of
10
.
Example:
8 9 1 2 8 number
8 18 1 4 8 double even digits (2 -> 4, 9 -> 18)
8 9 1 4 8 18 -> 1+8 -> 9
8+9+1+4+8 -> 30 30 % 10 == 0 -> valid
Check digit
A valid number can be obtained appending a check digit to the number. For example, if the original number is 8912
, we can append 8
to obtain a valid number (89128
).
Warning: the algorithm for computing check digit in wikipedia is wrong.
Task
Compute the check digit of a number.
Input
n
[int] The number. Range: 00–10301030.
Output [int]
- The check digit, an integer k (0 ≤ k < 10) such that
n * 10 + k
is valid.
Restrictions
Your code should not be longer than 72 bytes.
(Personal best: 69 bytes)
Пояснение задачи:
Задача заключается в реализации алгоритма Луна, который используется для проверки действительности номеров кредитных карт и других идентификационных номеров.
Алгоритм проверяет контрольную сумму номера, добавляя ее в конец основного числа.
Проверка:
1. Возьмите исходный номер и преобразуйте его в десятичную систему.
2. Идите справа налево, удваивайте каждую вторую цифру (начиная с последней). Если результат больше 9, сложите цифры этого результата.
3. Сложите все полученные значения.
4. Номер считается действительным, если полученная сумма делится на 10 без остатка.
Пример:
8 9 1 2 8 исходный номер 8 18 1 4 8 удвоение четных цифр (2 -> 4, 9 -> 18) 8 9 1 4 8 18 -> 1+8 -> 9 8+9+1+4+8 -> 30 30 % 10 == 0 -> номер действителен
Контрольная цифра Если номер действителен, можно получить контрольную цифру, добавив ее к исходному числу. Например, если исходный номер `8912`, то после добавления контрольной цифры `8` получаем действительный номер `89128`.
Ограничения Ваш код должен быть короче 72 байт. (Личный рекорд: 69 байт)
Задача 7
Платформа: CodeWars
Название задачи: Infix operations (Инфикс операции)
Ссылка на задачу: https://www.codewars.com/kata/65df84adadc860184726e598
Сложность: 5 kyu
Уже решили (На момент написания статьи): 9 из 16
Оригинальное описание задачи:
Task
Implement infix application of arbitrary binary operations.
Create a function infix
that lifts a (prefix) binary function to an infix operator, together with terms Infix
and Endfix
to denote the start and end of an infix block (see the examples below).
Examples
plus = infix add
times = infix mul
o = infix comp # function composition
and' = infix and
or' = infix or
xor' = infix xor
Infix anything Endfix # -> anything
Infix 2 plus 3 times 7 Endfix # -> 35
Infix (add 2) o (mul 3) o succ Endfix 4 # -> 17
Infix true xor' false or' false and' true Endfix # -> true
All infix
ed operators have equal precedence and associate to the left, meaning
(2 + 3) * 7
((add 2) o (mul 3)) o succ
((true xor false) or false) and true
for the examples above. Note that composed functions are applied right-to-left.
Basic arithmetical operations succ, add, mul
, comp
for function composition, and logical operations and, or, xor
, must be implemented, as well as true, false, if
for your Boolean
encoding.
(If you solve this kata with infix = id
, you get an extra honor!! - and please create a fork.)
Encoding
Purity is LetRec
, allowing simple recursive calls of a method to itself.
Use Scott
encoding for Number
s.
Пояснение задачи:
Задача заключается в реализации инфиксной записи бинарных операций. Это включает создание функции `infix`, которая превращает префиксную бинарную операцию в инфиксный оператор, а также добавление терминов `Infix` и `Endfix` для обозначения начала и конца блока инфиксной записи.
Инфиксные операторы имеют одинаковый приоритет и ассоциируются слева. Составленные функции применяются справа налево.
Также должны быть реализованы базовые арифметические операции `succ`, `add`, `mul`, `comp` для композиции функций, логические операции `and`, `or`, `xor`, а также логические константы `true`, `false` и условная операция `if`.
Используйте Скоттовское кодирование для чисел и чистое Лямбда-кодирование.
Задача 8
Платформа: CodeWars
Название задачи: The Binary Binary Expansion (Бинарное бинарное расширение)
Ссылка на задачу: https://www.codewars.com/kata/59a818191c55c44f3900053f
Сложность: 5 kyu
Уже решили (На момент написания статьи): 181 из 1 057
Оригинальное описание задачи:
Normally, we decompose a number into binary digits by assigning it with powers of 2, with a coefficient of 0
or 1
for each term:
25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1
The choice of 0
and 1
is... not very binary. We shall perform the true binary expansion by expanding with powers of 2, but with a coefficient of 1
or -1
instead:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Now this looks binary.
Given any positive number n
, expand it using the true binary expansion, and return the result as an array, from the most significant digit to the least significant digit.
true_binary(25) == [1,1,1,-1,-1]
It should be trivial (the proofs are left as an exercise to the reader) to see that:
- Every odd number has infinitely many true binary expansions
- Every even number has no true binary expansions
Hence, n
will always be an odd number, and you should return the least true binary expansion for any n
.
Also, note that n
can be very, very large, so your code should be very efficient.
Пояснение задачи:
Задача требует от нас разложить число на его истинное двоичное представление, используя коэффициенты 1 или -1 для каждой степени двойки, вместо обычных 0 и 1.
Это означает, что мы будем представлять число как сумму степеней двойки с коэффициентами, равными 1 или -1.
Например, для числа 25 это будет выглядеть так:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Таким образом, результатом для 25 будет `[1, 1, 1, -1, -1]`.
Обратите внимание, что это представление всегда будет начинаться с 1, так как все нечетные числа имеют хотя бы одну степень двойки в своем представлении.
Важно учитывать, что число может быть очень большим, поэтому код должен быть максимально эффективным.
Заключение:
Платформа: CodeWars
Название задачи: To square(root) or not to square(root) (К квадрату (корень) или не квадрату (корень))
Ссылка на задачу: https://www.codewars.com/kata/57f6ad55cca6e045d2000627
Сложность: 8 kyu
Уже решили (На момент написания статьи): 34 019 из 89 679
Оригинальное описание задачи:
Write a method, that will get an integer array as parameter and will process every number from this array.
Return a new array with processing every number of the input-array like this:
If the number has an integer square root, take this, otherwise square the number.
Example
[4,3,9,7,2,1] -> [2,9,3,49,4,1]
Notes
The input array will always contain only positive numbers, and will never be empty or null.
Пояснение задачи:
Эта задача требует от нас написать метод, который будет обрабатывать каждый элемент массива целых чисел. Метод должен возвращать новый массив, где числа обрабатываются следующим образом:
если число имеет целую квадратную корневую, то берется эта корневая, иначе число возводится в квадрат.
Пример:
Для входного массива `[4, 3, 9, 7, 2, 1]` результат будет следующим:
[2, 9, 3, 49, 4, 1]
Примечания
- Входной массив всегда содержит только положительные числа.
- Массив никогда не будет пустым или `null`.
Платформа: CodeWars
Название задачи: Sum of Multiples (Сумма мультипликации)
Ссылка на задачу: https://www.codewars.com/kata/57241e0f440cd279b5000829
Сложность: 8 kyu
Уже решили (На момент написания статьи): 24 992 из 120 832
Оригинальное описание задачи:
Your Job
Find the sum of all multiples of
n
belowm
Keep in Mind
n
andm
are natural numbers (positive integers)m
is excluded from the multiplesExamples
sumMul(2, 9) ==> 2 + 4 + 6 + 8 = 20 sumMul(3, 13) ==> 3 + 6 + 9 + 12 = 30 sumMul(4, 123) ==> 4 + 8 + 12 + ... = 1860 sumMul(4, -7) ==> "INVALID"
Пояснение задачи:
Задача заключается в нахождении суммы всех кратных числа n, которые меньше числа m. Число m само не включается в сумму. Числа n и m — натуральные числа (положительные целые числа).
Примеры:
- sumMul(2, 9) → 2 + 4 + 6 + 8 = 20
- sumMul(3, 13) → 3 + 6 + 9 + 12 = 30
- sumMul(4, 123) → 4 + 8 + 12 + ... = 1860
- sumMul(4, -7) → "INVALID", так как m должно быть натуральным числом.
Платформа: CodeWars
Название задачи: Next Palindromic Number. (Следующее палиндромическое число.)
Ссылка на задачу: https://www.codewars.com/kata/56a6ce697c05fb4667000029
Сложность: 7 kyu
Уже решили (На момент написания статьи): 3 973 из 10 129
Оригинальное описание задачи:
There were and still are many problem in CW about palindrome numbers and palindrome strings. We suposse that you know which kind of numbers they are. If not, you may search about them using your favourite search engine.
In this kata you will be given a positive integer,
val
and you have to create the functionnext_pal()
(nextPal
Javascript) that will output the smallest palindrome number higher thanval
.Let's see:
For Python next_pal(11) == 22 next_pal(188) == 191 next_pal(191) == 202 next_pal(2541) == 2552
You will be receiving values higher than 10, all valid.
Enjoy it!!
Пояснение задачи:
В данном случае, мы работаем с функцией `next_pal`, которая принимает число и возвращает следующее число-палиндром, которое больше переданного значения.
Палиндром — это число, которое читается одинаково слева направо и справа налево.
Например, для числа 11 следующим палиндромом будет 22, а для 188 — 191.
Задача требует написания функции на разных языках программирования (Python, JavaScript, C#, Ruby, Haskell, C++, и т.д.), но основная идея остается той же:
-найти следующий палиндром после данного числа.
Платформа: CodeWars
Название задачи: Simple Physics Problem (Простая проблема физики)
Ссылка на задачу: https://www.codewars.com/kata/57c3eb9fd6cf0ffd68000222
Сложность: 7 kyu
Уже решили (На момент написания статьи): 452 из 1 415
Оригинальное описание задачи:
This just a simple physics problem:
A race car accelerates uniformly from
18.5 m/s
to46.1 m/s
in2.47 seconds
. Determine the acceleration of the car and the distance traveled.Create a function
solveit(vi, vf, t)
that takes in all three values and outputs a list of acceleration and distance in format[acceleration, distance]
.Formula used:
a = (vf-vi)/t d = vi*t + 0.5*a*(t**2)
If vi > vf then it should return empty list. The solution must be rounded off to double decimal place. Example:
[11.17, 79.78]
Пояснение задачи:
Задача состоит в том, чтобы написать функцию `solveit`, которая решает физическую задачу о движении гоночного автомобиля.
Автомобиль разгоняется с начальной скоростью `vi = 18.5 м/с` до конечной скорости `vf = 46.1 м/с` за время `t = 2.47 секунды`.
Функция должна определить ускорение автомобиля и пройденное им расстояние.
Формулы для решения задачи:
1. Ускорение `a` рассчитывается как разница конечной и начальной скоростей, делённая на время разгона:
a = (vf-vi)/t
2. Расстояние, пройденное автомобилем, можно найти по формуле:vi*t + 0.5*a*(t**2)
Если начальная скорость больше конечной (vi > vf), функция должна вернуть пустой список.
Результат должен быть округлен до двух десятичных знаков.
Пример результата:
`[11.17, 79.78]`
Эта задача требует использования математических формул и понимания работы с циклами и условиями в коде.
Платформа: CodeWars
Название задачи: Sorting Madness: part 3 (Сортировка безумия: часть 3)
Ссылка на задачу: https://www.codewars.com/kata/64c231b5edf1bc1ca78281a8
Сложность: 6 kyu
Уже решили (На момент написания статьи): 74 из 289
Оригинальное описание задачи:
As a data analyst at an online store, you are analyzing the purchasing behavior of your customers. Each customer can have multiple transactions, each transaction is either a purchase (represented by
is_return
column value of false) or a return (represented byis_return
column value of true).The transactions are recorded in a table called
orders
. The table structure is as follows:customer_id | is_return ----------------------- 1 | true 1 | true 1 | false 1 | false 2 | true 2 | true 2 | true 2 | false 3 | false
Your task is to write a PostgreSQL SQL query that orders the data in the following way:
- First, order by
customer_id.
- Then, within each customer, try to alternate between
is_return
= true (return) andis_return
= false (purchase) as much as possible (starting withtrue
). This means that, ideally, each return transaction should be followed by a purchase transaction, and vice versa. However, please note that it might not always be possible to alternate perfectly if a customer has more returns than purchases, or vice versa.Here is an example of the desired output from the sample data above:
customer_id | is_return ----------------------- 1 | true 1 | false 1 | true 1 | false 2 | true 2 | false 2 | true 2 | true 3 | false
In this output, within each customer group, the is_return values alternate as much as possible. For instance, for customer 1, the sequence is
true, false, true, false
. For customer 2, the sequence istrue, false, true, true
. The perfect alternation is not possible for 2 as there are more returns than purchases. Lastly, for customer 3, there is only a purchase, so no alternation is possible.
Пояснение задачи:
Задача заключается в упорядочивании транзакций клиентов интернет-магазина таким образом, чтобы чередовались возвраты товаров (is_return = true) и покупки (is_return = false) насколько возможно. В идеале, каждая операция возврата должна следовать за покупкой, и наоборот. Однако идеальное чередование не всегда достижимо, особенно если у клиента больше возвратов, чем покупок, или наоборот.
Ниже приведён пример желаемого результата на основе предоставленного набора данных:
customer_id | is_return
-----------------------
1 | true
1 | false
1 | true
1 | false
2 | true
2 | false
2 | true
2 | true
3 | falseВ этом примере, для каждого клиента группы, значения is_return чередуются настолько, насколько это возможно. Например, для клиента 1 последовательность составляет true, false, true, false.
Для клиента 2 последовательность составляет true, false, true, true.
Идеальное чередование невозможно для клиента 2, так как у него больше возвратов, чем покупок.
Наконец, для клиента 3 имеется только покупка, поэтому чередование невозможно
Платформа: CodeWars
Название задачи: [Code Golf] Luhn Check Digit ([Code Golf] Luhn проверьте цифру)
Ссылка на задачу: https://www.codewars.com/kata/6112e90fda33cb002e3f3e44
Сложность: 6 kyu
Уже решили (На момент написания статьи): 49 из 783
Оригинальное описание задачи:
Luhn algorithm
The Luhn algorithm is a simple checksum formula used to validate credit card numbers and other identification numbers.
Validation
- Take the decimal representation of the number.
- Starting from rightmost digit and moving left, double every second digit; if the new value is greater than
9
, replace it with the sum of its digits.- Sum up all the resulting values.
- The number is valid if (and only if) the checksum is a multiple of
10
.Example:
8 9 1 2 8 number 8 18 1 4 8 double even digits (2 -> 4, 9 -> 18) 8 9 1 4 8 18 -> 1+8 -> 9 8+9+1+4+8 -> 30 30 % 10 == 0 -> valid
Check digit
A valid number can be obtained appending a check digit to the number. For example, if the original number is
8912
, we can append8
to obtain a valid number (89128
).Warning: the algorithm for computing check digit in wikipedia is wrong.
Task
Compute the check digit of a number.
Input
n
[int] The number. Range: 00–10301030.Output [int]
- The check digit, an integer k (0 ≤ k < 10) such that
n * 10 + k
is valid.Restrictions
Your code should not be longer than 72 bytes.
(Personal best: 69 bytes)
Пояснение задачи:
Задача заключается в реализации алгоритма Луна, который используется для проверки действительности номеров кредитных карт и других идентификационных номеров.
Алгоритм проверяет контрольную сумму номера, добавляя ее в конец основного числа.
Проверка:
1. Возьмите исходный номер и преобразуйте его в десятичную систему.
2. Идите справа налево, удваивайте каждую вторую цифру (начиная с последней). Если результат больше 9, сложите цифры этого результата.
3. Сложите все полученные значения.
4. Номер считается действительным, если полученная сумма делится на 10 без остатка.
Пример:
8 9 1 2 8 исходный номер 8 18 1 4 8 удвоение четных цифр (2 -> 4, 9 -> 18) 8 9 1 4 8 18 -> 1+8 -> 9 8+9+1+4+8 -> 30 30 % 10 == 0 -> номер действителен
Контрольная цифра Если номер действителен, можно получить контрольную цифру, добавив ее к исходному числу. Например, если исходный номер `8912`, то после добавления контрольной цифры `8` получаем действительный номер `89128`.
Ограничения Ваш код должен быть короче 72 байт. (Личный рекорд: 69 байт)
Платформа: CodeWars
Название задачи: Infix operations (Инфикс операции)
Ссылка на задачу: https://www.codewars.com/kata/65df84adadc860184726e598
Сложность: 5 kyu
Уже решили (На момент написания статьи): 9 из 16
Оригинальное описание задачи:
Task
Implement infix application of arbitrary binary operations.
Create a function
infix
that lifts a (prefix) binary function to an infix operator, together with termsInfix
andEndfix
to denote the start and end of an infix block (see the examples below).Examples
plus = infix add times = infix mul o = infix comp # function composition and' = infix and or' = infix or xor' = infix xor Infix anything Endfix # -> anything Infix 2 plus 3 times 7 Endfix # -> 35 Infix (add 2) o (mul 3) o succ Endfix 4 # -> 17 Infix true xor' false or' false and' true Endfix # -> true
All
infix
ed operators have equal precedence and associate to the left, meaning
(2 + 3) * 7
((add 2) o (mul 3)) o succ
((true xor false) or false) and true
for the examples above. Note that composed functions are applied right-to-left.
Basic arithmetical operations
succ, add, mul
,comp
for function composition, and logical operationsand, or, xor
, must be implemented, as well astrue, false, if
for yourBoolean
encoding.(If you solve this kata with
infix = id
, you get an extra honor!! - and please create a fork.)Encoding
Purity is
LetRec
, allowing simple recursive calls of a method to itself.
UseScott
encoding forNumber
s.
Пояснение задачи:
Задача заключается в реализации инфиксной записи бинарных операций. Это включает создание функции `infix`, которая превращает префиксную бинарную операцию в инфиксный оператор, а также добавление терминов `Infix` и `Endfix` для обозначения начала и конца блока инфиксной записи.
Инфиксные операторы имеют одинаковый приоритет и ассоциируются слева. Составленные функции применяются справа налево.
Также должны быть реализованы базовые арифметические операции `succ`, `add`, `mul`, `comp` для композиции функций, логические операции `and`, `or`, `xor`, а также логические константы `true`, `false` и условная операция `if`.
Используйте Скоттовское кодирование для чисел и чистое Лямбда-кодирование.
Платформа: CodeWars
Название задачи: The Binary Binary Expansion (Бинарное бинарное расширение)
Ссылка на задачу: https://www.codewars.com/kata/59a818191c55c44f3900053f
Сложность: 5 kyu
Уже решили (На момент написания статьи): 181 из 1 057
Оригинальное описание задачи:
Normally, we decompose a number into binary digits by assigning it with powers of 2, with a coefficient of
0
or1
for each term:
25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1
The choice of
0
and1
is... not very binary. We shall perform the true binary expansion by expanding with powers of 2, but with a coefficient of1
or-1
instead:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Now this looks binary.
Given any positive number
n
, expand it using the true binary expansion, and return the result as an array, from the most significant digit to the least significant digit.
true_binary(25) == [1,1,1,-1,-1]
It should be trivial (the proofs are left as an exercise to the reader) to see that:
- Every odd number has infinitely many true binary expansions
- Every even number has no true binary expansions
Hence,
n
will always be an odd number, and you should return the least true binary expansion for anyn
.Also, note that
n
can be very, very large, so your code should be very efficient.
Пояснение задачи:
Задача требует от нас разложить число на его истинное двоичное представление, используя коэффициенты 1 или -1 для каждой степени двойки, вместо обычных 0 и 1.
Это означает, что мы будем представлять число как сумму степеней двойки с коэффициентами, равными 1 или -1.
Например, для числа 25 это будет выглядеть так:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Таким образом, результатом для 25 будет `[1, 1, 1, -1, -1]`.
Обратите внимание, что это представление всегда будет начинаться с 1, так как все нечетные числа имеют хотя бы одну степень двойки в своем представлении.
Важно учитывать, что число может быть очень большим, поэтому код должен быть максимально эффективным.
На этом мы завершаем нашу статью. Надеюсь, материал оказался полезным и интересным для вас. Благодарю за уделённое время и активное участие в обсуждении. Если у вас остались вопросы или появились идеи для новых тем, обязательно оставляйте комментарии – ваше мнение очень важно для нас. До новых встреч в следующих статьях, где мы продолжим решать увлекательные задачи вместе!