Если попытаться передать функции random.choice(seq) неиндексируемую последовательность, например — словарь, множество или значение числового типа — возникнет ошибка.
Ошибкой было назвать словарь неиндексируемой последовательностью. Да возникнет она не у только лишь всех )
from random import choice
d = {i: i * i for i in range(10)}
print(choice(d)) # всё пучком
from math import atan2
def draw(title, n, m, f):
y0, x0 = (n - 1) / 2, (m - 1) / 2 # нужен центр
print(f"\n{title:-^{m * 3 - 1}}")
res = [0] * (n * m)
for i, j in enumerate(sorted(range(n * m),
key=lambda i: f(i // m - y0, i % m - x0))):
res[j] = f"{i:>02}"
for i in range(0, n * m, m):
print(*res[i:i + m])
f = lambda y, x: (max(abs(y), abs(x)), atan2(x, y))
# высота и ширина матрицы должны быть одной четности,
# или центр нужно сдвинуть - для изотропности
draw("spiral", 4, 6, f)
draw("spiral", 5, 5, f)
Не стоит приписывать мне намерения, которых я не выказывал. Я не собирался тягаться с автором трактата в решении придуманой им же задачи, а пожелай я этого – оставил бы комент к его посту с посылом “вот то же самое, только лучше”. Но нет, я создал отдельный пост и назвал его “змейкой здорового человека”.
Авторская задача педантская и заведомо разрешимая, техническая. Я бы заниматься таким по своей воле не стал, разве что по нужде.
А вот для задачи заполнить-отрисовать матрицу я придумал решение с идеей. Да, прямолинейное О(1)*N заведомо её бьёт (там, где оно достижимо) – но она плодотворнее тупого бухгалтерского решения, она естественным образом обобщается, вот я ею и поделился.
Смотрите: я сортирую клетки, приписывая им относительный вес в сравнении с соседями, не парясь о соответствии веса клетки и вписываемого в неё в итоге числа. Я не запариваюсь в поиске границ и точек поворота – те моменты, где ошибиться особенно легко. Задача упрощается до уровня неопытного новичка.
Но не для вашего понимания. У вас взгляд замылился, вы смотрите на код и видите в нём NlogN, а идею не замечаете.
Прицепом обращусь к@amarao– такова уж моя карма. Спасибо что заглянули, спасибо за контрпример, спасибо за напутствие. Числа ваши мне очень понравились, где такие берёте? Пешите ещо, здесь без вас грустно.
В алгоритме ничего сложного: каждой ячейке ставим в соответствие такой ключ, чтобы, будучи отсортированы по ключам, ячейки заполнялись бы в нужном порядке.
Вот это самое и происходит: для каждой ячейки вычисляем ключ, двузначный кортеж, для первой змейки первое число кортежа - номер строки, y (вы там заметили y? так это - номер строки!), второе число - номер столбца, взятый с положительным знаком для четных строк и с отрицательным - для нечетных. Кортежи можно сравнивать, как сравнивают строки, т.е. посимвольно. Список сравнимых значений можно отсортировать. В отсортированные ячейки можно вписать числа по возрастанию.
Монофонический гробик весом 14 кг с полосой частот тракта записи/воспроизведения 40..14000гц на 19й скорости и встроеными динамиками с полосой не лучше 100-10000гц безусловно неидеален. Не говоря уже о шумах, коэффициенте детонации лентопротяжного тракта и прочем - в те времена это даже не упоминалось в описании.
Оч. хорошо во всех отношениях, кроме скорости (за неё копья ломаем). Хуже того: можно оставить внутренний цикл, а внешние заменить на вот это вот - и всё равно будет ощутимый проигрыш, по крайней мере на моём компе. Должно быть, что-то не помещается в какие-то кэши.
Вот простенький однопоточний чисто питоний скрипт, который иллюстрирует, как это можно делать быстро.
from string import digits, ascii_letters, punctuation
from hashlib import sha256
from random import shuffle
from time import time
def helper(data, chars):
for data[-4] in chars:
for data[-3] in chars:
for data[-2] in chars:
for data[-1] in chars:
if sha256(data).hexdigest().startswith("000000"):
cnt = 0
for i in range(-4, 0):
cnt = cnt * len(chars) + chars.index(data[i])
return data, cnt
return "Не шмогла!".encode(), len(chars) ** 4
data = bytearray(("Начальное значение!" + "1234").encode())
chars = list((digits + ascii_letters + punctuation).encode())
shuffle(chars)
t = time()
data, cnt = helper(data, chars)
t = time() - t
print(f"'{data.decode()}'\n'{sha256(data).hexdigest()}'")
print(f"время: {t:5.3f}, hashrate: {cnt / t / 1e3:5.3f} kH/s")
Пояснения:
да, длина суффикса и длина лидирующего цуга нулей захардкожена
я ограничился подбором 6, а не 8 лидирующих нолей - времени жалко )
shuffle(chars) здесь для того, чтоб не казалось, что это чит, т.е. подобраные значения для быстрого выхлопа
не надо каждый раз внутри цикла делать .encode() и конкатенировать строки - это азы
не надо внутри цикла вызывать простенькую функцию, если её можно заинлайнить, вызов функции в питоне - довольно дорогостоящая операция
С удовольствием бы послушал чем боке беззеркалки отличается от боке зеркалки
Чем может отличаться то, чего не существует, от того, что не существует? Облом вам, а не удовольствие: боке - это свойство, приписываемое объективу, конкретно - характер размытости изображения в зоне нерезкости.
Сама постановка вопроса - не слишком изящное приглашение к срачу.
По указанной ссылке приведены 6 (шесть прописью) реализаций бинарного поиска. Они неравноценны, почти все используют слайсы, что автоматом даёт сложность алгоритма О(N) по времени и О(N) по памяти. Нормальная реализация №5 по списку, О(logN) по времени и О(1) по памяти.
Судя по графику, автор мерял именно пятый вариант. А может, какой-нибудь десятый - он не потрудился это прояснить. А может, он высосал этот график из пальца. В этом, полагаю, и состоит его инженерный подход.
схемотехнически это перегруз внутри ОУ на полевиках во многих каскадах сразу
И что это значит? Ну вот этот схемотехнический перегруз - что он даёт? Я отвечу - ничего такого, что бы отличалось от обычного ограничения сигнала в выходном каскаде усиления напряжения (обычно в ОУ таких каскадов два - дифференциальный входной и обычный, напр. по схеме с общим эмиттером, выходной).
Чем повторять за радиолюбителями описания их звуковых галлюцинаций, попробуйте для начала разобрать схему этого прибора - это не рокет саенс. И не ведитесь на булшит вроде "На ОУ IC3 собран спикерсимулятор (те самые алгоритмы эмуляции SansAmp) - это обычный ФНЧ четвёртого порядка.
Такие загадки проще придумывать, чем разгадывать. Идешь по списку функций, что там у нас? Пусть будет
mapIndexed { index, value → index + value}
Что там в итоге? 29 – замечательно, в жизни бы бы не подумал, беру!
Справедливости ради, стандартная библиотека kotlin классная, и такие посты – отличная профилактика от велосипедостроения.
�
Ошибкой было назвать словарь неиндексируемой последовательностью. Да возникнет она не у только лишь всех )
Покончим с этим разговором.
Не стоит приписывать мне намерения, которых я не выказывал. Я не собирался тягаться с автором трактата в решении придуманой им же задачи, а пожелай я этого – оставил бы комент к его посту с посылом “вот то же самое, только лучше”. Но нет, я создал отдельный пост и назвал его “змейкой здорового человека”.
Авторская задача педантская и заведомо разрешимая, техническая. Я бы заниматься таким по своей воле не стал, разве что по нужде.
А вот для задачи заполнить-отрисовать матрицу я придумал решение с идеей. Да, прямолинейное О(1)*N заведомо её бьёт (там, где оно достижимо) – но она плодотворнее тупого бухгалтерского решения, она естественным образом обобщается, вот я ею и поделился.
Смотрите: я сортирую клетки, приписывая им относительный вес в сравнении с соседями, не парясь о соответствии веса клетки и вписываемого в неё в итоге числа. Я не запариваюсь в поиске границ и точек поворота – те моменты, где ошибиться особенно легко. Задача упрощается до уровня неопытного новичка.
Но не для вашего понимания. У вас взгляд замылился, вы смотрите на код и видите в нём NlogN, а идею не замечаете.
Прицепом обращусь к@amarao– такова уж моя карма. Спасибо что заглянули, спасибо за контрпример, спасибо за напутствие. Числа ваши мне очень понравились, где такие берёте? Пешите ещо, здесь без вас грустно.
Вот это самое и происходит: для каждой ячейки вычисляем ключ, двузначный кортеж, для первой змейки первое число кортежа - номер строки, y (вы там заметили y? так это - номер строки!), второе число - номер столбца, взятый с положительным знаком для четных строк и с отрицательным - для нечетных. Кортежи можно сравнивать, как сравнивают строки, т.е. посимвольно. Список сравнимых значений можно отсортировать. В отсортированные ячейки можно вписать числа по возрастанию.
Встречалось.
https://ru.wikipedia.org/wiki/Ленинград_(фотоаппарат)
Курица - не птица, сортировка - не алгоритм. Шлю пламенный привет безымянному копирайтеру.
Монофонический гробик весом 14 кг с полосой частот тракта записи/воспроизведения 40..14000гц на 19й скорости и встроеными динамиками с полосой не лучше 100-10000гц безусловно неидеален. Не говоря уже о шумах, коэффициенте детонации лентопротяжного тракта и прочем - в те времена это даже не упоминалось в описании.
Но, признаем, стремиться тут не к чему.
Оч. хорошо во всех отношениях, кроме скорости (за неё копья ломаем). Хуже того: можно оставить внутренний цикл, а внешние заменить на вот это вот - и всё равно будет ощутимый проигрыш, по крайней мере на моём компе. Должно быть, что-то не помещается в какие-то кэши.
Парсинг, логгинг, мультипроцессинг - код обмазан всем этим, как корпоративная версия FizzBuzz.
Вот простенький однопоточний чисто питоний скрипт, который иллюстрирует, как это можно делать быстро.
Пояснения:
да, длина суффикса и длина лидирующего цуга нулей захардкожена
я ограничился подбором 6, а не 8 лидирующих нолей - времени жалко )
shuffle(chars) здесь для того, чтоб не казалось, что это чит, т.е. подобраные значения для быстрого выхлопа
не надо каждый раз внутри цикла делать .encode() и конкатенировать строки - это азы
не надо внутри цикла вызывать простенькую функцию, если её можно заинлайнить, вызов функции в питоне - довольно дорогостоящая операция
Как там ротор дивиргенции, вычисляется? Нешто китайцы напутали?
Политкорректность творит чудеса: долбо*б оказался энтузиастом. Хорошо хоть не матерью Терезой.
Senior software лоховод. За 1 час Леонид даже не сомневайтесь...
Чем может отличаться то, чего не существует, от того, что не существует? Облом вам, а не удовольствие: боке - это свойство, приписываемое объективу, конкретно - характер размытости изображения в зоне нерезкости.
Сама постановка вопроса - не слишком изящное приглашение к срачу.
У человека есть свобода воли. А от тварей - да - требуется сидеть тихо.
Вот вам лучшее из обоих ипостасей.
А мужики-то не знают.
По указанной ссылке приведены 6 (шесть прописью) реализаций бинарного поиска. Они неравноценны, почти все используют слайсы, что автоматом даёт сложность алгоритма О(N) по времени и О(N) по памяти. Нормальная реализация №5 по списку, О(logN) по времени и О(1) по памяти.
Судя по графику, автор мерял именно пятый вариант. А может, какой-нибудь десятый - он не потрудился это прояснить. А может, он высосал этот график из пальца. В этом, полагаю, и состоит его инженерный подход.
И что это значит? Ну вот этот схемотехнический перегруз - что он даёт? Я отвечу - ничего такого, что бы отличалось от обычного ограничения сигнала в выходном каскаде усиления напряжения (обычно в ОУ таких каскадов два - дифференциальный входной и обычный, напр. по схеме с общим эмиттером, выходной).
Чем повторять за радиолюбителями описания их звуковых галлюцинаций, попробуйте для начала разобрать схему этого прибора - это не рокет саенс. И не ведитесь на булшит вроде "На ОУ IC3 собран спикерсимулятор (те самые алгоритмы эмуляции SansAmp) - это обычный ФНЧ четвёртого порядка.
На проверку в статье 4 совета. От себя добавлю пятый, для автора: не привирай.