Вниз  Алгоритмизация
- 6.01.2015 / 11:29
Kalter
  Пользователь

Kalter 
Сейчас: Offline
Ксакеп, лол, да не в этом пока дело. Количество итераций, кстати, можно определить по формуле:
speed = step + length / step

Проблема в том, что работает и на теории, а вот на практике не всегда.
__________________
 Homo homini penis est.
- 6.01.2015 / 11:34
Ксакеп
  Модератор форума

Ксакеп 
Сейчас: Offline
Kalter, а нет, извиняюсь. Тоже N.
- 6.01.2015 / 14:48
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Kalter, проверь случай, когда step равен длине массива / 2+1.
То есть, на примере [0, 1, 2, 3, 4] у тебя сдвиг на (5/2+1)=3 даст сбой.
На примере от 0..9 при сдвиге на 6 будет сбой. При 0..12, при сдвиге на 7 и т.д.

P.S.
  1. k = (k + step) % array.length;

__________________
 let live

Изменено aNNiMON (6.01 / 14:50) (всего 2 раза)
- 6.01.2015 / 14:58
Kalter
  Пользователь

Kalter 
Сейчас: Offline
aNNiMON, спасибо за подсказку. Придётся вернуться назад, ещё раз перекопать решение...
__________________
 Homo homini penis est.
- 6.01.2015 / 15:00
Ксакеп
  Модератор форума

Ксакеп 
Сейчас: Offline
Kalter, вообще, я не понимаю, зачем городить такие страшные решения (они, может, и работают, но мне страшно) и не воспользоваться стандартным тройным reverse'ом?
- 6.01.2015 / 15:02
Kalter
  Пользователь

Kalter 
Сейчас: Offline
Ксакеп, стандартным? Покажи-ка...

А вообще, мне просто интересно. Решение придумываю исключительно сам.
__________________
 Homo homini penis est.
- 6.01.2015 / 15:14
Ксакеп
  Модератор форума

Ксакеп 
Сейчас: Offline
Kalter, положи перед собой две руки ладонями вниз, 10 пальцев — твой массив:
[1, 2, ..., 9, 10]

Теперь переверни руки (5-6 вместе), то есть ладонями вверх:
[10, 9, ..., 2, 1]

Далее сделай reverse для каждой ладони отдельно:
[6, 7, ..., 10 | 5, ..., 2, 1]
[6, 7, ..., 10 | 1, ..., 4, 5]

???
PROFIT!!1
- 13.01.2015 / 12:49
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Есть время восхода и заката. Нужно сделать фон, зависимый от времени суток. В полночь - тёмный цвет, в полдень - светлый, в промежутках - смесь этих цветов с коэффициентом.

На цифрах:
Восход: 07:16.
Закат: 16:02.

Переводим для удобства всё в минуты:
hour * 60 + min
Восход: 436
Закат: 962

Находим время, когда солнце в зените, то есть точный полдень:
noonTime = (riseTime + (setTime - riseTime) / 2) % 1440;
Полдень: 699

Теперь получаем текущее время и переводим его в минуты:
time = System.currentTimeMillis() / 60000 % 1440;
Время: 705

Теперь надо высчитать коэффициент. Если текущее время ближе к полудню, то коэффициент стремится к 1. Если ближе к полуночи -> 0. Если точно равен восходу или закату солнца -> 0.5.

Очевидно, что промежуток [полдень-720 .. полдень] равен зеркальному отражению [полдень .. полдень+720]. То есть, если полдень ровно в 12, то коэффициент в 1 ночи и в 23 ночи будет одинаков, в 10 утра и в 14 дня - тоже одинаков и т.д.
  1. if (time <= noon) {
  2.     coef = time / 720;
  3. } else {
  4.     coef = 1 - (time - noon) / 720;
  5. }
Всё прекрасно работает, но это для случая, когда полдень в 12:00, а полночь в 00:00. В идеале же полдень может быть 12:40, или 11:30, тогда точная формула такая:
  1. if (time <= noon) {
  2.     coef = time / noon;
  3. } else {
  4.     coef = 1 - (time - noon) / noon;
  5. }
И вот теперь в 12:40 у нас 1, всё нормально, но в 00:00 всегда 0, хотя полночь может быть и в 00:30 и в 23:40 (тогда и полночь сдвинется). В общем вот именно тут и кроется проблема. Помогите вывести.

Набросал демку на js, так нагляднее.
__________________
 let live

Изменено aNNiMON (13.01 / 12:51) (всего 3 раза)
- 13.01.2015 / 14:43
Kalter
  Пользователь

Kalter 
Сейчас: Offline
aNNiMON, значит проблема в том, что если задан интервал полночи [23.3; 0.3] в часах и переводим в минуты: [1398; 30]?.. Если так, то можно сделать алгоритм с отрицательным коэффициентом (то есть ночью со знаком -, а днём со знаком +, или наоборот).
__________________
 Homo homini penis est.
- 13.01.2015 / 14:50
Dinisimys
  Пользователь

Dinisimys 
Сейчас: Offline
aNNiMON, вот код. Упрощенный вариант, но главное с коефициентом там все расписанно.
  1. var noon=760;
  2.     var midnight=40;
  3.     var time=40;
  4.     var vtime=time;
  5.     var coef;
  6.     if(time<=noon && time>midnight) {
  7.       coef=time/noon;
  8.     } else {
  9.       if(time>=0 && time<midnight) {
  10.         vtime=1440-(midnight-time);
  11.         coef=1 - (vtime - noon) / 720;
  12.       }
  13.       if(time==midnight) coef=0;
  14.     }

Наверх  Всего сообщений: 127
Фильтровать сообщения
Поиск по теме
Файлы топика (2)