Skip to content

Instantly share code, notes, and snippets.

@spuf
Last active August 29, 2015 14:22
Show Gist options
  • Save spuf/3d44db2b927dcccb6eb9 to your computer and use it in GitHub Desktop.
Save spuf/3d44db2b927dcccb6eb9 to your computer and use it in GitHub Desktop.
Calculate efficient daylight regime

Calculate efficient daylight regime

Find the cheapest light regime for defined daylight time.

Input data

Daylight: 18 hours.

Tariffs:

  • 1.26 from 23 till 7
  • 4.08 from 10 till 17 and from 21 till 23
  • 4.92 from 7 till 10 and from 17 till 21

Results

Legend:

  • First line is hours from 0 to 23 (only last digit, like 5 for 15th hour)
  • Other lines: start hour:, * for lights on, - for lights off, total price for a day
    012345678901234567890123 Sum
 0: ******************------ 57.06
 1: -******************----- 60.72
 2: --******************---- 64.38
 3: ---******************--- 68.04
 4: ----******************-- 70.86
 5: -----******************- 73.68
 6: ------****************** 73.68
 7: *------***************** 73.68
 8: **------**************** 70.02
 9: ***------*************** 66.36
10: ****------************** 62.70
11: *****------************* 59.88
12: ******------************ 57.06
13: *******------*********** 54.24
14: ********------********** 55.08
15: *********------********* 55.92
16: **********------******** 56.76
17: ***********------******* 56.76
18: ************------****** 55.92
19: *************------***** 55.08
20: **************------**** 54.24
21: ***************------*** 53.40
22: ****************------** 53.40
23: *****************------* 53.40

Best start hour

Legend: [start hour] => price.

Array
(
    [22] => 53.4
    [21] => 53.4
    [23] => 53.4
    [20] => 54.24
    [13] => 54.24
    [19] => 55.08
    [14] => 55.08
    [18] => 55.92
    [15] => 55.92
    [16] => 56.76
    [17] => 56.76
    [0] => 57.06
    [12] => 57.06
    [11] => 59.88
    [1] => 60.72
    [10] => 62.7
    [2] => 64.38
    [9] => 66.36
    [3] => 68.04
    [8] => 70.02
    [4] => 70.86
    [6] => 73.68
    [7] => 73.68
    [5] => 73.68
)

Results for 12 hours daylight

    012345678901234567890123 Sum
 0: ************------------ 31.74
 1: -************----------- 34.56
 2: --************---------- 37.38
 3: ---************--------- 40.20
 4: ----************-------- 43.02
 5: -----************------- 45.84
 6: ------************------ 49.50
 7: -------************----- 53.16
 8: --------************---- 53.16
 9: ---------************--- 53.16
10: ----------************-- 52.32
11: -----------************- 52.32
12: ------------************ 49.50
13: *------------*********** 46.68
14: **------------********** 43.86
15: ***------------********* 41.04
16: ****------------******** 38.22
17: *****------------******* 35.40
18: ******------------****** 31.74
19: *******------------***** 28.08
20: ********------------**** 28.08
21: *********------------*** 28.08
22: **********------------** 28.92
23: ***********------------* 28.92
Array
(
    [20] => 28.08
    [19] => 28.08
    [21] => 28.08
    [22] => 28.92
    [23] => 28.92
    [0] => 31.74
    [18] => 31.74
    [1] => 34.56
    [17] => 35.4
    [2] => 37.38
    [16] => 38.22
    [3] => 40.2
    [15] => 41.04
    [4] => 43.02
    [14] => 43.86
    [5] => 45.84
    [13] => 46.68
    [6] => 49.5
    [12] => 49.5
    [11] => 52.32
    [10] => 52.32
    [8] => 53.16
    [7] => 53.16
    [9] => 53.16
)
<?php
$tariffs = [
// Format: [price, start hour, end hour]
// Example: [4.20, 4, 20] => Price is 4.20 from 4:00 till 19:59
[1.26, 23, 07],
[4.08, 10, 17],
[4.08, 21, 23],
[4.92, 07, 10],
[4.92, 17, 21],
];
$daylight = 18;
// Table header
$line = "";
for ($currentHour = 0; $currentHour < 24; $currentHour++) {
$line .= sprintf("%d", $currentHour % 10);
}
printf("%3s %s Sum\n", " ", $line);
// Table body
function isHourInsideTariff($currentHour, $tariff) {
$tariffStart = $tariff[1];
$tariffEnd = $tariff[2];
if ($tariffStart < $tariffEnd) {
$inside = $tariffStart <= $currentHour && $currentHour < $tariffEnd;
} else {
$inside = ($tariffStart <= $currentHour && $currentHour < $tariffEnd + 24) ||
($tariffStart - 24 <= $currentHour && $currentHour < $tariffEnd);
}
return $inside;
}
$prices = [];
for ($startHour = 0; $startHour < 24; $startHour++) {
$line = "";
$sum = 0;
for ($currentHour = 0; $currentHour < 24; $currentHour++) {
$lightHours = $currentHour - $startHour;
$on = ($startHour <= $currentHour && $lightHours < $daylight) ||
(24 + $lightHours < $daylight);
if ($on) {
foreach ($tariffs as $tariff) {
if (isHourInsideTariff($currentHour, $tariff)) {
$sum += $tariff[0];
break;
}
}
}
$line .= $on ? '*' : '-';
}
$prices[$startHour] = $sum;
printf("%2d: %s %.2f\n", $startHour, $line, $sum);
}
// Sorted results
asort($prices);
print_r($prices);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment