Задачи кодирования (2 части серии)
Приветствуюлей проблемных решений! 🤓.
Как я уже сказал, решение проблем выглядит как мышц, и необходимо часто практиковать, чтобы улучшить и расти как разработчик.
В этом втором эпизоде я выбрал несколько простых проблем, чтобы решить из моих любимых алгоритмов веб-сайта.
Оглавление
- Можете ли вы получить петлю?
- Азбука Морзе
- Прямоугольник на квадраты
- Встреча
- Игра с цифрами
Можете ли вы получить петлю?
Из Кодовые слова
Эта проблема:
Вам дают узел, который является началом связанного списка. Этот список всегда содержит хвост и цикл.
Ваша цель – определить длину цикла.
Например, в следующем изображении размер хвоста 3 и размер петли 11.
Используйте атрибут «Далее», чтобы получить следующий узел.
Примечание : Не мутируйте узлы!
Мое решение (JavaScript):
function loop_size(node){
let turtle = node;
let rabbit = node;
/* We need the turtle and the rabbit to start at the same
place. (The rabbit being faster will catch up the turtle at
some point) */
do {
turtle = turtle.getNext();
rabbit = rabbit.getNext().getNext();
} while (turtle !== rabbit)
/* The rabbit goes for a run and we know that ends when he
reaches the turtle position again. */
let counter = 0;
do {
rabbit = rabbit.getNext();
counter++;
} while (turtle !== rabbit)
return counter;
}
Азбука Морзе
Из Кодовые слова
Эта проблема:
В этой кате вы должны написать простой декодер Morse Code. В то время как код Морзе теперь в основном выходит в основном каналы связи голоса и цифровых данных, он все еще имеет его использование в некоторых приложениях по всему миру. Код Морзе кодирует каждый символ как последовательность «точек» и «тире». Например, буква A кодируется как · -, буква Q кодируется как – · – и цифру 1 кодируется как · —-. Код Морзе является нечувствительным к регистру, традиционно используются заглавные буквы. Когда сообщение написано в MORSE код, одно пространство используется для разделения кодов символов, и 3 пространства используются для разделения слов.
ЗАМЕТКА: Дополнительные пробелы до или после того, как код не имеют смысла и следует игнорировать.
В дополнение к буквам, цифрам и некоторой пунктуации, существуют некоторые специальные сервисные коды, самые известные из них – международный сигнал бедствия (который был впервые выпущен Titic), который закодирован как ··· — ···· Отказ Эти специальные коды рассматриваются как одиночные специальные символы, и обычно передаются как отдельные слова.
Ваша задача – реализовать функцию, которая заберет код MORSE в качестве ввода и возврата декодированной человеческой читаемой строки.
Например:
decodeMorse('.... . -.-- .--- ..- -.. .')
#should return "HEY JUDE"
Примечание : Для целей кодирования вы должны использовать символы ASCII. и – не символы Unicode.
Таблица Morse Code предварительно загружена для вас в качестве словаря, не стесняйтесь использовать его:
JavaScript/Tymdercript: MORSE_CODE [‘.–‘]
Мое решение (JavaScript):
const decodeMorse = (morseCode) => {
const response = [];
const words = morseCode.trim().split(' ');
for (const word of words) {
const wordArr = [];
for (const letter of word.split(' ')) {
wordArr.push(MORSE_CODE[letter]);
}
response.push(wordArr.join(''))
}
return response.join(' ');
}
Прямоугольник на квадраты
Из Кодовые слова
Эта проблема:
Приведенный ниже рисунок дает представление о том, как сократить заданный «истинный» прямоугольник на квадраты («истинный» прямоугольник, что означает, что два размера различны).
Можете ли вы перевести этот рисунок в алгоритм?
Вам будет дано два измерения
- положительная целочисленная длина (параметр с именем СПГ)
- Положительная целочисленная ширина (параметр по имени ширина)
Вы вернете коллекцию или строку (в зависимости от языка; Shell Bash, PowerShell, Pascal и Fortran возвращают строку) с размером каждого из квадратов.
Пример:
sqInRect(5, 3) should return "3 2 1 1" sqInRect(3, 5) should return "3 2 1 1"
Мое решение (JavaScript):
function sqInRect(lng, wdth){
console.log(lng, wdth);
if (lng === wdth) { return null; }
let lngx = lng;
let wdthx = wdth;
let area = lng * wdth;
let result = [];
while (area > 0) {
if (lngx > wdthx) {
area -= Math.pow(wdthx, 2);
result.push(wdthx);
lngx = lngx - wdthx;
} else {
area -= Math.pow(lngx, 2);
result.push(lngx);
wdthx = wdthx - lngx;
}
}
return result;
}
Встреча
Из Кодовые слова
Эта проблема:
Джон пригласил некоторых друзей. Его список:
s = "Fred:Corwill;Wilfred:Corwill;Barney:Tornbull;Betty:Tornbull;Bjon:Tornbull;Raphael:Corwill;Alfred:Corwill";
Не могли бы вы сделать программу, которая
- делает эту строку в верхнем регистре
- Дает ему отсортировано в алфавитном порядке по фамилии.
Когда фамилии одинаковы, сортируйте их по имени. Фамилия и имя гостя выходят в результате между скобками, разделенными запятой.
Таким образом, результат заседания функций будет:
"(CORWILL, ALFRED)(CORWILL, FRED)(CORWILL, RAPHAEL)(CORWILL, WILFRED)(TORNBULL, BARNEY)(TORNBULL, BETTY)(TORNBULL, BJON)"
Может произойти, что в двух отдельных семьях с той же фамилией имени два человека тоже одинаковое имя.
Мое решение (Python):
def meeting(s):
result = ""
# Convert string to list
names_list = s.upper().split(";")
# Create a dictionnary and bind a list of first names to every last names
names_dic = {}
for name in names_list:
first_name = name.split(":")[0]
last_name = name.split(":")[1]
if last_name in names_dic: names_dic[last_name].append(first_name)
else: names_dic[last_name] = [first_name]
# Sort and add every entry to the result string
for key in sorted(names_dic):
for first_name in sorted(names_dic[key]):
result = result + f"({key}, {first_name})"
return result
Игра с цифрами
Из Кодовые слова
Эта проблема:
Некоторые числа имеют забавные свойства. Например:
89 –> 8¹ + * 1
695 –> 6² + 9³ + * 2
46288 –> 4³ + 6⁴+ 2⁵ + 8⁶ + * 51
Учитывая положительное целое число n, написанное как ABCD … (a, b, c, d … быть цифрами) и положительное целое число p
Мы хотим найти положительное целое число k, если оно существует, например, сумма цифр n, взятых на последовательные мощности P, равна k * n. Другими словами:
Есть ли целое число k, такое как: (a ^ p + b ^ (p + 1) + c ^ (p + 2) + d ^ (p + 3) + * k
Если это так, мы вернем K, если не вернуть -1.
Примечание : n и p всегда будет дан как строго позитивные целые числа.
dig_pow(89, 1) should return 1 since 8¹ + 9² = 89 = 89 * 1 dig_pow(92, 1) should return -1 since there is no k such as 9¹ + 2² equals 92 * k dig_pow(695, 2) should return 2 since 6² + 9³ + 5⁴= 1390 = 695 * 2 dig_pow(46288, 3) should return 51 since 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51
Мое решение (JavaScript):
function digPow(n, p){
if(!n || !p){
return -1;
}
let digitArray = n.toString().split("");
let sun = 0;
for(let i = 0; iЗадачи кодирования (2 части серии)
Оригинал: “https://dev.to/killianfrappartdev/coding-challenges-2-1bmp”