Kąt między wskazówkami zegara — Zadanie rekrutacyjne #15

Czego szuka rekruter: matematyka kątów, modulo, wybranie mniejszego z dwóch kątów
Poziom: Mid
Zadanie
Oblicz kąt (w stopniach) między wskazówką minutową a godzinową zegara dla podanej godziny. Wejście: godzina (h) i minuty (m). Wynik: kąt między wskazówkami (mniejszy z dwóch możliwych, tj. 0–180°).
Przykłady:
12:00→0°3:00→90°6:00→180°3:30→75°
Czego szuka rekruter
To zadanie o matematyce kątów zegarowych i znajomości operatora modulo. Rekruter sprawdza:
- Czy kandydat rozumie że wskazówka godzinowa przesuwa się płynnie (nie skacze co godzinę)
- Czy wie że wynik to mniejszy z dwóch kątów (0–180°, nie 0–360°)
- Walidacja wejścia:
hw formacie 12h lub 24h,mod 0 do 59
Analiza matematyczna
Wskazówka minutowa:
- Jeden obrót (360°) w 60 minut
- Kąt =
m × 6°(bo 360/60 = 6)
Wskazówka godzinowa:
- Jeden obrót (360°) w 12 godzin = 720 minut
- Kąt =
(h % 12) × 30° + m × 0.5° 30°per godzina (360/12 = 30)0.5°per minutę (30/60 = 0.5) — godzinowa przesuwa się płynnie!
Kąt między:
- Oblicz różnicę bezwzględną
- Weź minimum z różnicy i
360° - różnica→ mniejszy kąt (≤ 180°)
✅ Rozwiązanie
static double ClockAngle(int hour, int minute)
{
if (hour < 0 || hour > 23)
throw new ArgumentOutOfRangeException(nameof(hour), "Godzina musi być 0-23.");
if (minute < 0 || minute > 59)
throw new ArgumentOutOfRangeException(nameof(minute), "Minuty muszą być 0-59.");
// Normalizuj do 12h
int h = hour % 12;
// Kąt wskazówki minutowej (0-360°)
double minuteAngle = minute * 6.0;
// Kąt wskazówki godzinowej (0-360°)
// Godzinowa przesuwa się płynnie: 0.5° na minutę
double hourAngle = h * 30.0 + minute * 0.5;
// Różnica bezwzględna
double diff = Math.Abs(minuteAngle - hourAngle);
// Mniejszy z dwóch kątów (zegar ma dwa "sektory")
return Math.Min(diff, 360.0 - diff);
}
Kroki dla kilku przykładów
12:00 → h=0, minuteAngle=0°, hourAngle=0°, diff=0°, min(0, 360)=0° ✓
3:00 → h=3, minuteAngle=0°, hourAngle=90°, diff=90°, min(90, 270)=90° ✓
6:00 → h=6, minuteAngle=0°, hourAngle=180°, diff=180°, min(180, 180)=180° ✓
3:30 → h=3, minuteAngle=180°, hourAngle=90+15=105°, diff=75°, min(75, 285)=75° ✓
Dlaczego hour % 12?
Wejście 13:00 (format 24h) to to samo co 1:00 dla zegara 12h. 13 % 12 = 1.0:00 (północ) to 0 % 12 = 0 — wskazówka godzinowa na pozycji 12, kąt = 0°.
Testy jednostkowe
[Theory]
[InlineData(12, 0, 0.0)]
[InlineData(0, 0, 0.0)] // północ = 0°
[InlineData(3, 0, 90.0)]
[InlineData(6, 0, 180.0)]
[InlineData(9, 0, 90.0)]
[InlineData(3, 30, 75.0)]
[InlineData(12, 30, 165.0)]
public void ClockAngle_ReturnsCorrectAngle(int hour, int minute, double expected)
{
Assert.Equal(expected, ClockAngle(hour, minute), precision: 5);
}
[Fact]
public void ClockAngle_InvalidHour_ThrowsException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => ClockAngle(25, 0));
}
Co powiedzieć na rozmowie
“Kluczowa pułapka: wskazówka godzinowa przesuwa się płynnie — o 0.5° na minutę, nie skacze do następnej godziny co 60 minut. Gdybym to zignorował, kąt dla 3:30 byłby 90° (jakby godzinowa stała w miejscu) zamiast 75°. Wybieram mniejszy z dwóch kątów bo zegar ma dwa sektory — zawsze interesuje nas ten krótszy.”
Podsumowanie
Zadanie testuje precyzję matematyczną i świadomość pułapki z płynnym ruchem wskazówki godzinowej. Trzy kroki: oblicz kąt minutowej, oblicz kąt godzinowej (z uwzględnieniem minut!), weź minimum z różnicy i jej dopełnienia do 360°.
1 comment
Dodaj komentarz
Musisz się zalogować, aby móc dodać komentarz.
Zamień wiedzę w umiejętności
Pobierz darmową Roadmapę .NET i ułóż takie tematy jak ten w spójną ścieżkę do pierwszej pracy.
Pobieram roadmapę →
Ciekawy punkt widzenia. Nigdy wcześniej nie myślałem o [temat] w ten sposób. Dzięki za otwarcie moich oczu!