การคำนวณใบบันทึกเวลา


14

ใบบันทึกเวลา

ในสถานที่ทำงานคุณมักจะต้องกรอกใบบันทึกเวลา งานนี้เขียนโค้ดเพื่อช่วยในเรื่องนี้

อินพุต

สองครั้งในนาฬิกา 12 ชั่วโมงที่ไม่ได้มาตรฐานเล็กน้อยซึ่งบ่งบอกถึงจุดเริ่มต้นและจุดสิ้นสุดของวันโดยคั่นด้วยช่องว่าง ตัวเลขที่สามแสดงถึงจำนวนนาทีที่ใช้สำหรับอาหารกลางวัน ตัวอย่างเช่น

9:14 5:12 30

นี่หมายความว่าคุณเริ่มทำงานเวลา 9:14 น. ทำงานเสร็จตอน 17:12 น. และกินอาหารกลางวัน 30 นาที

คุณสามารถสันนิษฐานได้ว่า

  • เวลาใดก็ได้ในคอลัมน์แรกคือตั้งแต่ 00:00 (เที่ยงคืน) จนถึงไม่รวม 1:00 น. และเวลาใด ๆ ในคอลัมน์ที่สองคือ 1:00 น. โดยเร็วที่สุดจนถึง 23.59 น.
  • พักกลางวันไม่เกินวันทำงาน!

รูปแบบการป้อนข้อมูลต้องเป็นไปตามตัวอย่างที่ให้มา

งาน

รหัสของคุณควรอ่านในไฟล์ (หรืออินพุตมาตรฐาน) ของ triples เหล่านี้และสำหรับแต่ละเอาต์พุตที่คุณทำงาน ผลลัพธ์นี้ควรระบุจำนวนชั่วโมง สำหรับตัวอย่างข้างต้นนี่คือ:

7 ชม. และ 58 นาทีลบ 30 นาทีซึ่งเป็น 7 ชม. 28 นาที

เอาท์พุต

ผลลัพธ์ของคุณต้องระบุจำนวนชั่วโมงและนาที (ทั้งหมด) และต้องไม่แสดงรายการเกิน 59 นาที นั่นคือคุณไม่สามารถส่งออก 2 ชั่วโมง 123 นาที นอกจากนั้นโค้ดของคุณยังสามารถแสดงผลในรูปแบบการอ่านที่มนุษย์อ่านง่ายซึ่งสะดวกสำหรับคุณ

ตัวอย่าง

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
ฉันไม่เห็นว่ารูปแบบการป้อนข้อมูลที่เข้มงวด ( :เวลาที่คั่นด้วยเวลา 12 ชั่วโมง) เพิ่มอะไรให้กับความท้าทายนี้
Shaggy

3
@Shaggy การแยกวิเคราะห์รูปแบบการป้อนข้อมูลเป็นสิ่งที่ท้าทายสำหรับฉันอย่างน้อยที่สุดเพราะคุณไม่สามารถรับตำแหน่งตัวละครได้เนื่องจากชั่วโมงอาจเป็นตัวละครหนึ่งหรือสองตัว ...
Ryan

รหัสต้องอ่านหลายบรรทัดหรือไม่? หรือมันเพียงพอหากอ่านหนึ่งบรรทัด?
Luis Mendo

1
ใช่รหัสต้องยอมรับหลายบรรทัด
Anush

5
@ mbomb007 คุณสามารถ downvote แต่ไม่ชอบรูปแบบอินพุตไม่ใช่เหตุผล VTC
Okx

คำตอบ:


7

MATL , 28 ไบต์

