Не так давно компания MixBytes проводила конкурс, пройдя который можно было попасть на их курс аудитора смарт-контрактовЗдесь публикую свой разбор этого теста Я не профи в питоне. Поэтому изначально полез гуглить что вообще тут за функции. Первое, что бросается в глаза: random.seed() при одинаковом параметре будет возвращать одинаковый результат. Тут есть 2 подхода как найти решение: понять код самостоятельно или прогнать в компиляторе\интерпретаторе. Начну с самостоятельного понимания.Почитав про range и random в питоне, становится ясно: последняя строчка генерирует результат в диапазоне от 0 до (1e12)-1. Т.е всего 1e12 вариантов Кто не понял что такое 1e12 - это тоже вполне гуглится Честно говоря, давно с формулами теории вероятности дело не имел. Могу предположить, что дальнейшее повествование приведёт к правильному ответу основываясь на неверных вычислениях: как в примере со сломанными часами, которые 2-жды в сутки показывают правильное время. Если где-то ошибся - надеюсь, читатели поправят.Для полноты картины полезно было бы почитать про расчёт вероятности зависимых и независимых событий... Но, можно рассуждать по-другому.Вероятность p выпадения любого числа в выше названном промежутке = 1/1e12С учётом фиксированного random.seed(), вероятность 10 раз получить одинаковое число (не важно какое именно) = 100% (т.е. 1) Итого: p = 1/1e12 * 1 = 1/1e12 Если хочется считать через зависимые\независимые события, то можно понять, что с зафиксированным random.seed() события нельзя считать зависимыми: на любом шаге будет выпадать то же число (с вероятностью 1/1e12), что и на любом другом шаге. Т.е. одна и та же вероятность на каждом шаге 1/1e12 складывается 10 раз и делится на количество вызовов (10) Т.е. формула:  Т.е. итог: 1/1e12 С использованием онлайн интерпретатора (гуглятся и находятся несколько разных без проблем) ещё интересней.Чтоб поиграться с кодом, чутка переделаем его в: При попытке его запуска получим ошибку:** Process exited due to resource limitations ** Но, играя со степенями 1e можно заметить закономерность: 1e1 = 61e2 = 531e3 = 4261e4 = 6825 И т.д. Значения всегда только увеличиваются. Из этого вывод: если бы код работал при 1e12 вероятность была бы = 0. Итого: у задачи фактически 2 ответа, смотря с какой стороны подходить к решению: 1/1e12 и 0 Как выяснилось, любой из этих 2-х ответов засчитывался.   На мой взгляд, самое простое задание. Настолько простое, что даже не знаю: что тут объяснять... sqrt() - функция квадратного корня. ^ - возведение в степень.Самостоятельно написав код по формуле я увидел, что ответ будет - первый вариант. Строго соблюдая ту же последовательность вычислений, что в формуле.   unsigned - без знаковое. Значит, при вычислениях отбрасываем значения после запятой. Итого: 4 вариант   На эту задачу я изначально неверно ответил. Но, ход мыслей был верный. 26 букв одного регистра. Значит, верхнего и нижнего регистра 26 *2 = 52. Добавим цифры (0...9). Всего 62Теперь посмотрим на эти 2 строчки: 12345678yo Сколько различных комбинаций, где yo будет на разных местах? Двигая yo можно увидеть, что их 7. Если из 8 символов нужно перебрать оставшиеся 6 (т.к. yo - это 2 символа) - получим: Учитывая, вышесказанное про 7 различных позиций yo в строке из 8 символов получим: Т.е. это 5 вариант - как раз мной выбранный. Но, тут ошибка. Верным считался ответ - 6 вариант: Дело в том, что если перебрали 62^6*7-1 и хеш не совпал, то последний должен совпасть автоматически и его не нужно для этого считать. Были ещё высказаны верные замечания различными участниками, что задачка всё равно не однозначная. Допустим, если на 1-м шаге перебраны все значения yo******, то на 3-м (**yo****) не нужно считать вариант yoyo****, т.к. он уже был на 1-м шаге. Авторы теста согласились, что это в логике задачи не учитывалось.   Начнём считать все варианты функции начиная с 0 Итого: ответ - 2 вариант   Сама задача не вызвала вопросов. А вот понять ответы сходу было проблемно. Ясно было одно: ответы смотреть нужно из вариантов: 5-7. Т.к. по условиям даже одна строка не факт, что поместится в память. Значит, в память загружать блоками, которые точно влезут в память. И важно прочесть условие задачи: найти наибольшее число строк, идущих подряд. А не все одинаковые строки без разбора на какой позиции Итеративный хеш на примере простой строки: 12345\nПусть блок N = 1Считаем хеш от 1: h1 = h(1)Следующий хеш: h2 = (h(1)+'2')Последний хеш: h6 = (h(5)+'\n')h6 будет уникальным хешем для строки, который получили итеративно. Если строка повторилась Х раз - значит, Х раз будет повторяться хеш h6. Считаем Х - максимальным числом (т.е. счётчиком повторений), пока не найдётся ситуация, где итеративный хеш для строки повторится Y раз, где Y > Х . В этом случае запишем Y. И т.д. По этому описанию подходит 7 вариант   Сначала стоит разобраться с APR и APY. Сейчас я не могу найти хорошей статьи, которую нашёл в процессе решения задачи. Но, помню, что APY - это сложные проценты. Т.е. как раз тот случай, когда можно накопленное за период (период для Коли - месяц, для Пети - день), перезакладывать на следующий период С калькулятором считать замучаешься. Набросав код на Solidity и проверив его в Remix для относительно больших чисел (например, 10000000000). Получим 4-й вариант.   С этим я провозился больше всего. Пришёл 1 нормальный вариант: в стартовом вагоне включить свет, в любую сторону идти до вагона, где свет включен, выключить его и проверить выключился ли в стартовом (т.е. возвращаться, запоминая сколько вагонов прошёл). Повторять процедуру пока в стартовом свет не погаснет.  Авторы задания признали его неверным  специалист по безопасности распределённых реестров