Ben bir zaman yolcuyum ve zamanın geçişine takıntılıyım. Özellikle saat 12'yi geçtiğinde veya takvimimin bir sonraki sayfasına geçebildiğimde ya da herkes "Yeni Yılınız Kutlu Olsun!" Diye bağırdığı anları severim.
Lütfen bana bu son andan diğerine ne kadar uzakta olduğumu, ilerleme çubuğu şeklinde olduğumu gösteren bir program yazın. Örneğin, saat 09:12 olduğunu söylersem şunu yazması gerekir:
09:00 ####---------------- 10:00
Ayın Mayıs 1982 olduğunu söylersem, şunu yazmalı:
1982-01 #######------------- 1983-01
Zaman yolcusu olduğumu söylemiş miydim? 0 AD'nin ilk milisaniyesinden 9999 AD'nin son milisaniyesine kadar her yere seyahat ediyorum, bu nedenle programın bu aralıktaki herhangi bir tarih ve saati ele alması gerekiyor.
Giriş
Giriş, aşağıdaki formatlardan birinde olacaktır:
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
Bunlar ele alınması gereken tek format. Her bölüm tam arka sıfır (örneğin olabilir kesirli saniye anlamına gelir gösterilen basamak sayısını, olacaktır
.120
, hiç.12
). BuT
, tarihi zamandan ayıran gerçek bir "T" harfidir. Saatler 24 saat açıktır.Aylar ve günler 1 tabanlıdır (aşağıda bununla ilgili daha fazlası).
Geçersiz ve aralık dışı girişlerin ele alınması gerekmez.
Programcının takdirine bağlı olarak, girişin tek bir izleyen yeni satırı olabilir.
İlerleme çubuğu matematik
Program verilen girişteki en az ve en az ikinci derecede önemli birimlerle ilgilidir. Örneğin, girişin gün düzeyinde kesinliği varsa (örn. 2016-12-14
), İlerleme çubuğu, giriş ayındaki günlerin hangi oranının kalanlara karşı geçtiğini gösterir.
İlerleme çubuğu 20 birim (karakter) ve yakın artışına yuvarlak olacak temsil oran olacaktır 1 / 20 . Örneğin, verilen 2016-12-14T12:28
ilerleme çubuğunda Yuvarlak ( 28 ⁄ 60 × 20) = "dolu" 20 birimin 9'u gösterilecektir.
1 tabanlı aylar ve günler
1 Aralık günü (örneğin) olmasına rağmen 01
içinde 2016-12-01
hesaplama amacı doğrultusunda, kesilmiş birimler günün 0 saat 0 dakika 0 milisaniye ima, çünkü ayın 0 günüdür. Diğer bir deyişle, 2016-12-01
bir 0 / 31 Aralık boyunca yol ve 2016-12-02
bir 1 / 31 , ve böyle devam eder.
Aynı şekilde, 2016-01
bu nedenle hesaplamalarda o, Ocak 0. gün 0. milisaniye olan 0 / 12 olan aracı, 2016-12
bir 11 / 12 .
Evet, bu ay ve günlerin ilerleme çubuğunu hiçbir zaman tam olarak dolduramayacağı anlamına gelir.
Farklı ay süreleri ve artık yıllar
Farklı ayların farklı gün sayısı vardır ve çıktılar, artık yıllar dahil, bunu yansıtmalıdır. 6 Şubat 2017'deki ilerleme çubuğu, 6 Şubat 2016'daki ilerleme çubuğundan (veya her iki yılın 6 Ocak'ından) farklı olacaktır.
Çeşitli
- Zaman yolcuları proleptik Gregoryen takvimini kullanıyor . TL; DR: 1752'de kayıp günler gibi özel durumlar yok . Girdi 0 yıl içindeki tarihleri içerecek
- Zaman yolcuları gün ışığındaki tasarrufları görmezden gelir.
- Program, artık saniyeleri hesaba katmak zorunda değildir, ancak olabilir.
Çıktı
Program (veya işlev), geçen süre boyunca "doldurulmuş" ve kalan süre için "açık" olan, yatay yönlendirilmiş 20 karakterli bir ilerleme çubuğu yazdırmalıdır (veya bir dize olarak geri dönmelidir). Soldan sağa "doldurmak" zorundadır.
İlerleme çubuğunun solunda, sayılan dönemin başlangıcını gösteren bir etiketi, bir sonraki dönemin başlangıcını gösteren girişiyle aynı formatta (ancak yalnızca iki birim hassasiyet göstererek) sağında bir etiket bulunmalıdır. Örneğimiz için 2016-12-14
geçerli çıktı şöyle olacaktır:
12-01 #########----------- 01-01
İşte olası dönemlerin her biri için geçerli etiket biçimleri:
- Ay:
YYYY-MM
- Günler:
MM-DD
- Saatler:
DDThh
- dakika:
hh:mm
- saniye:
mm:ss
- milisaniyeler:
ss.sss
Etiketlere ek ünite dahil edilemez ve hiçbiri ihmal edilemez.
Çıkış notları
- İlerleme çubuğunun "doldurulmuş" birimleri bir
#
karakterle temsil edilir . "Açık" birimleri ile temsil edilecektir-
. - İlerleme çubuğu ve her etiket arasında tam olarak bir boşluk bulunmalıdır.
- Önde gelen veya izlenen boşluklara ve / veya tek bir izleyen yeni hatta izin verilir.
Kazanan
Bu kod golfü . Bayt cinsinden en kısa kod kazanır. Standart kurallar geçerlidir. Standart boşluklar yasaktır.
Örnekler
Input Output
----------------------- -------------------------------------
2016-12-12T12:17 12:00 ######-------------- 13:00
2016-12-12 12-01 #######------------- 01-01
0000-01-01T00:00:00.000 00.000 -------------------- 01.000
0000-01-01T00:00 00:00 -------------------- 01:00
1899-12-31T23 31T00 ###################- 01T00
1899-12-31 12-01 ###################- 01-01
1899-12 1899-01 ##################-- 1900-01
1982-05-15T17:15 17:00 #####--------------- 18:00
1982-05-15T17 15T00 ##############------ 16T00
1982-05 1982-01 #######------------- 1983-01
9999-12-31T23:59:59.999 59.000 #################### 00.000
9999-12 9999-01 ##################-- 10000-01
2000-01-06 01-01 ###----------------- 02-01
2000-02-06 02-01 ###----------------- 03-01
2001-02-06 02-01 ####---------------- 03-01
1742-09-10 09-01 ######-------------- 10-01