🔥 Zapisy zamknięte, ale możesz pobrać Roadmapę .NET i dołączyć do listy oczekujących — Pobierz i dołącz do Listy VIP →

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
  • 3:0090°
  • 6:00180°
  • 3:3075°

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: h w formacie 12h lub 24h, m od 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:

  1. Oblicz różnicę bezwzględną
  2. 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°.

👨‍💻
Mariusz Jurczenko
Senior .NET Developer · 10+ lat doświadczenia komercyjnego

Programista .NET z doświadczeniem komercyjnym w firmach takich jak COIG, Kamsoft czy Etisoft Smart Solutions. Twórca kursów, z których skorzystało już ponad 11 000 osób w Strefie Kursów i ponad 1 000 kursantów na dev-hobby.pl.

Specjalizacja: Clean Code, Clean Architecture i uczenie programowania tak, żeby dało się je naprawdę zrozumieć — nie wykuć.

1 comment

Dodaj komentarz

czytanie to początek

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ę →