Hesaplama zaman çizelgeleri


14

Zaman çizelgeleri

Bir iş yerinde genellikle zaman çizelgelerini doldurmanız gerekir. Bu görev, yardımcı olacak kod yazmadır.

Giriş

Standart olmayan 12 saatlik bir saatte iki kez, bir boşlukla ayrılmış günün başlangıcını ve bitişini gösterir. Üçüncü bir sayı öğle yemeği için geçen dakika sayısını gösterir. Örneğin

9:14 5:12 30

Bu, 9: 14'te işe başladığınız, 17: 12'de işi bitirdiğiniz ve öğle yemeğinde 30 dakika sürdüğünüz anlamına gelir.

Bunu varsayabilirsin

  • İlk sütundaki herhangi bir saat 00:00 (gece yarısı) ile 13:00 arasındadır, ancak ikinci sütundaki herhangi bir zaman en erken 23: 59'a kadar 13:00'dir.
  • Öğle yemeği artık çalışma gününden daha uzun değil!

Giriş formatı verilen örneklerde olduğu gibi olmalıdır.

Görev

Kodunuz bu üçlülerin bir dosyasında (veya standart girişinde) ve her biri için ne kadar süre çalıştığınızı okumalıdır. Bu çıktı saat sayısını göstermelidir. Yukarıdaki örnek için bu:

7 saat ve 58 dakika eksi 30 dakika, 7 saat 28 dakika.

Çıktı

Çıktınız (tam) saat ve dakika sayısını belirtmeli ve 59 dakikadan fazla listelememelidir. Yani 2 saat 123 dk çıktı veremezsiniz. Bunun dışında, kodunuz sizin için uygun olan herhangi bir insan okuma biçiminde çıktı alabilir.

Örnekler

10:00 1:00 30    --> 2hr 30min
12:59 1:00 0     --> 0hr 1min
00:00 11:59 0    --> 23hr 59min
10:00 2:03 123   --> 2hr 0min 

3
Sıkı giriş biçiminin ( :12 saatlik saatte sınırlandırılmış süreler) bu soruna nasıl bir şey eklediğini görmüyorum .
Shaggy

3
@Shaggy Giriş formatını ayrıştırmak en azından benim için en zorlayıcıydı, çünkü saatler bir ya da iki karakter olabileceğinden karakter pozisyonlarını üstlenemezsiniz ...
Ryan

Kodun birkaç satırı okuması gerekiyor mu? Yoksa bir satır okuyorsa yeterli mi?
Luis Mendo

1
Evet, kod birden fazla satırı kabul etmelidir.
Anush

5
@ mbomb007 Aşağıya oy verebilirsiniz, ancak giriş formatını beğenmemek VTC için bir neden değildir.
Okx

Yanıtlar:



5

Retina 0.8.2 , 83 bayt

\d+
$*
 (1+:)
 12$*1$1
+`1:
:60$*
(1*) :\1(1*)(1*) \2
$3
:(1{60})*(1*)
$#1hr $.2min

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:

\d+
$*

Girişi tekli olarak dönüştürün.

 (1+:)
 12$*1$1

Durma süresine 12 saat ekleyin.

+`1:
:60$*

Saatleri 60 ile çarpın ve dakikalara ekleyin.

(1*) :\1(1*)(1*) \2
$3

Başlangıç ​​zamanını ve mola süresini durma zamanından çıkartın.

:(1{60})*(1*)
$#1hr $.2min

60'a bölün. (Daha sıkıcı bir çıktı biçimi için 5 bayt kaydedin.)



4

Python 3, 161 bayt

Bu bile en küçük yakın olmayacağını biliyorum, ama bir dosyada okur:

for l in open('t'):
    l=l[:-1].split(':')
    m=-int(l[0])*60+int(l[1][:2])+(int(l[1][3:])*60+720+int(l[2][:2])-int(l[2][2:]))
    print(f'{m//60}hr {m-(m//60*60)}min')

Bunu yapmak için zaman çizelgemizi duraklatmanın ironisini hissediyorum ...

Python 2.7, 133 bayt

Yorumlardaki öneriler için teşekkürler! Python 2.7'ye geçmek, varsayılan olarak tamsayı bölmesine ayarlandığı için birkaç bayt daha kaydeder:

for l in open('t'):i,h,l=int,60,l[:-1].split(':');m=-i(l[0])*h+i(l[1][:2])+(i(l[1][3:])*h+720+i(l[2][:2])-i(l[2][2:]));print m/h,m%60

Python3 ile aynı yaklaşım, baskı ifadesi ve kayan bölümü varsayılan olarak kullanması nedeniyle 135 bayttır:

