<?php
function getAngle($hours, $minutes) {
// 5 - столько минут проходит часовая стрелка за час
$hoursArrowPosition = normalizeHour($hours) * 5 + getHourArrowShift($minutes);
$degsInMinute = 360 / 60;
return abs($degsInMinute * ($minutes - $hoursArrowPosition)); }
function normalizeHour($hour) {
return ($hour > 11)
? $hour - 12
: $hour;
}
// На сколько минут сдвинулась часовая стрелка
// Например для 12:30 часовая стрелка сдвинется на 2,5 минуты
function getHourArrowShift($minutes) {
$minutesInHour = 60;
return ($minutes / $minutesInHour) * 5;
}
$testcases = [
// час, минута, ожидаемый угол
[12, 0, 0],
[15, 20, 20],
[3, 20, 20],
[12, 30, 165],
[10, 50, 25],
];
foreach ($testcases as list($hours, $minutes, $expectedAngle)) { $givenAngle = getAngle($hours, $minutes);
echo "Время: {$hours}:{$minutes} ожидаемый угол: {$expectedAngle} дано: {$givenAngle}\n";
}
PD9waHAKCmZ1bmN0aW9uIGdldEFuZ2xlKCRob3VycywgJG1pbnV0ZXMpIHsKICAgIC8vIDUgLSDRgdGC0L7Qu9GM0LrQviDQvNC40L3Rg9GCINC/0YDQvtGF0L7QtNC40YIg0YfQsNGB0L7QstCw0Y8g0YHRgtGA0LXQu9C60LAg0LfQsCDRh9Cw0YEKICAgICRob3Vyc0Fycm93UG9zaXRpb24gPSBub3JtYWxpemVIb3VyKCRob3VycykgKiA1ICsgZ2V0SG91ckFycm93U2hpZnQoJG1pbnV0ZXMpOwogICAgJGRlZ3NJbk1pbnV0ZSA9IDM2MCAvIDYwOwoKICAgIHJldHVybiBhYnMoJGRlZ3NJbk1pbnV0ZSAqICgkbWludXRlcyAtICRob3Vyc0Fycm93UG9zaXRpb24pKTsKfQoKZnVuY3Rpb24gbm9ybWFsaXplSG91cigkaG91cikgewogICAgcmV0dXJuICgkaG91ciA+IDExKQogICAgICAgID8gJGhvdXIgLSAxMgogICAgICAgIDogJGhvdXI7Cn0KCi8vINCd0LAg0YHQutC+0LvRjNC60L4g0LzQuNC90YPRgiDRgdC00LLQuNC90YPQu9Cw0YHRjCDRh9Cw0YHQvtCy0LDRjyDRgdGC0YDQtdC70LrQsAovLyDQndCw0L/RgNC40LzQtdGAINC00LvRjyAxMjozMCDRh9Cw0YHQvtCy0LDRjyDRgdGC0YDQtdC70LrQsCDRgdC00LLQuNC90LXRgtGB0Y8g0L3QsCAyLDUg0LzQuNC90YPRgtGLCmZ1bmN0aW9uIGdldEhvdXJBcnJvd1NoaWZ0KCRtaW51dGVzKSB7CiAgICAkbWludXRlc0luSG91ciA9IDYwOwogICAgcmV0dXJuICgkbWludXRlcyAvICRtaW51dGVzSW5Ib3VyKSAqIDU7Cn0KCiR0ZXN0Y2FzZXMgPSBbCiAgICAvLyDRh9Cw0YEsINC80LjQvdGD0YLQsCwg0L7QttC40LTQsNC10LzRi9C5INGD0LPQvtC7CiAgICBbMTIsIDAsIDBdLAogICAgWzE1LCAyMCwgMjBdLAogICAgWzMsIDIwLCAyMF0sCiAgICBbMTIsIDMwLCAxNjVdLAogICAgWzEwLCA1MCwgMjVdLApdOwoKZm9yZWFjaCAoJHRlc3RjYXNlcyBhcyBsaXN0KCRob3VycywgJG1pbnV0ZXMsICRleHBlY3RlZEFuZ2xlKSkgewogICAgJGdpdmVuQW5nbGUgPSBnZXRBbmdsZSgkaG91cnMsICRtaW51dGVzKTsKICAgIGVjaG8gItCS0YDQtdC80Y86IHskaG91cnN9OnskbWludXRlc30g0L7QttC40LTQsNC10LzRi9C5INGD0LPQvtC7OiB7JGV4cGVjdGVkQW5nbGV9INC00LDQvdC+OiB7JGdpdmVuQW5nbGV9XG4iOwp9Cgo=