Вычисление знака зодиака
Тут только что 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]);
Свежие комментарии