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

12
SM
На сайте с 03.09.2009
Offline
83
#11

И если в будущем будет изменен параметр users_block_size = 100; то это уже изменение алгоритмов выборки, и без той самой записи в куках на каком блоке мы остановили показ не обойтись.

И да при изменении users_block_size = 100; в меньшую сторону, и если пользователь вышел зашел, он может увидеть тех кого видел ранее, при изменении в большую сторону, ему могут быть не показаны некоторые аватары вообще, он их пропустит. также как и пропустит закрыв и открыв браузер.

--

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

а этот параметр тоже надо хранить в куках при закрытии браузера.

--

Вывод: либо пишем и читаем куки, либо просто крутить по кругу не заморачиваясь кого показали, не успел посмотреть, посмотрит на следующем кругу)

--

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

ДП
На сайте с 23.11.2009
Offline
203
#12

А чем вас вариант с генерацией наального id пользователя на сервере не устраивает? Ну т.е. на сервере раз в 5 минут (или сколько там по условию должен блок ротироваться) запускается скрипт. Вычисляет начального пользователя, с которого надо показывать блок, записывает это хоть в БД, хоть в файл.

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


user_id = user_max - Math.floor(Math.random() * users_block_size);

где user_max - это значение, сгенерированное первым скриптом.

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

Напишу еще вариант. Если я правильно понял, то профили должны выводиться у всех юзеров одинаковые (т. е из одного блока). А точнее синхронно, ОК? Тогда вот это должно сработать (https://jsfiddle.net/azrrLza4/):


var userBlocks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a', 'b', 'c', 'd', 'e']; // Блоки пользователей

var maxBlockLimit = 15; // 15 or userBlocks.length - последний блок
var minBlockLimit = 1; // первый блок

var interval = 5000, time = Date.now(), startTime = 1430250266922; // Интервал, время сейчас, время запуска (должно быть постоянным или должно заново выставляться сервером после полного перебора всех блоков)

var block; // ID нашего будущего блока

block = Math.floor((time - startTime)/interval);

block = (block > maxBlockLimit) ? block % maxBlockLimit : block; // Проверяем не вышли ли за пределы

console.log('Block id is "' + userBlocks[block] + '"'); // вот и сам блок

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

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

slavegirl
На сайте с 25.06.2012
Offline
398
#14

Решение оказалось достаточно простым, но мой 140-й IQ напрочь отказался его выдавать раньше 2-дневного срока. Наверное, нужно заново пересдать тест...


var start_time = 1430271008102;
var init_user_id = 2000000;

var users_max = 3000000;
var users_min = 1000000;
var users_block_size = 100;
var users_block_period = 300000;

var users_block_count = Math.floor((users_max - users_min) / users_block_size);
var users_block_offset = Math.ceil((users_max - init_user_id) / users_block_size);

user_id = users_max - (Math.floor((new Date().getTime() - start_time) / users_block_period) % users_block_count + users_block_offset) % users_block_count * users_block_size - Math.floor(Math.random() * users_block_size);

Всем большое спасибо за подсказки!

❤️ АЛЬТЕРНАТИВА ADSENSE, ВЫПЛАТЫ В USDT ––  https://t.me/FilesKings/67959
ДП
На сайте с 23.11.2009
Offline
203
#15

А на словах-то вы можете пояснить, что сделали?

slavegirl
На сайте с 25.06.2012
Offline
398
#16

Дикий пионер, добавила сдвиг по блокам, привязанный ко времени модификации скрипта и который не выходит за границы общего диапазона. Синхронизация по времени обеспечивается использованием new Date().getTime(), в независимости от часового пояса у всех пользователей время - одинаковое (нет необходимости использовать серверное время).

12

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