Глубокое погружение в проблемы секретного кодирования
Уровень 2 состоял из двух задач. С точки зрения сложности, я обнаружил, что обе задачи похожи на задачи Leetcode Easy. Как и уровень 1, эти проблемы требовали четкого понимания встроенных типов данных и их методов.
Если вы не знакомы с Foobar Challenge, я рекомендую прочитать мою предыдущую статью, в которой представлен обзор и анализ проблемы уровня 1.
Вопросы и концепции 📚
Внимание — впереди спойлеры ⛔️
Ниже я разбиваю вопросы и объясняю свой мыслительный процесс. Я также предлагаю решения. Однако настоятельно рекомендую сначала решить проблему. Лучшая часть задачи — это удивление и удовлетворение от решения неуловимой проблемы.
Я обсуждал не публиковать решения, а просто объяснять основные концепции. Тем не менее, частью кодирования является изучение того, как устранять неполадки и точно определять, где код дает сбой. Поэтому я решил опубликовать решения, чтобы, если вы застряли, вы могли видеть, где именно ваша логика расходится.
Уровень 2: Задача 1 ⭐️
Техническое обслуживание лифта
====================
Вам поручили обременительную задачу по обслуживанию лифта — тьфу! Это было бы не так уж плохо, если бы вся документация по лифтам годами лежала в беспорядочной куче на дне картотеки, и вы даже не знаете, над какими номерами версий лифтов вы будете работать.< br /> Версии лифта представлены серией чисел, разделенных на основные, второстепенные и ревизионные целые числа. Новые версии лифта увеличивают основной номер, т.е. 1, 2, 3 и так далее. Когда к лифту добавляются новые функции, не являющиеся полной новой версией, для представления этих новых дополнений можно использовать второе число, называемое второстепенным, например. 1.0, 1.1, 1.2 и т. д. Небольшие исправления или работы по техническому обслуживанию могут быть представлены третьим номером с именем ревизии, например. 1.1.1, 1.1.2, 1.2.0 и так далее. Число ноль можно использовать в качестве основного для предварительных версий лифтов, например. 0.1, 0.5, 0.9.2 и т. д. (Командир Лямбда старается всегда проводить бета-тестирование своей новой технологии со своими верными приспешниками в качестве подопытных!).
Имея список версий лифта, представленных в виде строк, напишите решение функции( l), который возвращает тот же список, отсортированный в порядке возрастания по основному, младшему номеру и номеру редакции, чтобы вы могли определить текущую версию лифта. Версии в списке l всегда будут содержать основные номера, но дополнительные номера и номера редакций указывать необязательно. Если версия содержит номер ревизии, то она также будет иметь второстепенный номер.
Например, для списка l как [1.1.2, 1.0, 1.3.3, 1.0.12, 1.0.2] функция solution(l) вернет список [1.0, 1.0.2, 1.0.12, 1.1.2, 1.3.3]. Если две или более версии эквивалентны, но одна версия содержит больше номеров, чем другие, то эти версии должны быть отсортированы по возрастанию в зависимости от того, сколько в них номеров, например [1, 1.0, 1.0.0]. Количество элементов в списке l будет не менее 1 и не превысит 100.
Тестовые наборы
==========
Ваш код должен пройти следующие тестовые наборы.
Обратите внимание, что его также можно запускать со скрытыми тестовыми наборами, не показанными здесь.
-- Случаи Python --
Ввод:
решение.решение([1.11, 2.0.0, 1.2, 2, 0.1, 1.2.1, 1.1.1, 2.0])
Вывод:
0.1,1.1.1,1.2,1.2.1,1.11,2,2.0,2.0.0
Ввод:
решение.решение([1.1.2, 1.0, 1.3.3, 1.0.12, 1.0.2])
Вывод:
1.0,1.0.2,1.0.12, 1.1.2,1.3.3
Ввод представляет собой список строк, и цель состоит в том, чтобы отсортировать их в соответствии с критериями. Тип list
имеет метод sort
, который сортирует элементы в списке, выполняя <
сравнения. Для списка таких строк, как l
, sort
будет искать первую цифру в каждой строке. Если две строки имеют одинаковую первую цифру, то сравнение будет использовать следующую цифру и так далее. В результате сравнение между строками разной длины может быть неверным. Например, sort
поместит “1.12”
перед “1.2”
. Строки имеют одинаковую первую цифру, поэтому при сравнении будет использоваться следующая цифра. Поскольку “1” < “2”
, “1.12”
предшествует “1.2”
, хотя 2 меньше 12.
Если бы это были целые числа, а не строки, sort
использовало бы для сравнения все число целиком, а не сравнение по цифрам. Однако преобразование каждого элемента в число int
не будет работать для элементов с номером ревизии. sort
необходимо сравнить каждый компонент как целое число с его аналогами. Приведение каждого элемента к list
из int
типов достигает именно этого.
Как показано ниже, понимание вложенных списков создает answer
, список списков целых чисел. Тип str
имеет встроенный метод split
, который разбивает строку на подстроку с заданным разделителем. Здесь ‘.’
является разделителем. split
выводит список подстрок, а функция int
преобразует их в целые числа.
Для списка списков sort
упорядочивает элементы на основе первого элемента в каждом списке. Если элементы равны, sort
проверяется следующий элемент. answer.sort()
сортирует answer
на месте.
Наконец, преобразуйте список списков в список строк, ожидаемое возвращаемое значение. Метод str.join
принимает списки строк и объединяет их. ‘.’.join
объединит строки так, чтобы ‘.’
разделил каждый элемент в выходной строке.
Эти вопросы требуют знания строковых методов, list.sort
и построения списков.
Уровень 2: Задача 2 ⭐️
Салют в пути
====================
Командир Лямбда любит эффективность и ненавидит все, что отнимает время. В конце концов, она занятая овечка! Она щедро вознаграждает приспешников, которые выявляют источники неэффективности и придумывают способы их устранения. Вы заметили один такой источник и думаете, что его решение поможет вам создать репутацию, необходимую для продвижения по службе.
Каждый раз, когда сотрудники Командующего проходят мимо друг друга в зале, каждый из них должен остановиться и отдать честь друг другу — по одному — прежде чем возобновить свой путь. Салют длится пять секунд, поэтому каждый обмен салютами занимает целых десять секунд (салют командира Лямбды немного, э-э, запутан). Вы думаете, что, убрав требование приветствия, вы могли бы сэкономить несколько коллективных часов рабочего времени сотрудников в день. Но сначала вам нужно показать ей, насколько серьезна проблема на самом деле.
Напишите программу, которая подсчитывает количество салютов, которыми обмениваются во время типичной прогулки по коридору. Зал представлен струной. Например: " - ->-><-><->-"
Каждая строка коридора будет содержать символы трех разных типов: «›», сотрудник, идущий вправо; «‹», сотрудник, идущий налево; и «-», пустое место. Каждый сотрудник ходит с одинаковой скоростью вправо или влево, в зависимости от своего направления. Всякий раз, когда два сотрудника переходят дорогу, каждый из них приветствует другого. Затем они продолжают идти, пока не дойдут до конца, наконец выходя из коридора. В приведенном выше примере они отдают честь 10 раз.
Напишите ответ(ы) функции, которая принимает строку, представляющую сотрудников, идущих по коридору, и возвращает количество раз, когда сотрудники отдают честь. s будет содержать не менее 1 и не более 100 символов, каждый из которых -, › или ‹.
Пример вывода:
Тестовые примеры
==========
Входы:
s = “> — — <”
Выход:
2
Входы:
s = “<<>><”
Выход:
4
На мой взгляд, это была самая простая задача! Для каждого правоходца подсчитайте количество левоходцев, которых он/она минует. Поскольку в каждом приветствии участвуют два человека, умножьте количество прошедших слева пешеходов на 2 и прибавьте это число к ответу.
Символы ‘-’
не имеют отношения к ответу. Удаление символов ‘-’
укорачивает строку и, таким образом, сужает область поиска. Функция enumerate
выводит индекс и символ для каждого символа в no_dash
. Если персонаж ‘>’
(правоходец), то создайте подстроку people_in_front
. Каждый левый ходок в people_in_front
представляет собой салют, в котором участвуют 2 человека. answer
- общее количество людей, отдавших честь.
Эта задача проверяет знание строк, подстрок и циклов.
Вывод 📌
Я планирую продолжить описание своего путешествия по Foobar и подробно описать, как я решал проблемы, в следующих статьях. Следуйте за мной, чтобы узнать больше о вызове. Кроме того, все отзывы приветствуются. Я всегда стремлюсь узнать новые или лучшие способы ведения дел. Не стесняйтесь оставлять комментарии или обращаться ко мне по адресу [email protected].