Skip to content
This repository was archived by the owner on Aug 17, 2022. It is now read-only.

Commit 47b224d

Browse files
authored
Merge pull request #10 from felix-dumit/felixdumit-clock
Add clock entry using Measurement
2 parents d756130 + 0d7bedc commit 47b224d

File tree

3 files changed

+87
-1
lines changed

3 files changed

+87
-1
lines changed

CodeChallenge.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
9489866A1BE5CFB000D34976 /* CodeChallengeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948986691BE5CFB000D34976 /* CodeChallengeType.swift */; };
3636
948986701BE5D28500D34976 /* ExampleCodeChallenge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9489866F1BE5D28500D34976 /* ExampleCodeChallenge.swift */; };
3737
94FB98CA1BE1B5D800228845 /* TwoSumChallenge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94FB98C91BE1B5D800228845 /* TwoSumChallenge.swift */; };
38+
D5D15B361E0C966A00CC9B1C /* felixdumitClockEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5D15B351E0C966A00CC9B1C /* felixdumitClockEntry.swift */; };
3839
/* End PBXBuildFile section */
3940

4041
/* Begin PBXContainerItemProxy section */
@@ -79,6 +80,7 @@
7980
948986691BE5CFB000D34976 /* CodeChallengeType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeChallengeType.swift; sourceTree = "<group>"; };
8081
9489866F1BE5D28500D34976 /* ExampleCodeChallenge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleCodeChallenge.swift; sourceTree = "<group>"; };
8182
94FB98C91BE1B5D800228845 /* TwoSumChallenge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoSumChallenge.swift; sourceTree = "<group>"; };
83+
D5D15B351E0C966A00CC9B1C /* felixdumitClockEntry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = felixdumitClockEntry.swift; sourceTree = "<group>"; };
8284
/* End PBXFileReference section */
8385

8486
/* Begin PBXFrameworksBuildPhase section */
@@ -117,6 +119,7 @@
117119
2EB83A7F1E03290400FAAB32 /* EthanSchatzline-ClockEntry.swift */,
118120
1B31586E1E02FC7E0052ACBD /* FlavioSilverioClockEntry.swift */,
119121
7B925E511E05AFFF0009B0CD /* matthijsClockEntry.swift */,
122+
D5D15B351E0C966A00CC9B1C /* felixdumitClockEntry.swift */,
120123
);
121124
path = Entries;
122125
sourceTree = "<group>";
@@ -377,6 +380,7 @@
377380
94350F741BE5F04A003592FB /* IanKeen.swift in Sources */,
378381
94350F761BE5F0F6003592FB /* Logan.swift in Sources */,
379382
94350F721BE5EF9F003592FB /* BugKrusha.swift in Sources */,
383+
D5D15B361E0C966A00CC9B1C /* felixdumitClockEntry.swift in Sources */,
380384
809B704A1BF01B68004131BE /* LoganWrightEntry.swift in Sources */,
381385
944CFCD81BE72B3C00FD2E41 /* LetterCombinationsOfPhoneNumberChallenge.swift in Sources */,
382386
94350F691BE5EB90003592FB /* Aranasaurus.swift in Sources */,

CodeChallenge/Challenges/Clock/Clock.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ struct ClockChallenge: CodeChallengeType {
3535
FlavioSilverioClockEntry,
3636
ethanSchatzlineClockEntry,
3737
brandonShegaClockEntry,
38-
matthijsClockEntry
38+
matthijsClockEntry,
39+
felixdumitClockEntry
3940
]
4041

4142
func verifyOutput(_ output: (hourHandeAnlge: Int, minuteHandAngle: Int, secondHandAngle: Int), forInput input: String) -> Bool {
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//
2+
// felixdumitClockEntry.swift
3+
// CodeChallenge
4+
//
5+
// Created by Felix Dumit on 12/22/16.
6+
// Copyright © 2016 iosdevelopers. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
private var dateFormatter: DateFormatter = {
12+
let df = DateFormatter()
13+
df.dateFormat = "HH:mm:ss"
14+
return df
15+
}()
16+
17+
let felixdumitClockEntry = CodeChallengeEntry<ClockChallenge>(name: "felix-dumit") { input in
18+
if #available(iOS 10.0, *) {
19+
20+
guard let date = dateFormatter.date(from: input) else {
21+
fatalError("bad input")
22+
}
23+
24+
func duration(for component: Calendar.Component) -> Measurement<UnitDuration> {
25+
let cmp = NSCalendar.current.component(component, from: date)
26+
return Measurement<UnitDuration>(value: Double(cmp), unit: component.durationUnit!)
27+
}
28+
29+
let totalDuration = duration(for: .hour) + duration(for: .minute) + duration(for: .second)
30+
31+
func clockAngle(unit: UnitDuration) -> Int {
32+
let percent = (totalDuration % unit.durationForClockFullTurn) / unit.durationForClockFullTurn
33+
return Int(360 * percent)
34+
}
35+
36+
return (clockAngle(unit: .hours), clockAngle(unit: .minutes), clockAngle(unit: .seconds))
37+
38+
} else {
39+
fatalError("this solution is only available for iOS10")
40+
}
41+
}
42+
43+
@available(iOS 10.0, *)
44+
private func /<D:Dimension>(lhs: Measurement<D>, rhs: Measurement<D>) -> Double {
45+
return lhs.converted(to: D.baseUnit()).value / rhs.converted(to: D.baseUnit()).value
46+
}
47+
48+
@available(iOS 10.0, *)
49+
private func %<D:Dimension>(lhs: Measurement<D>, rhs: Measurement<D>) -> Measurement<D> {
50+
let value = lhs.converted(to: D.baseUnit()).value
51+
.truncatingRemainder(dividingBy: rhs.converted(to: D.baseUnit()).value)
52+
return Measurement(value: value, unit: D.baseUnit())
53+
}
54+
55+
@available(iOS 10.0, *)
56+
private extension UnitDuration {
57+
var durationForClockFullTurn: Measurement<UnitDuration> {
58+
switch self {
59+
case UnitDuration.hours:
60+
return Measurement<UnitDuration>(value:12, unit: .hours)
61+
case UnitDuration.minutes:
62+
return Measurement<UnitDuration>(value:1, unit: .hours)
63+
case UnitDuration.seconds:
64+
return Measurement<UnitDuration>(value: 1, unit: .minutes)
65+
default: //should not happen
66+
return Measurement<UnitDuration>(value: 0, unit: .seconds)
67+
}
68+
}
69+
}
70+
71+
@available(iOS 10.0, *)
72+
private extension Calendar.Component {
73+
var durationUnit: UnitDuration? {
74+
switch self {
75+
case .hour: return .hours
76+
case .minute: return .minutes
77+
case .second: return .seconds
78+
default: return nil
79+
}
80+
}
81+
}

0 commit comments

Comments
 (0)