All streams
Search
Write a publication
Pull to refresh
-28
@longclapsread⁠-⁠only

User

Send message

Такие загадки проще придумывать, чем разгадывать. Идешь по списку функций, что там у нас? Пусть будет

mapIndexed { index, value → index + value}

Что там в итоге? 29 – замечательно, в жизни бы бы не подумал, беру!

Справедливости ради, стандартная библиотека kotlin классная, и такие посты – отличная профилактика от велосипедостроения.

Если попытаться передать функции 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? так это - номер строки!), второе число - номер столбца, взятый с положительным знаком для четных строк и с отрицательным - для нечетных. Кортежи можно сравнивать, как сравнивают строки, т.е. посимвольно. Список сравнимых значений можно отсортировать. В отсортированные ячейки можно вписать числа по возрастанию.

Очень удобная фишка, она есть на всех прогрессивных дальномерках, но до
этого я игрался только с советскими аппаратами — там такого не встречалось.

Встречалось.

https://ru.wikipedia.org/wiki/Ленинград_(фотоаппарат)

За это время освежил знания алгоритмов, сортировок, поиска и вёрстки.

Курица - не птица, сортировка - не алгоритм. Шлю пламенный привет безымянному копирайтеру.

не все идеально и есть к чему стремиться

Монофонический гробик весом 14 кг с полосой частот тракта записи/воспроизведения 40..14000гц на 19й скорости и встроеными динамиками с полосой не лучше 100-10000гц безусловно неидеален. Не говоря уже о шумах, коэффициенте детонации лентопротяжного тракта и прочем - в те времена это даже не упоминалось в описании.

Но, признаем, стремиться тут не к чему.

Оч. хорошо во всех отношениях, кроме скорости (за неё копья ломаем). Хуже того: можно оставить внутренний цикл, а внешние заменить на вот это вот - и всё равно будет ощутимый проигрыш, по крайней мере на моём компе. Должно быть, что-то не помещается в какие-то кэши.

Парсинг, логгинг, мультипроцессинг - код обмазан всем этим, как корпоративная версия FizzBuzz.

Вот простенький однопоточний чисто питоний скрипт, который иллюстрирует, как это можно делать быстро.

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() и конкатенировать строки - это азы

не надо внутри цикла вызывать простенькую функцию, если её можно заинлайнить, вызов функции в питоне - довольно дорогостоящая операция

Инженеры Halten за работой

Как там ротор дивиргенции, вычисляется? Нешто китайцы напутали?

Энтузиаст опубликовал ...

Политкорректность творит чудеса: долбо*б оказался энтузиастом. Хорошо хоть не матерью Терезой.

Senior software лоховод. За 1 час Леонид даже не сомневайтесь...

С удовольствием бы послушал чем боке беззеркалки отличается от боке зеркалки

Чем может отличаться то, чего не существует, от того, что не существует? Облом вам, а не удовольствие: боке - это свойство, приписываемое объективу, конкретно - характер размытости изображения в зоне нерезкости.

Сама постановка вопроса - не слишком изящное приглашение к срачу.

У человека есть свобода воли. А от тварей - да - требуется сидеть тихо.

Python ... поддерживает ... объектно-ориентированное (прототипное) ... программирование

А мужики-то не знают.

...реализацию бинарного поиска на Python (позаимствованную из ответов со Stack Overflow)

По указанной ссылке приведены 6 (шесть прописью) реализаций бинарного поиска. Они неравноценны, почти все используют слайсы, что автоматом даёт сложность алгоритма О(N) по времени и О(N) по памяти. Нормальная реализация №5 по списку, О(logN) по времени и О(1) по памяти.

Судя по графику, автор мерял именно пятый вариант. А может, какой-нибудь десятый - он не потрудился это прояснить. А может, он высосал этот график из пальца. В этом, полагаю, и состоит его инженерный подход.

схемотехнически это перегруз внутри ОУ на полевиках во многих каскадах сразу

И что это значит? Ну вот этот схемотехнический перегруз - что он даёт? Я отвечу - ничего такого, что бы отличалось от обычного ограничения сигнала в выходном каскаде усиления напряжения (обычно в ОУ таких каскадов два - дифференциальный входной и обычный, напр. по схеме с общим эмиттером, выходной).

Чем повторять за радиолюбителями описания их звуковых галлюцинаций, попробуйте для начала разобрать схему этого прибора - это не рокет саенс. И не ведитесь на булшит вроде "На ОУ IC3 собран спикерсимулятор (те самые алгоритмы эмуляции SansAmp) - это обычный ФНЧ четвёртого порядка.

На проверку в статье 4 совета. От себя добавлю пятый, для автора: не привирай.

Information

Rating
Does not participate
Registered
Activity