Глубокое погружение в проблемы секретного кодирования

Уровень 2 состоял из двух задач. С точки зрения сложности, я обнаружил, что обе задачи похожи на задачи Leetcode Easy. Как и уровень 1, эти проблемы требовали четкого понимания встроенных типов данных и их методов.

Если вы не знакомы с Foobar Challenge, я рекомендую прочитать мою предыдущую статью, в которой представлен обзор и анализ проблемы уровня 1.



Вызов Google Foobar: Уровень 1
Введение в вызов секретного кодирования и анализ проблемна пути к datascience.com



Вопросы и концепции 📚

Внимание — впереди спойлеры ⛔️

Ниже я разбиваю вопросы и объясняю свой мыслительный процесс. Я также предлагаю решения. Однако настоятельно рекомендую сначала решить проблему. Лучшая часть задачи — это удивление и удовлетворение от решения неуловимой проблемы.

Я обсуждал не публиковать решения, а просто объяснять основные концепции. Тем не менее, частью кодирования является изучение того, как устранять неполадки и точно определять, где код дает сбой. Поэтому я решил опубликовать решения, чтобы, если вы застряли, вы могли видеть, где именно ваша логика расходится.

Уровень 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].