John
Ах, да, ceil(log2(k))
Юра (Юрий Александрович)
Вот... и теперь нам нужен еще один алгоритм - это разделение произвольного диапазона на диапазоны, состоящие из степеней двоек.
John
Илья
жесть...
Илья
жду статью вашего решения на хабре
John
У меня неделя закичилась, сижу выдыхаю с «чаем»
John
Юра (Юрий Александрович)
John
Получиться что будет арифметическая прогрессия
Vladislav
John
0,1,2,3,4
Vladislav
как я и говорил, методы динамического программирования рулят
John
John
Перебор?
Yura
Слишком быстро для перебора
John
Vladislav
Какой алгоритм?
как я и говорил, для степеней двойки работает редукция
Vladislav
ща
John
Vladislav
например
Vladislav
сумма единиц до 256 равна сумме единиц до 128 умножить на два плюс 128
Vladislav
то есть кейс от 0 до 2^n покрыть легко такой рекурсией
Vladislav
ну а далее те числа, которые не являются степенями двойки разматываем по разрядам
John
Vladislav
могу текст кинуть кому в личку если надо
Юра (Юрий Александрович)
Vladislav
до - не включая верхний конец
Null
godoc не умеет в генерики. хнык хнык :(
https://pkg.go.dev/codeberg.org/lig/wsq/pkg/wsq
тут полно генерик интерфейсов, а этого никак не видно :(
Vladislav
соответственно, для сумм от 0 до произвольного числа это будет:
half := msb(x)
return countForPowerOfTwo(half) + 1 + (x - half) + countUpTo(x - half)
Илья
а можно весь код?
Vladislav
ща
Vladislav
пожалуйста https://gist.github.com/Snawoot/0ab961156da20b6ef3822fa187538b10
Vladislav
msb - возвращает число-степень двойки, которая не превосходит x
Юра (Юрий Александрович)
А можно еще одно решение, я только что придумал:
Смотрите, в первом столбце единицы с нулями чередуются через 1. Во втором столбце - через 2, в третьем через 4 - и т.д.
Нужно просто в этой таблице "вырезать" кусок, заданный нашим диапазоном, и посчитать, сколько в него влезло единиц из каждого столбца. Результаты сложить.
John
Vladislav
https://www.codewars.com/kata/596d34df24a04ee1e3000a25
Vladislav
Юра (Юрий Александрович)
Есть решение без рекурсии.
Обратите внимание, что в желтом столбце любой отрезок длины 2 будет содержать 1 единицу.
А в зеленом столбце любой отрезок длины 4 будет содержать 2 единицы.
в светло-голубом столбце любой отрезок длины 8 будет содержать 4 единицы. и т.д.
И только для отрезков некратной длины нужно будет найти длину "хвостика" сверху и снизу (один из хвостиков может быть нулевым) и вычесть те единицы, которые в него входят.
Илья
то есть постоянно идет деление/умножение на два, достаточно просто вывести формулу? то
Юра (Юрий Александрович)
Все. Уже хочется спать, завтра додумаю, если еще что-то останется.
Rimma
Hello ! We are a Quantum company looking for a golang developer. Interested in your profile! If you are looking for a job, write in private messages.
Vladislav
Rimma
Of course you can block, since none of you are looking for work
Vladislav
Anonymous
А зачем?
Vladislav
А зачем?
чтобы не ссали в глаза
Anonymous
Anonymous
Аче
Anonymous
Пусть будет
Rimma
чтобы не ссали в глаза
Молодой человек,с таким отношением вы будете слишком долго искать работу,если хамить в открытую всем)
Илья
Vladislav
Vladislav
а вот что за компанию вы представляете, если разговор начинаете с лжи - вопрос открытый
Rimma
innit?
Что за прикок, бан за вакансию?
Илья
@Hover2 как там с задачей?
Юра (Юрий Александрович)
Привет всем. У меня готово словесное описание алгоритма вчерашней задачи с подсчетом количества единиц в бинарной записи всех чисел в диапазоне.
Из чего исходим:
Если записывать последовательные двоичные числа в столбик, то можно обнаружить, что последовательность нулей и единиц в каждом столбце является периодической. Причем в каждом периоде первая половина - нули, а вторая половина - единицы.
Пронумеруем столбцы справа налево, начиная с 1. Тогда длина периода каждого столбца равняется 2^n, где n - номер столбца. Количество единиц в каждом периоде 2^(n-1)
Наш диапазон чисел - это всегда диапазон смежных строк.
Этот диапазон по отношению к каждому столбцу может располагаться одним из образов:
1) диапазон может полностью находиться внутри одного периода столбца
2) Диапазон может находиться более, чем в одном периоде.
Рассмотрим сначала второй случай (т.к. он проще).
Если наш диапазон захватывает более, чем 1 период, то диапазон состоит из 3 частей:
1) "тела" диапазона, состоящего из целого числа полных периодов.
2) "нижнего хвостика", находящегося до тела, длина хвостика меньше, чем 2^n (т.к. если бы была больше, то было бы больше тело)
3) "верхнего хвостика", находящегося после тела. длина хвостика меньше, чем 2^n (т.к. если бы была больше, то было бы больше тело)
Количество единиц в "теле" диапазона считается по формуле k*2^(n-1), где n - номер столбца, k - количество полных периодов, помещающихся в хвостик.
Количество единиц в "нижнем хвостике" считаем так: если длина хвостика больше, половины периода, то единиц в хвосте - половина периода, если меньше - то длина хвоста.
Количество единиц в "верхнем хвостике" считаем так: если длина хвостика меньше=, чем полпериода, то единиц ноль, если больше половины периода, то длина хвостика минус половина периода.
Vladislav
Привет всем. У меня готово словесное описание алгоритма вчерашней задачи с подсчетом количества единиц в бинарной записи всех чисел в диапазоне.
Из чего исходим:
Если записывать последовательные двоичные числа в столбик, то можно обнаружить, что последовательность нулей и единиц в каждом столбце является периодической. Причем в каждом периоде первая половина - нули, а вторая половина - единицы.
Пронумеруем столбцы справа налево, начиная с 1. Тогда длина периода каждого столбца равняется 2^n, где n - номер столбца. Количество единиц в каждом периоде 2^(n-1)
Наш диапазон чисел - это всегда диапазон смежных строк.
Этот диапазон по отношению к каждому столбцу может располагаться одним из образов:
1) диапазон может полностью находиться внутри одного периода столбца
2) Диапазон может находиться более, чем в одном периоде.
Рассмотрим сначала второй случай (т.к. он проще).
Если наш диапазон захватывает более, чем 1 период, то диапазон состоит из 3 частей:
1) "тела" диапазона, состоящего из целого числа полных периодов.
2) "нижнего хвостика", находящегося до тела, длина хвостика меньше, чем 2^n (т.к. если бы была больше, то было бы больше тело)
3) "верхнего хвостика", находящегося после тела. длина хвостика меньше, чем 2^n (т.к. если бы была больше, то было бы больше тело)
Количество единиц в "теле" диапазона считается по формуле k*2^(n-1), где n - номер столбца, k - количество полных периодов, помещающихся в хвостик.
Количество единиц в "нижнем хвостике" считаем так: если длина хвостика больше, половины периода, то единиц в хвосте - половина периода, если меньше - то длина хвоста.
Количество единиц в "верхнем хвостике" считаем так: если длина хвостика меньше=, чем полпериода, то единиц ноль, если больше половины периода, то длина хвостика минус половина периода.
слова не компилируются. как говорит торвальдс "talks are cheap, show me the code".
Юра (Юрий Александрович)
Теперь рассмотрим первый случай, когда диапазон находится полностью внутри одного периода. Тут 3 случая:
1) Диапазон находится полностью в нижней половине периода (там, где нули)
2) диапазон находится полностью в верхней половине периода (там, где единицы)
3) диапазон захватывает и верхнюю и нижнюю часть полупериода.
Юра (Юрий Александрович)
Когда вместо обмена ценными мыслями люди в IRC швыряли друг другу "send patch or shut up"
Vladislav
Юра (Юрий Александрович)
По сравнению с самим собой, но без этого подхода.
Evgeny
Привет всем. У меня готово словесное описание алгоритма вчерашней задачи с подсчетом количества единиц в бинарной записи всех чисел в диапазоне.
Из чего исходим:
Если записывать последовательные двоичные числа в столбик, то можно обнаружить, что последовательность нулей и единиц в каждом столбце является периодической. Причем в каждом периоде первая половина - нули, а вторая половина - единицы.
Пронумеруем столбцы справа налево, начиная с 1. Тогда длина периода каждого столбца равняется 2^n, где n - номер столбца. Количество единиц в каждом периоде 2^(n-1)
Наш диапазон чисел - это всегда диапазон смежных строк.
Этот диапазон по отношению к каждому столбцу может располагаться одним из образов:
1) диапазон может полностью находиться внутри одного периода столбца
2) Диапазон может находиться более, чем в одном периоде.
Рассмотрим сначала второй случай (т.к. он проще).
Если наш диапазон захватывает более, чем 1 период, то диапазон состоит из 3 частей:
1) "тела" диапазона, состоящего из целого числа полных периодов.
2) "нижнего хвостика", находящегося до тела, длина хвостика меньше, чем 2^n (т.к. если бы была больше, то было бы больше тело)
3) "верхнего хвостика", находящегося после тела. длина хвостика меньше, чем 2^n (т.к. если бы была больше, то было бы больше тело)
Количество единиц в "теле" диапазона считается по формуле k*2^(n-1), где n - номер столбца, k - количество полных периодов, помещающихся в хвостик.
Количество единиц в "нижнем хвостике" считаем так: если длина хвостика больше, половины периода, то единиц в хвосте - половина периода, если меньше - то длина хвоста.
Количество единиц в "верхнем хвостике" считаем так: если длина хвостика меньше=, чем полпериода, то единиц ноль, если больше половины периода, то длина хвостика минус половина периода.
господи, как мне найти работу, где нужно будет считать биты в числах
Evgeny
как же я заебался со всеми этими куберами, апи гейтвеями и сервис мешами
Evgeny
я просто хочу хоть раз написать код с требуемой алгоритмической сложностью
Archee
Evgeny
в том смысле что единственный способ, которым может зарабатывать хороший талантливый танцор - это преподавание танцев)
Archee
Evgeny
Юра (Юрий Александрович)
Олимпиадные задачки - это умение делать то, что скорее всего никогда не потребуется. Это обеспечивает готовность сделать требуемое.
Юра (Юрий Александрович)
Alexander
Рик
Привет всем. У меня готово словесное описание алгоритма вчерашней задачи с подсчетом количества единиц в бинарной записи всех чисел в диапазоне.
Из чего исходим:
Если записывать последовательные двоичные числа в столбик, то можно обнаружить, что последовательность нулей и единиц в каждом столбце является периодической. Причем в каждом периоде первая половина - нули, а вторая половина - единицы.
Пронумеруем столбцы справа налево, начиная с 1. Тогда длина периода каждого столбца равняется 2^n, где n - номер столбца. Количество единиц в каждом периоде 2^(n-1)
Наш диапазон чисел - это всегда диапазон смежных строк.
Этот диапазон по отношению к каждому столбцу может располагаться одним из образов:
1) диапазон может полностью находиться внутри одного периода столбца
2) Диапазон может находиться более, чем в одном периоде.
Рассмотрим сначала второй случай (т.к. он проще).
Если наш диапазон захватывает более, чем 1 период, то диапазон состоит из 3 частей:
1) "тела" диапазона, состоящего из целого числа полных периодов.
2) "нижнего хвостика", находящегося до тела, длина хвостика меньше, чем 2^n (т.к. если бы была больше, то было бы больше тело)
3) "верхнего хвостика", находящегося после тела. длина хвостика меньше, чем 2^n (т.к. если бы была больше, то было бы больше тело)
Количество единиц в "теле" диапазона считается по формуле k*2^(n-1), где n - номер столбца, k - количество полных периодов, помещающихся в хвостик.
Количество единиц в "нижнем хвостике" считаем так: если длина хвостика больше, половины периода, то единиц в хвосте - половина периода, если меньше - то длина хвоста.
Количество единиц в "верхнем хвостике" считаем так: если длина хвостика меньше=, чем полпериода, то единиц ноль, если больше половины периода, то длина хвостика минус половина периода.
А что за задача? Можете переслать сообщение?
Юра (Юрий Александрович)
Рик