`jYb0&)YOd.5+wgU13L/- 15XODT

ลองออนไลน์!


1
มันน่าประทับใจมาก!
Anush

เอาต์พุตไม่ควรอยู่ในรูปแบบนี้"XXhr YYmin"หรือไม่?
อิบราฮิม mahrir

@ibrahimmahrir ความท้าทายที่กล่าวว่าการส่งออกรหัสสามารถของคุณในรูปแบบใด ๆ ของมนุษย์ได้อย่างง่ายดายอ่านที่สะดวกสำหรับคุณ
หลุยส์ Mendo

1
อ่าฉันเข้าใจแล้ว! ฉันจะแก้ไขคำตอบเพื่อย่อให้สั้นลง ขอบคุณ!
อิบราฮิม mahrir

5

เรติน่า 0.8.2 , 83 ไบต์

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

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

\d+
$*

แปลงอินพุตเป็น unary

 (1+:)
 12$*1$1

เพิ่ม 12 ชั่วโมงในเวลาหยุด

+`1:
:60$*

คูณชั่วโมงด้วย 60 และเพิ่มลงในนาที

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

ลบเวลาเริ่มต้นและเวลาพักออกจากเวลาหยุด

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

Divmod คูณ 60 (บันทึก 5 ไบต์สำหรับรูปแบบเอาต์พุตที่น่าเบื่อกว่า)



4

Python 3, 161 ไบต์

ฉันรู้ว่าสิ่งนี้จะไม่ได้ใกล้เคียงกับสิ่งที่เล็กที่สุด แต่มันจะอ่านในไฟล์:

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')

ฉันรู้สึกประชดเวลาหยุดชั่วคราวเพื่อทำสิ่งนี้ ...

Python 2.7, 133 ไบต์

ขอบคุณสำหรับคำแนะนำในความคิดเห็น! การสลับไปใช้ python 2.7 จะช่วยประหยัดอีกสองสามไบต์เนื่องจากเป็นค่าเริ่มต้นของการหารจำนวนเต็ม:

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 คือ 135 ไบต์เนื่องจากคำสั่งการพิมพ์และการตั้งค่าเริ่มต้นเป็นการหารแบบลอย:

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
คุณสามารถบันทึก 4 ไบต์โดยใส่i=intที่จุดเริ่มต้นและเปลี่ยนบรรทัดที่สามเป็นm=-i(l[0])*60+i(l[1][:2])+(i(l[1][3:])*60+720+i(l[2][:2])-i(l[2][2:]))
James

@DJMcMayhem ขอขอบคุณ! ฉันพยายามคิดหาวิธีที่จะทำให้สิ่งเหล่านั้นง่ายขึ้น ...
Ryan

2
คำตอบแรกที่ดีมากยินดีต้อนรับสู่ Programming Puzzles & Code Golf! เพื่อช่วยในการตีกอล์ฟเล็กน้อยคุณอาจสามารถรับข้อมูลจาก STDIN ใช้map(int,l[:-1].split(':'))และวางหลาย ๆ การแปลงเพื่อ int ยุบทุกอย่างเป็นหนึ่งซับโดยแทนที่การเยื้องกับ;ฯลฯ เพื่อบันทึกสองสามไบต์ นอกจากนี้คุณสามารถเยี่ยมชมเคล็ดลับสำหรับการเล่นกอล์ฟใน Pythonสำหรับเคล็ดลับที่ประณีตกว่าที่ผู้ใช้คนอื่นค้นพบในชีวิตนักกอล์ฟ :)
Mr. Xcoder

1
นอกจากนี้OP ดูเหมือนว่าจะมีข้อ จำกัด น้อยกว่าเกี่ยวกับรูปแบบผลลัพธ์ดังนั้นฉันคิดว่าprint(m,m%60)น่าจะพอเพียง (โปรดสังเกตการใช้งานm%60แทนm-(m//60*60))
Mr. Xcoder

@ Mr.Xcoder ขอบคุณ!
Ryan

4

C, 105 ไบต์

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);}

ตรงไปตรงมาโดยสิ้นเชิง ลองออนไลน์ได้ที่นี่ที่นี่

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"
}

แนะนำa,b,c,d;f(e)แทนa,b,c,d,e;f()และ;printf("%d:%d ",a/60,a%60))a=(12+c-a)*60+d-b-e;}แทนที่;)a=(12+c-a)*60+d-b-e,printf("%d:%d ",a/60,a%60);
ceilingcat

4

ภาษา Wolfram 125 125 111 111 ไบต์

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

บันทึก 8 ไบต์ด้วยผู้ใช้ 202729

ตัวอย่าง

ตัวย่อไม่ได้ใช้ที่นี่เพื่อให้ง่ายต่อการปฏิบัติตามตรรกะ

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

6 ชม. 51 นาที

Interpreter["Time"][#2 <> "pm"] ตีความตามเวลาที่พารามิเตอร์ตัวที่สองตามด้วย "pm" กล่าวคือในกรณีนี้คือ "16:12 pm" ส่งคืนค่าที่TimeObjectสอดคล้องกับ 16:12

-Interpreter["Time"][# <> "am"])[[1]] - #3/60]. #3เป็นพารามิเตอร์ที่สามคือ 20 นาที เครื่องหมายลบจะลบช่วงเวลาอาหารกลางวันออกจากเวลาสิ้นสุดการเลื่อน มันจะคืนค่าเวลาสิ้นสุดของการเลื่อนที่ปรับแล้วนั่นคือจุดสิ้นสุดของการเปลี่ยนแปลงที่จะนำไปใช้หากบุคคลนั้นไม่ได้พักทานอาหารกลางวัน

Interpreter["Time"][#] ตีความตามเวลาที่พารามิเตอร์แรกในกรณีนี้ "9:00" ส่งคืนค่าที่TimeObjectสอดคล้องกับ 9:00 am

การลบการกะเริ่มจากการสิ้นสุดของเวลากะที่ได้รับการปรับtช่วงเวลาแสดงเป็นชั่วโมง IntegerPart[t]ส่งคืนจำนวนชั่วโมงทำงานที่สมบูรณ์ IntegerPart[60 Mod[t,1]], "min"}]ส่งคืนนาทีเพิ่มเติมที่ใช้งานได้


ใช่. ขอบคุณ ครั้งแรกที่ฉันเห็นMod[x, 1]ใช้
DavidC

นำมาจากเคล็ดลับ (ลบ)นี้ / จริง mod 1 ทำงานแตกต่างจากส่วนที่เป็นเศษส่วนสำหรับจำนวนลบ / สามารถFloorใช้เพื่อIntegerPart?
user202729

Floor ส่งคืนผลลัพธ์ที่อธิบายไม่ได้ -6hr 52minสำหรับค่าตัวอย่างที่ฉันใช้ ฉันต้องพิจารณาเรื่องนี้เพื่อทำความเข้าใจว่าเหตุใดจึงสร้างค่าลบสำหรับชั่วโมง (และนาทีที่เห็นได้ชัด)
DavidC

3

JavaScript, 83 ไบต์ 76 ไบต์

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

เพิ่งกำจัด funtion จากด้านล่างวิธีแก้ปัญหา (ฉันกำลังคิดอะไรอยู่) เปลี่ยนรูปแบบเอาต์พุตเช่นกัน

ลองออนไลน์!


OLD: JavaScript, 112 ไบต์ 111 ไบต์ 110 ไบต์

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`)

คำอธิบาย:

ภายในฟังก์ชั่นหลักเราเริ่มต้นด้วยการกำหนดอีกอันที่จะช่วยเราคำนวณนาทีของเวลาให้เพิ่ม 12 ชั่วโมงในพารามิเตอร์ชั่วโมงถ้าพารามิเตอร์ที่สามเป็นความจริง:

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

ต่อไปเราจะแบ่งสตริงด้วย' 'หรือ':'จับคู่ตัวเลขภายในสตริงทำให้เกิดอาร์เรย์ของตัวเลขทั้งหมดในสตริง

จากนั้นเราคำนวณความแตกต่างของเวลาสิ้นสุดและเวลาเริ่มต้นและเวลาพักเที่ยงโดยใช้ฟังก์ชันที่กำหนดไว้ก่อนหน้านี้ (แปลงสตริงเป็นตัวเลขเมื่อจำเป็น)

ในที่สุดเราผลิตสตริงผลลัพธ์: ชั่วโมงนี้เป็นส่วนหนึ่งของจำนวนเต็มและนาทีr/60r%60

ลองออนไลน์!


@ Jakob ฉันเป็นผู้ใช้ codegolf คนใหม่ ฉันยังไม่รู้ว่าสิ่งต่างๆรอบตัวรวมถึง TIO ได้อย่างไร นอกจากนี้ฉันได้ถามในความคิดเห็นนี้ว่าฉันจะวิธีการนี้โดยใช้จาวาสคริปต์ แต่ไม่มีใครตอบ
อิบราฮิม mahrir

@Jakob TIO แก้ไขแล้ว และฉันไม่ได้ใช้ NodeJS ฉันใช้คอนโซลของเบราว์เซอร์ เพิ่ม NodeJS โดย TIO
อิบราฮิม mahrir

ยังไม่แน่ใจว่าวิธีการป้อนข้อมูลถูกต้องตามกฎหมาย (คำถามนี้เป็นข้อ จำกัด ที่น่าเสียดาย) แต่เราอาจต้องการนักกอล์ฟ JS ที่มีประสบการณ์มากขึ้นในการพูดสอด แต่ก็โปรดทราบว่าโปรแกรมจำเป็นต้องรองรับข้อมูลอินพุตหลายวัน - โชคไม่ดี ชัดเจนมากในคำอธิบาย
Jakob

@Jakob ถ้าวันควรจะใช้เป็น input ฉันเพียงแค่จะทำให้ฟังก์ชั่นยอมรับอาร์เรย์และการใช้งาน:map a=>a.map(...)มันจะเพิ่ม 5 ไบต์คำตอบของฉัน แต่ฉันยังคงรอการตอบรับ OP (หรือใครก็ได้) เพื่อแสดงความคิดเห็นของฉัน
ibrahim mahrir

เนื่องจาก JavaScript ที่แท้จริงไม่สามารถเข้าถึงอินพุตหรือไฟล์มาตรฐานได้ฉันขอแนะนำให้คุณใช้วิธีการเริ่มต้นของการใช้พรอมต์ GUI: codegolf.meta.stackexchange.com/a/2459/79343
OOBalance

3

Python 2 , 100 ไบต์

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

ลองออนไลน์!

โปรแกรมเต็มรูปแบบที่อ่านหลายบรรทัดจากไฟล์ข้อความตามที่กำกับโดย OP ฟังก์ชั่นที่แยกวิเคราะห์บรรทัดเดียวจะบันทึกการเพิ่ม 10 ไบต์


1
นี่เป็นวิธีที่ชัดเจนกว่าความพยายามของฉัน!
Ryan

3

Java 10, 194 191 ไบต์

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();}

I / O เจ็บปวดใน Java ยุติอย่างผิดปกติเมื่อไม่มีบรรทัดอินพุตถัดไปที่จะอ่าน ลองออนไลน์ได้ที่นี่

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
}

2

สีแดง 35 ไบต์

func[s e l][e + 12:0 - s -(l * 60)]

ลองออนไลน์!

หมายเหตุ: เอาต์พุตอยู่ในรูปแบบ hh:mm:ss


ว้าว! นี่เป็นเรื่องที่น่าประหลาดใจมาก :)
Anush

@Anush ใช่สีแดง (และแน่นอน Rebol) มีประเภทข้อมูลเวลาที่ดี
Galen Ivanov

2

R , 97 ไบต์

s=matrix(strtoi(unlist(strsplit(scan(,""),':'))),5,,T)%*%c(-60,-1,60,1,-1);paste(12+s%/%60,s%%60)

ลองออนไลน์!

สำหรับผลตอบแทนแต่ละบรรทัด "hours minutes"

  • -16 ไบต์ขอบคุณ JayCe!

ฉันพยายามใช้ a data.frameเพื่อบันทึกบางไบท์ - ไม่ถึงตอนนี้ แต่การเปลี่ยนแปลงง่าย ๆ นี้ก็ทำได้เช่นกัน :)
JayCe


ที่ดี! ขอบคุณ :)
digEmAll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.