Bu, şirketimin her çalışanın çalışma sürelerinin izlenmesiyle nasıl başa çıktığını temel alır. Her birimizin bir sensörün önünden geçirilebilen bir kartı vardır, böylece bir saat çalışanların ofise giriş veya çıkış saatlerini kaydeder. Her kayıt bir koda bağlandığında:
- Kod 0: çalışan ofise gelir (veya geri döner).
- Kod 1: Çalışan öğle yemeği için ofisten ayrılır.
- Kod 2: çalışan günün sonunda ofisten ayrılır.
- Kod 3: Çalışan iş nedeniyle ofisinden ayrılır.
- Kod 4: Çalışan kişisel nedenlerden dolayı ofisten ayrılır.
Kod 0 kayıtları bazen "sıfır kayıtları" olarak adlandırılır ve kod 4'ten kodlar 1'e kadar olan kod bazen "sıfır olmayan kayıtlar" olarak adlandırılır.
Yani, bir işçi için normal bir gün şöyle bir kayıt listesi oluşturur:
Code/Time
------------
0 8:17 // The employee arrives at the office
4 11:34 // The employee leaves the office to smoke
0 11:41 // The employee returns to the office
1 13:37 // The employee leaves the office to have lunch
0 14:11 // The employee returns to the office
3 15:02 // The employee leaves the office to visit a client
0 16:48 // The employee returns to the office
2 17:29 // The employee leaves the office to go home
Bununla birlikte, çalışanlar bazen hata yaparlar. Aşağıdaki hatalar sistem tarafından otomatik olarak düzeltilir:
İki ardışık sıfır olmayan kayıt vardır. Sıfır olmayan ilk kaydın kodu 4 ise, otomatik kod 0 kaydı bir sonraki kayıttan 15 dakika sonra veya 15 dakikadan daha kısa bir süre sonra kaydedilmişse bir sonraki kayıttan 1 dakika önce eklenir. Sıfır olmayan ilk kaydın kodu 3 ise, otomatik kayıt 0 kaydı her zaman bir sonraki kayıttan 1 dakika önce eklenir. Diğer tüm durumlar bir hata oluşturur. Örnekler:
Code/Time ------------ 0 8:17 // The employee arrives at the office 4 11:34 // The employee leaves the office to smoke 1 13:37 // The employee leaves the office to have lunch // Automatic register with code 0 added at 11:49. Code/Time ------------ 0 8:17 // The employee arrives at the office 4 11:34 // The employee leaves the office to smoke 4 11:39 // The employee leaves again the office for personal reasons // Automatic register with code 0 added at 11:38. Code/Time ------------ 0 8:17 // The employee arrives at the office 3 11:34 // The employee leaves the office to visit a client 1 14:09 // The employee leaves the office to have lunch // Automatic register with code 0 added at 14:08.Çalışan iki kod 1 kaydını veya iki kod 2 kaydını kaydetti. Bu ikisi aslında birbirinin yerine geçebildiğinden, bu bir hata olarak sayılmaz. Kod 1 veya kod 2 kayıtları toplamda 2'den fazla kayıt varsa, bu bir hata oluşturur.
Meydan okuma
Temel amaç, çalışanın ofiste kaç saat ve dakika geçirdiğini hesaplamaktır. Bu, giriş kayıt listesi düzeltildikten (gerekirse ve mümkünse) sonra yapılır. Uygun bir kayıt listesinin, sıfır kayıtlarını sıfır olmayan kayıtlarla değiştireceğini unutmayın.
Bu nedenle, algoritma bir çalışanın kayıt listesini ve bir verme gününü alır ve o gün için harcanan zamanı döndürür. Eğer zaman hata durumunda harcanan zamanı hesaplayamazsa, 0 saat 0 dakika geri döner.
Kurallar:
- Harcanan zaman, her kod 0 kaydı ile bir sonraki sıfır olmayan kayıt arasında harcanan sürenin toplamıdır. Sıfır olmayan kod 3 ise, bu kayıt ile aşağıdaki kod 0 kaydı arasında geçen süre de sayılır.
- Giriş kayıt listesinin artan zaman düzeninde olacağını ve tüm kayıtların aynı günden olacağını varsayabilirsiniz (kimse gece yarısından sonra çalışmayacaktır).
- Giriş kaydı boş olmayacak.
- Giriş biçimi, saatin saat değeri ve dakika değeriyle ifade edildiği sürece, kodunuzun ihtiyacı olan herhangi bir şey olabilir (kayan noktalı saat sayısı geçerli bir giriş olmaz). Örnekler: Kodları içeren bir liste ve zamanı dizeler olarak içeren bir liste; her iki liste de aynı uzunluktadır; tamsayıların bir listesi, tamsayılar kod, saat ve dakika tutanakları ...
- Çıktı zamana sahip bir dize olabilir (istediğiniz herhangi bir formatta: H: mm, HH: mm, H: m ...); hesaplanan saat ve dakika ile iki tamsayı listesi; saat dakikalık bir demet olarak yorumlanabilecek herhangi bir şey (harcanan saatleri içeren bir kayan noktalı sayıya izin verilmez). Ya da sonucu STDOUT'a yazdırabilirsiniz.
Test senaryoları
Code/Time
------------
0 8:17 // Check in
4 11:34 // Check out. Time spent since check in: 3:17
0 11:41 // Check in
1 13:37 // Check out. Time spent since check in: 1:56
0 14:11 // Check in
3 15:02 // Check out. Time spent since check in: 0:51
0 16:48 // Check in. Time spent working outside: 1:46
2 17:29 // Check out. Time spent since check in: 0:41
// Total time (value returned): 8:31
Code/Time
------------
0 8:17
4 11:34 // Time spent: 3:17
1 15:52 // Time spent since 11:49 (automatic register 15 minutes after
// a code 4 register): 4:03
// Total time: 7:20
Code/Time
------------
0 8:17
4 15:47 // Time spent: 7:30
1 15:52 // Time spent since 15:51 (automatic register after a code 4
// register 1 minute before the next register as it is too
// close in time): 0:01
// Total time: 7:31
Code/Time
------------
0 8:17
1 13:34 // Time spent: 5:17
0 14:04
1 17:55 // Time spent: 3:51 (last code 1 should be a code 2 but it does not matter)
// Total time: 9:08
Code/Time
------------
0 8:17
1 13:34
0 14:04
1 17:05
0 17:08
2 17:44
// Total time: 0:00 (too many code 1 and code 2 registers)
Code/Time
------------
0 8:17
1 13:34 // A code 1 register does not generate an automatic code 0 register
2 17:41
// Total time: 0:00 (there's a code 0 register missing)
Code/Time
------------
0 8:17
0 13:34 // what happened between these two check in registers?
2 17:41
// Total time: 0:00 (there's a check out register missing)
Code/Time
------------
0 8:17
0 13:37 // This should probably be a code 1 register, but we cannot be sure
0 14:11
2 17:29
// Total time: 0:00
Bunun kafa karıştırıcı olabileceğini biliyorum. Lütfen daha fazla örnek istemekten çekinmeyin.
Bu kod golf, her dil için en kısa kod kazanabilir!
İsterseniz sistemi nasıl geliştireceğinizi yorumlayabilirsiniz, ancak mesele bu değildir. Patronum bunu değiştirmek için zaman harcamaya eğilimli değil. :-)