Главная > JavaScript, PHP, Программирование > Вычисление знака зодиака

Вычисление знака зодиака

9 Август 2007

Тут только что ASMO попросил помочь ему рассчитать знак зодиака зная timestamp даты рождения. Чего он тока на свой сайт не пихает))))

Мне чета вдруг захотелось написать что-то очень простое но элегантное.

Для этого мне понадобилось завести массив со значениями продолжительности влияния знака в секундах.

Для подсчета высокосных годов, надо узнать остаток от деления на полный высокосный цикл (365*24*60*60)*3+(366*24*60*60), получаться 126230400. Оставшееся нужно поделить на (365*24*60*60), остаток от этого деления это последний год из которого можно найти знак

Пример 1975-07-23 это 175298400 секунд с начала 1970 года. Поделив на 126230400 получаем остаток 49068000 а поделив это на 31536000 получаем 17532000. Это количество дней которое прошло с начала 1975 до дня рождения ASMO.

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

Еще одна поправка на высокосность года. 1970 (начало эры Unix) не был высокосным, высокосным был 72-й поэтому надо сравнивать текущий год с остатком от деления на высокосный цикл и если разница равна 2 то добавлять рыбам еще один день влияния.

Теперь перебирая массив дат нужно по очереди отнимать от найденного числа 17532000 периоды влияния знаков. Если остаток получается меньше величины влияния знака то данный знак и есть искомый.

В результате работы скрипта мы узнаем что ASMO - лев

 


$a= array(
	array('козерог',1641600),	// 22.12-01.01
	array('водолей',2592000),	// 21.01-20.02
	array('рыбы',2419200),		// 21.02-20.03
	array('овен',2592000),		// 21.03-20.04
	array('телец',2505600),		// 21.04-20.05
	array('близнецы',2678400),	// 21.05-21.06
	array('рак',2592000),		// 22.06-22.07
	array('лев',2678400),		// 23.07-23.08
	array('дева',2592000),		// 24.08-23.09
	array('весы',2505600),		// 24.09-23.10
	array('скорпион',2505600),	// 24.10-22.11
	array('стрелец',2419200), 	// 23.11-21.12
	array('козерог',864000),	// 01.01-20.01
);

$birth = 175298400; // 1975-07-23
$a[2]['рыбы'] += floor(($birth % 126230400)/31536000) == 2 ? 86400 : 0;

$ostatok = ($birth % 126230400) % 31536000; 

foreach($a as $v)  {
	if($ostatok <= $v[1]) 
		break;
	$ostatok -= $v[1];	
}
echo $v[0];

Решил добавить еще тоже самое на JavaScript


var a = [
    ['козерог',1641600],	// 22.12-01.01
    ['водолей',2592000],	// 21.01-20.02
    ['рыбы',2419200],		// 21.02-20.03
    ['овен',2592000],		// 21.03-20.04
    ['телец',2505600],		// 21.04-20.05
    ['близнецы',2678400],	// 21.05-21.06
    ['рак',2592000],		// 22.06-22.07
    ['лев',2678400],		// 23.07-23.08
    ['дева',2592000],		// 24.08-23.09
    ['весы',2505600],		// 24.09-23.10
    ['скорпион',2505600],	// 24.10-22.11
    ['стрелец',2419200], 	// 23.11-21.12
    ['козерог',864000],		// 01.01-20.01
];

var birth = 175298400; // 1975-07-23

a[2][1] += Math.floor((birth % 126230400)/31536000) == 2 ? 86400 : 0;

var ostatok = (birth % 126230400) % 31536000;

for(var v in a)  {
    if(ostatok <= a[v][1])
        break;
    ostatok -= a[v][1];
}
alert(a[v][0]);
  1. Asmo
    9 Август 2007 в 18:54 | #1
    Мавру, многочисленные рекспекты и уважуха. Код работает аки часы :) нихрена правда непонял расчета высокосного года, ну да ладно, работает и хорошо.
  2. motor2hg
    6 Декабрь 2007 в 19:24 | #2
    Изящное решение. Спасибо.
  3. noname
    14 Май 2009 в 04:33 | #3
    не срабатывает 1974-08-21
  4. 14 Май 2009 в 07:16 | #4
    @noname включи яваскрипт :) у меня пишет что это дева
  5. guest
    17 Август 2009 в 09:34 | #5
    JavaScript неверно показывает, что 1978-03-20 - это овен. Это ведь рыбы. И 1978-02-20 - это не рыбы, а водолей. И вообще, даты, на которых заканчиваются влияния знаков неверно показывают.
  6. 17 Август 2009 в 09:42 | #6
    да точно последний день знака переносится на следующий... поправлю
  7. Lex
    22 Март 2010 в 15:00 | #7
    Для корректного определения положения Солнца в зодиаке, таблиц приближенного соответствия календарным датам, которые иногда публикуются в прессе обычно не достаточно (пример такой таблицы см. выше). Для более точного определения положения Солнца в зодиаке (или, как говорят, «знака зодиака»), следует воспользоваться либо астрономическими формулами вычисления положения Солнца, либо эфемеридами, либо сложными компьютерными программами.
  8. 14 Апрель 2010 в 01:01 | #8
    Lex : Для корректного определения положения Солнца в зодиаке, таблиц приближенного соответствия календарным датам, которые иногда публикуются в прессе обычно не достаточно (пример такой таблицы см. выше). Для более точного определения положения Солнца в зодиаке (или, как говорят, «знака зодиака»), следует воспользоваться либо астрономическими формулами вычисления положения Солнца, либо эфемеридами, либо сложными компьютерными программами.
    ух ебать как сложно )))))))) это не надо блондинкам - посетительницам сайтов :D
Комментирование отключено.