for l in open('t'):i,h,l=int,60,l[:-1].split(':');m=-i(l[0])*h+i(l[1][:2])+(i(l[1][3:])*h+720+i(l[2][:2])-i(l[2][2:]));print(m//h,m%60)

1
Başına koyarak i=intve üçüncü satırı şu şekilde değiştirerek 4 bayt tasarruf edebilirsinizm=-i(l[0])*60+i(l[1][:2])+(i(l[1][3:])*60+720+i(l[2][:2])-i(l[2][2:]))
James

@DJMcMayhem Teşekkürler! Bunları basitleştirmenin bir yolunu düşünmeye çalışıyordum ...
Ryan

2
Çok güzel ilk cevap, Programlama Bulmacalar ve Kod Golf hoş geldiniz! Biraz golf oynamaya yardımcı olmak için, STDIN'den girdi alabilir map(int,l[:-1].split(':')), çoklu dönüşümleri int olarak kullanabilir ve int'e bırakabilirsiniz, ;birkaç bayt kaydetmek için girintiyi vb. İle değiştirerek her şeyi bir astara daraltabilirsiniz . Ayrıca, diğer kullanıcıların golfçü yaşamları sırasında keşfettikleri bazı daha düzgün hileler için Python'da golf oynamak için İpuçları sayfasını ziyaret edebilirsiniz .
Bay Xcoder

1
Ayrıca, OP çıktı biçimi hakkında daha az kısıtlayıcı gibi görünüyor , bu yüzden print(m,m%60)yeterli olacağını düşünüyorum . (Ayrıca kullanımına dikkat m%60yerine m-(m//60*60))
Sayın Xcoder

@ Mr.Xcoder Teşekkürler!
Ryan

4

C, 105 bayt

a,b,c,d,e;f(){for(;scanf("%d:%d%d:%d%d",&a,&b,&c,&d,&e);)a=(12+c-a)*60+d-b-e,printf("%d:%d ",a/60,a%60);}

Tamamen anlaşılır. Burada çevrimiçi deneyin .

Ungolfed:

a, b, c, d, e; // start hours, minutes; end hours, minutes; break - all implicitly int
f() { // function - return type is implicitly int (unused)
    for(; scanf("%d:%d%d:%d%d", &a, &b, &c, &d, &e) ;) // until EOF is hit, read line by line
        a = (12 + c - a) * 60 + d - b - e, printf("%d:%d,", a / 60, a % 60); // calculate the minutes and store, then output separated: "h m"
}

Öner a,b,c,d;f(e)yerine a,b,c,d,e;f()ve ;printf("%d:%d ",a/60,a%60))a=(12+c-a)*60+d-b-e;}yerine;)a=(12+c-a)*60+d-b-e,printf("%d:%d ",a/60,a%60);
ceilingcat

4

Wolfram Dil 125 119 111 bayt

i=Interpreter;j=IntegerPart;Row@{j[t=(i["Time"][#2<>"pm"]-i["Time"][#])[[1]]-#3/60],"hr ",j[60Mod[t,1]],"min"}&

202729 kullanıcısı sayesinde 8 bayt kaydedildi

Misal

Burada mantığı takip etmeyi kolaylaştırmak için kısaltmalar kullanılmaz.

Row[{IntegerPart[
 t = (Interpreter["Time"][#2 <> "pm"] - 
      Interpreter["Time"][#])[[1]] - #3/60], "hr ",
IntegerPart[60 Mod[t,1]], "min"}] &["9:00", "4:12", 20]

6saat 51dakika

Interpreter["Time"][#2 <> "pm"] ikinci parametrenin ardından "pm" ifadesini, yani bu durumda "16:12 pm" TimeObjectifadesini karşılık gelen bir zaman olarak yorumlar.

-Interpreter["Time"][# <> "am"])[[1]] - #3/60]. #3üçüncü parametredir, yani 20dk. Eksi işareti öğle saati aralığını vardiya süresinin bitiminden çıkarır. Düzeltilmiş vardiya zamanının, yani kişinin öğle yemeği molası vermemesi durumunda uygulanacak vardiya sonu.

Interpreter["Time"][#] ilk parametre bir zaman olarak yorumlanır, bu durumda "9:00", TimeObjectkarşılık gelen 9: 00'a karşılık gelir.

Vites başlangıcının, ayarlanan vites değiştirme süresi sonundan çıkarılması tzaman aralığı saat olarak ifade edilir. IntegerPart[t]çalışılan tam saat sayısını döndürür. IntegerPart[60 Mod[t,1]], "min"}]çalışılan ek dakikaları döndürür.


Evet. Teşekkürler. İlk gördüğümde Mod[x, 1]kullanılmış.
DavidC

Alındığı bu (silindi) ipuçları . / Aslında mod 1 negatif sayı için kesirli kısımdan farklı davranır. / İçin Floorkullanılabilir IntegerPartmi?
user202729

Floor bana -6hr 52minkullandığım örnek değerler için açıklanamaz bir sonuç veriyor. Neden saatlerce (ve görünüşte dakikalar) negatif bir değerin üretildiğini anlamak için buna bakmam gerekiyor.
DavidC

3

JavaScript, 83 bayt 76 bayt

s=>(r=s.match(/\d+/g),r=(r[2]-r[0]+12)*60-r[4]-r[1]+ +r[3],(r/60|0)+':'+r%60)

Sadece iç fonksiyondan aşağıdaki çözümden kurtuldum (Ne düşünüyordum?). Çıktı formatını da değiştirdi.

Çevrimiçi deneyin!


ESKİ: JavaScript, 112 bayt 111 bayt 110 bayt

s=>(t=(h,m,a)=>(a?12+h:h)*60+m,r=s.match(/\d+/g),r=t(+r[2],r[3]-r[4],1)-t(r[0],+r[1]),`${r/60|0}hr ${r%60}min`)

Açıklama:

Ana fonksiyonun içinde, üçüncü parametrenin doğru olması durumunda saat parametresine 12 saat ekleyerek, verme süresinin dakikalarını hesaplamamıza yardımcı olacak bir tane tanımlayarak başlıyoruz:

(hours, minutes, addTwelve) =>
    (addTwelve? hours + 12: hours) * 60 + minutes

Daha sonra , dizeyi ikiye böleriz ' 'veya':' dizenin içindeki sayılarla eşleştiririz, bu da dizedeki tüm sayıların bir dizisiyle sonuçlanır.

Daha sonra, daha önce tanımlanan işlevi kullanarak bitiş zamanı ve başlangıç ​​zamanı ve öğle yemeği zamanının farkını hesaplıyoruz (gerektiğinde dizeleri sayılara dönüştürüyoruz).

Sonunda sonuç dizesini üretiyoruz: saat tamsayı kısmı r/60ve dakika r%60.

Çevrimiçi deneyin!


@ Jakob Yeni bir codegolf kullanıcısıyım. TIO da dahil olmak üzere burada nasıl çalıştığını hala bilmiyorum. Ayrıca bu yorumda ben javascript kullanarak bu yaklaşımı nasıl sordum ama kimse yanıt vermedi.
ibrahim mahrir

@ Jakob TIO düzeltildi. Ve NodeJS kullanmıyorum, tarayıcının konsolunu kullanıyorum. TIO tarafından NodeJS eklendi.
ibrahim mahrir

Giriş yönteminin yasal olduğundan emin değilim (bu soru maalesef kısıtlayıcıdır), ancak içeri girmek için daha deneyimli bir JS golfçüsüne ihtiyacımız olabilir. Ancak, programların birkaç günlük giriş verilerini desteklemesi gerektiğini unutmayın - maalesef bu yapılmadı açıklamasında çok açık.
Jakob

Daha fazla gün girdi olarak kullanılması gerekiyorsa ben sadece işleve bir dizi ve kullanılmasını kabul yapabiliriz @Jakob map: a=>a.map(...). Cevabıma 5 bayt ekleyecek. Ama hala yorumuma OP (ya da herhangi biri) yanıtı bekliyorum.
ibrahim mahrir

Saf JavaScript'in standart girdilere veya dosyalara erişimi olmadığından, bir GUI istemi kullanma varsayılan yöntemiyle gitmenizi öneririm: codegolf.meta.stackexchange.com/a/2459/79343
OOBalance

3

Python 2,100 bayt

for I in open('x'):x,y,z,w,l=map(int,I.replace(':',' ').split());d=60*(12+z-x)+w-y-l;print d/60,d%60

Çevrimiçi deneyin!

OP tarafından yönlendirildiği gibi, bir metin dosyasından birden çok satırı okuyan tam program. Yalnızca tek bir satırı ayrıştıran bir işlev, 10 baytlık bir ek kaydeder.


1
Bu da benim girişimimden çok daha okunaklı!
Ryan

3

Java 10, 194 191 bayt

u->{var s=new java.util.Scanner(System.in).useDelimiter("\\D");for(int i,a[]=new int[5];;i=(12+a[2]-a[0])*60+a[3]-a[1]-a[4],System.out.println(i/60+":"+i%60))for(i=0;i<5;)a[i++]=s.nextInt();}

G / Ç Java'da acı verir. Okunacak bir sonraki girdi satırı olmadığında anormal olarak sona erer. Burada çevrimiçi deneyin .

Ungolfed:

u -> { // lambda taking a dummy input – we're not using it, but it saves a byte
var s = new java.util.Scanner(System.in).useDelimiter("\\D"); // we use this to read integers from standard input; the delimiter is any character that is not part of an integer
for(int i, a[] = new int[5]; ; // infinite loop; i will be used to loop through each line and to store the result in minutes between lines; a will hold the inputs
    i = (12 + a[2] - a[0]) * 60 + a[3] - a[1] - a[4], // after each line, calculate the result in minutes ...
    System.out.println(i / 60 + ":" + i % 60)) // ... and output the result in hours:minutes, followed by a newline
    for(i = 0; i < 5; ) // read the five integers on the current line ...
        a[i++] = s.nextInt(); // ... into the array
}


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.