aboutsummaryrefslogtreecommitdiff
path: root/challenge-120/paulo-custodio/lua/ch-2.lua
blob: 69af0280f680fce03f60aeeeb4b3d4201c599e44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env lua

--[[
Challenge 120

TASK #2 - Clock Angle
Submitted by: Mohammad S Anwar
You are given time $T in the format hh:mm.

Write a script to find the smaller angle formed by the hands of an analog
clock at a given time.

HINT: A analog clock is divided up into 12 sectors. One sector represents 30
degree (360/12 = 30).

Example
Input: $T = '03:10'
Output: 35 degree

The distance between the 2 and the 3 on the clock is 30 degree.
For the 10 minutes i.e. 1/6 of an hour that have passed.
The hour hand has also moved 1/6 of the distance between the 3 and the 4,
which adds 5 degree (1/6 of 30).
The total measure of the angle is 35 degree.

Input: $T = '04:00'
Output: 120 degree
--]]

function split(inputstr, sep)
    if sep == nil then
        sep = "%s"
    end
    local t = {}
    for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
        table.insert(t, str)
    end
    return t
end

function parse_time(hhmm)
    local a = split(hhmm, ":")
    local hh = tonumber(a[1])
    local mm = tonumber(a[2])
    return hh, mm
end

function clock_angles(hh, mm)
    local mm_angle = math.floor(mm*360/60)
    local hh_angle = math.floor((hh % 12)*360/12) + math.floor(mm_angle/12)
    return hh_angle, mm_angle
end

function clock_angle(hh, mm)
    local hh_angle, mm_angle = clock_angles(hh, mm)
    local angle = math.abs(hh_angle - mm_angle)
    if angle > 180 then angle = 360 - angle end
    return angle
end

hh, mm = parse_time(arg[1])
angle = clock_angle(hh, mm)
io.write(angle, "\n")