Итак, я нахожусь на 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, infptr.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 тоже.