Как стать автором
Обновить

Комментарии 22

Режим зануды:
В последнем примере кода если адрес уже есть в списке плохих, то от него остаётся счётчик, который уйдёт в отрицательные числа, и тогда при некоторых условиях число счётчиков превысит 1000.
print('\n'.join(current_ip for current_ip in sorted(bad_ips)))

Зачем так, можно же
print('\n'.join(sorted(bad_ips)))
В последнем примере кода если адрес уже есть в списке плохих, то от него остаётся счётчик, который уйдёт в отрицательные числа, и тогда при некоторых условиях число счётчиков превысит 1000.

Не понял момент про отрицательное значение счетчика. Когда адрес добавляется в список плохих, то его счетчик удаляется. Если этот адрес встречается дальше, ты мы его просто пропускаем.
Всё верно, после добавления ip в список плохих счётчик удаляется и далее пропускается, счётчик ip не увеличивается.
Однако ip попадает в очередь и позже удаляется из очереди, при этом счётчик ip всегда уменьшается (при уменьшении счётчик для ip тоже создаётся), дополнительной проверки oldest_ip in bad_ips там нету.

Задачи, конечно, элементарные… Высокую нагрузку, и следующую после неё, я решил буквально в одну строку

Какой был проходной балл? или сколько надо было решить для поступления?
И какие временные рамки?
В куче компаний если вы просто решите все это прямо на собеседовании — это будет сразу оффер на джуниор/мидл.

Блоки с решением лучше было бы не спойлерить и спрятать, имхо :) так сложнее знакомиться со статьёй

готово!

Решение первой задачи проще:


Counter(arr).most_common(1)
Это неверное решение. В условии задачи написано, что нужно вернуть наибольшее из чисел, которое чаще других встречается в массиве.
Для массива [1, 1, 2, 2] в вашем решении ответ будет 1. Правильный ответ — 2.
Если arr = [0, 0, 10, 10],
то Counter(arr).most_common(1) вернёт [(0, 2)] — число 0 встречается 2 раза,
а нужно вернуть 10, т.к. оно тоже встречается также 2 раза и больше 0.

Вот это решает проблему:


from collections import Counter
from operator import itemgetter

a = [0, 0, 10, 10]
counter = Counter(a)
result = max(counter.items(), key=itemgetter(1, 0))[0]
print(result)

Но оказалось, что решение в посте работает прилично быстрее.

а есть где примеры задач на senior. яп не важен

На позицию Senior уже не задачки на каком-то языке даются, а другое...

А мне нравятся задачи на аттестации преподавателей, забавные и оригинальные.
Вообще ребята-методисты в яндексе по питону клевые.

Спасибо за статью. А в чем состояла автоматизация проверки?

Вторая задача, строго говоря, O(1): находим корни характеристического уравнения последовательности, x^3-x^2-1=0 (обозначим x1, x2, x3 — у этого уравнения два из них комплексные) и подбираем коэффициенты A, B, C так, чтобы:
A + B + C = 0
A*x1 + B*x2 + C*x3 = 1
A*x1^2 + B*x2^2 + C*x3^2 = 2

После этого по формуле f(k) = A*x1^k + B*x2^k + C*x3^k можем посчитать любой элемент с заранее выбранной точностью, не используя рекуррентное соотношение.
Для решения любой задачи не требовалось каких-либо специальных знаний в смежных областях.
Путь в целом верный, но тяжёлый. Например,
x1 = 1/3 * (1 + (1/2 * (29 - 3 * sqrt(93)))^(1/3) + (1/2 * (29 + 3 * sqrt(93)))^(1/3)),
x2 = 1/3 - 1/6 * (1 - i * sqrt(3)) * (1/2 * (29 - 3 * sqrt(93)))^(1/3) - 1/6 * (1 + i * sqrt(3)) *(1/2 * (29 + 3 * sqrt(93)))^(1/3),
x3 = 1/3 - 1/6 * (1 + i * sqrt(3)) * (1/2 * (29 - 3 * sqrt(93)))^(1/3) - 1/6 * (1 - i * sqrt(3)) *(1/2 * (29 + 3 * sqrt(93)))^(1/3).

Далее,
A = (2 - x2 - x3)/(x2 - x1)/(x3 - x1),
B = (2 - x1 - x3)/(x1 - x2)/(x3 - x2),
C = (2 - x1 - x2)/(x1 - x3)/(x2 - x3).

Наконец, возведение чисел x1, x2, x3 в k-ю степень требует O(log(k)) времени.
Как в решении 1й задачи учтено ограничение на n-размерность массива?
Предлагаемый вариант решения разве можно считать 100% полным?
Вот в первой задаче нам нужно ввести n. Но введя этот код и проверив я не понял на что оно влияет, оно дальше даже не используется.

Так вот, вопрос такой, зачем в первой задаче число n если и без него работает
Ну это скорее всего плохие тесты от организаторов, раз приведённый пример кода решает задачу. Можно привести пример с n=1, после чего дать на вход три числа [1, 2, 2] — правильный ответ будет 1, так как дальше первого элемента работать не должно согласно условиям задачи
Входные данные всегда были корректными. Если n = 1, то в следующей строке ровно одно число.
Кодирование длин серий
Были участники, которые решили задачу с помощью регулярных выражений.

И правильно сделали, как мне кажется.


Сильно уж они все упрощают
import re

def decoded_rle_value_len(value):
    pairs = re.findall(r'(?P<letter>[A-Z])(?P<count>\d*)', value)
    return sum(int(pair[1]) if pair[1] else 1 for pair in pairs)

result = decoded_rle_value_len('A15BA5')
print(result)

С другой стороны, решение в статье более прямолинейное и его, возможно, проще осмыслить.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий