[JavaScript] Небольшая логическая задачка на IQ

12
slavegirl
На сайте с 25.06.2012
Offline
401
1224

Здравствуйте!

Помогите мне, пожалуйста, решить задание, над которым я уже бьюсь второй день без толку. Суть его следующая. Существует социальная сеть с 3 млн. пользователей. У каждого из них есть аватар. Я делаю скрипт, который будет отображать в специальной зоне один из этих аватаров, выбранный случайным образом. Правила для отбора аватара следующие:

1. Устанавливается верхняя и нижняя граница диапазона пользователей, среди которых нужно выбирать аватар (остальные нам не интересны). Например [от 3 млн ... до 1 млн]:

users_max = 3000000;

users_min = 1000000;

2. Получившийся диапазон в свою очередь разбивается на целое число блоков, которые будут поочередно участвовать в выборке. Например, размер каждого блока - 100 пользователей:

users_block_size = 100;

3. Каждые 5 минут блок по 100 пользователей сменяется следующим (по убыванию). И так по кругу внутри диапазона [от 3 млн ... до 1 млн]:

users_block_period = 300000; // указано в миллисекундах

Моё решение:

user_id = users_max - Math.floor(Date.now() / users_block_period) % Math.floor((users_max - users_min) / users_block_size) * users_block_size - Math.floor(Math.random() * users_block_size);

Другими словами, мы сначала определяем, сколько прошло 5-минуток с 1 января 1970 года с помощью функции Date.now(), далее получаем остаток от деления на количество блоков и определяем начало дежурного блока. Также работа скрипта жестко привязана к текущему времени. Если его запустить прямо сейчас (на момент написания этого предложения), случайные аватары начнут выбираться в блоке [2'258'300 ... 2'258'201].

--------------------

Далее нерешенный вопрос. В будущем параметры users_block_size и users_block_period будут изменяться, что в свою очередь повлечет за собой резкую смену расположения стартового блока. К примеру, скрипт работал несколько недель, спустился от 3'000'000 пользователей к 2'000'000, потом мы изменили параметры, и он резко перепрыгнул куда-то на 2'547'300 рубеж (еще раз на уже обработанных пользователей).

Хочу ввести еще 2 параметра:

start_time = 1430226525462; // текущее время запуска скрипта

resume_user_id = 2000000; // с этого пользователя мы возобновляем процесс

Но вот так и не придумала, как эти 2 параметра добавить в формулу (куда их "прикрутить"), поэтому прошу помощи. Всё, к чему сумела додуматься (неправильный вариант):

user_id = resume_user_id - Math.floor(Math.abs(Date.now() - start_time) / users_block_period) % Math.floor((users_max - users_min) / users_block_size) * users_block_size - Math.floor(Math.random() * users_block_size);

То есть, мне нужно всегда иметь возможность контролировать с какого пользователя возобновлять процесс работы скрипта. Буду благодарна за любые подсказки и советы!

С уважением,

Slavegirl

🌅 Фото с выпускного ––  https://t.me/Keep2Share/23767
ДП
На сайте с 23.11.2009
Offline
203
#1

Похоже не на задачку на IQ, а на тестовое задание в какую-нибудь из соцсетей.

Требований не вижу, задача в том, чтобы не повторялись аватарки? Иначе в чем проблема, что период и размер блока могут меняться?

Я бы вот сделал два отдельных скрипта - первый запускается раз в период и меняет по размеру блока номер, с которого начинается следующий блок - т.е. грубо говоря вычитает из текущего значения размер блока. Второй скрипт (может быть даже часть одного скрипта) - уже выбирает нужное количество пользователя.

При изменении периода и размера блока - у вас просто поменяется время запуска скрипта. Выбирать пользователей скрипт будет с прошлого номера и дальше.

slavegirl
На сайте с 25.06.2012
Offline
401
#2
Дикий пионер:
Требований не вижу, задача в том, чтобы не повторялись аватарки? Иначе в чем проблема, что период и размер блока могут меняться?

Аватарки в любом случае будут повторяться (спустя несколько месяцев). Основная цель скрипта: 5 минут работать с одним блоком из 100 пользователей (выбирать оттуда случайные аватарки), потом не трогать этот блок максимально возможное время.

[Удален]
#3

slavegirl, всего один вопрос, JavaScript где исполняется? :)

slavegirl
На сайте с 25.06.2012
Offline
401
#4

burunduk, у этих миллионов пользователей соц. сети в браузерах. То есть, одновременно запущенных копий скрипта - большое количество.

[Удален]
#5
slavegirl:
в браузерах

соответственно, при каждой загрузке страницы скрипт будет выполнятся с самого начала или вы каждому пользователю присвоите какую-то переменную, которую будите хранить в базе и дёргать её от туда? :)

slavegirl
На сайте с 25.06.2012
Offline
401
#6

burunduk, при каждой загрузке страницы скрипт определяет текущее время в системе пользователя, к нему и привязывается номер дежурного блока. То есть, работа скрипта у каждого из пользователей будет более или менее синхронизирована (единственная погрешность - неправильно выставленное системное время). С этой задачей я справилась. Проблема заключается в том, как заставить скрипт с обновленными двумя параметрами начать воспроизведение с места остановки, без "прижков" по диапазону (место остановки можно напрямую указывать в коде скрипта).

axel11feb
На сайте с 16.06.2012
Offline
35
#7

Можно так: когда пользователь первый раз заходит на страницу, ему выставляется cookie с просмотренным блоком ( допустим 2850). В следующий раз ему выводится блок 2851 и в cookie записывается номер этого блока. Минус этого решения в том, что блоки выводятся не рандомно (не считая первого раза)

slavegirl
На сайте с 25.06.2012
Offline
401
#8

axel11feb, к сожалению, варианты с записью/чтением текущих переменных в БД или куки не подходят. Нужно именно доработать формулу, которая указана в первом сообщении. Необходима синхронная работа всех онлайн пользователей (в определенную единицу времени всем должны выводиться аватары из одного и того же определенного блока).

SM
На сайте с 03.09.2009
Offline
83
#9
slavegirl:
axel11feb,(в определенную единицу времени всем должны выводиться аватары из одного и того же определенного блока).

Всем разные или всем одинаковые?

slavegirl:
axel11feb, к сожалению, варианты с записью/чтением текущих переменных в БД или куки не подходят.

И как без фиксации записи на сервере или куках продолжать всем показ когда пользователь ушел, пришел, тем более если у многих время может быть разное?

как их синхронизировать без серверной части, только на JS?

slavegirl
На сайте с 25.06.2012
Offline
401
#10
SL.ME:
Всем разные или всем одинаковые?

Всем пользователям, которые находятся онлайн - один случайный аватар из одного и того же определенного блока, одинакового для всех (в определенный момент времени).

SL.ME:
И как без фиксации записи на сервере или куках продолжать всем показ когда пользователь ушел, пришел, тем более если у многих время может быть разное?
как их синхронизировать без серверной части, только на JS?

Для наглядности примера я указала время, которое определяется с помощью JavaScript. В действительности текущее время будет определяться сервером, для 100% синхронизации.

Еще раз приведу код программы:


start_time = 1430226525462; // текущее время запуска скрипта (определяется вручную перед самим запуском)
resume_user_id = 2000000; // с этого пользователя мы возобновляем процесс

users_max = 3000000;
users_min = 1000000;
users_block_size = 100;
users_block_period = 300000; // указано в миллисекундах

user_id = users_max - Math.floor(Date.now() / users_block_period) % Math.floor((users_max - users_min) / users_block_size) * users_block_size - Math.floor(Math.random() * users_block_size);

Вопрос: как привязать к формуле параметры start_time и resume_user_id, чтобы после запуска скрипта отсчет начинался с 2-миллионного пользователя (вниз) и далее по кругу в пределах диапазона [от 3 млн ... до 1 млн]?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий