Рубрики
Без рубрики

HackerRank: Круговое вращение массива в Python

Как я решил свою ежедневную рекомендуемую проблему HackerRank challenge и небольшую тираду о специфике проблемы

Автор оригинала: Mike Bell.

Итак, я нахожусь на HackerRank, и ПРЕДУПРЕЖДЕНИЕ о СПОЙЛЕРЕ

Итак, я нахожусь на HackerRank, и || ПРЕДУПРЕЖДЕНИЕ о СПОЙЛЕРЕ

Это заняло у меня около пяти минут.

На самом деле речь идет не о том, как я решил проблему, хотя я вкратце расскажу об этом.

На самом деле речь идет не о том, как я решил проблему, хотя я вкратце расскажу об этом.

Я спросил себя/google “python array shift right”, и мне напомнили, что коллекции и deque существуют. Я уже пользовался ими раньше. В Python так много классных инструментов, о которых я все время забываю. Вы не можете наказывать кого-то за то, что он не помнит все до единой вещи.

def circularArrayRotation(a, k, queries):
    from collections import deque 
    items = deque(a) 
    items.rotate(k)
    ret_list = []
    for q in queries:
        #print(items[q])
        ret_list.append(items[q])
    return ret_list

Теперь кое-что интересное, что вы заметите, это то, что я прокомментировал оператор печати в цикле.

Когда я впервые написал эту функцию, она выглядела так:

def circularArrayRotation(a, k, queries):
    from collections import deque 
    items = deque(a) 
    items.rotate(k)
    ret_list = []
    for q in queries:
        print(items[q])

Так вот, это именно то, к чему призывало описание проблемы.

“Для каждого запроса выведите значение элемента в индексе повернутого массива в новой строке.”

Я думал, что сделал это, но потом компилятор/тестер HackerRank ошибся:

Compiler Message
Runtime Error
Error (stderr)
Traceback (most recent call last):
  File "Solution.py", line 42, in 
    fptr.write('\n'.join(map(str, result)))
TypeError: 'NoneType' object is not iterable
Input (stdin)
3 2 3
1 2 3
0
1
2

Итак, я иду “Хммм…” и проверяю главный:

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    nkq = input().split()

    n = int(nkq[0])

    k = int(nkq[1])

    q = int(nkq[2])

    a = list(map(int, input().rstrip().split()))

    queries = []

    for _ in range(q):
        queries_item = int(input())
        queries.append(queries_item)

    result = circularArrayRotation(a, k, queries)

    fptr.write('\n'.join(map(str, result)))
    fptr.write('\n')

    fptr.close()

Важная часть заключается в следующем:

result = circularArrayRotation(a, k, queries)

Похоже, они хотели вернуть значение! Ага! Тогда я понял, что сделал не так!

Видите ли, отладка проста

Итак, я прокомментировал инструкцию печати и построил список элементов для возврата с учетом параметров, и БАЦ! 100% на тестах.

Пару ночей назад я поднялся с ранга 900 000 до ранга 600 000 на HackerRank. Только что я поднялся до 544328.

Честно говоря, вся эта дискуссия поднимает вопрос, о котором я буду бушевать/писать в блоге в ближайшем будущем, если кто-то не сделает этого раньше меня, но в основном это касается философских различий между стилями развития олдшул и ньюшул.

Давным-давно у нас не было сверхбыстрого Интернета для поиска вещей, и разработчики должны были действительно знать все сверхэффективно или иметь возможность ссылаться на вещи в физических книгах.

Если я что-то и выучил в государственной школе, так это то, как пользоваться указателем книги и находить ответы на вопросы или решения проблем.

Это отличается, скажем, от разработки утилиты deque и rotate самостоятельно. Но Хакерранк не просил меня создавать его с нуля. Они просто просят вас решить проблему.

Является ли это обманом, чтобы иметь возможность искать вещи? Действительно ли вы программист, если полагаетесь на готовые инструменты?

Я думаю: как только у вас появится возможность создавать инструменты самостоятельно, вы получите зеленый свет для использования готовых инструментов. Часто проблема для меня заключается в том, “какие инструменты использовать?”, Но до сих пор Python был именно таким.

И, ну, технически, Google тоже.