Menghitung lembar waktu

14

Lembar waktu

Di tempat kerja Anda sering harus mengisi waktu. Tugas ini adalah menulis kode untuk membantu ini.

Memasukkan

Dua kali dalam jam 12 jam yang sedikit non-standar menandakan awal dan akhir hari dipisahkan oleh spasi. Angka ketiga mewakili jumlah menit yang diambil untuk makan siang. Sebagai contoh

9:14 5:12 30

Ini berarti Anda mulai bekerja pada jam 9:14 pagi, selesai bekerja pada jam 5:12 sore dan makan siang selama 30 menit.

Anda bisa berasumsi itu

  • Kapan saja dalam kolom pertama adalah dari pukul 00:00 (tengah malam) hingga tetapi tidak termasuk 13:00 dan setiap saat dalam kolom kedua adalah 13:00 paling awal hingga 11:59 malam.
  • Istirahat makan siang tidak lebih dari hari kerja!

Format input harus seperti pada contoh yang diberikan.

Tugas

Kode Anda harus dibaca dalam file (atau input standar) dari tiga kali lipat ini, dan untuk masing-masing output berapa lama Anda bekerja. Output ini harus menunjukkan jumlah jam. Untuk contoh di atas ini adalah:

7 jam dan 58 menit dikurangi 30 menit yaitu 7 jam 28 menit.

Keluaran

Output Anda harus menentukan jumlah (seluruh) jam dan menit dan tidak boleh mencantumkan lebih dari 59 menit. Itu adalah Anda tidak dapat menghasilkan 2 jam 123 menit. Selain itu, kode Anda dapat ditampilkan dalam format apa pun yang mudah dibaca dan nyaman untuk Anda.

Contohnya

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 
Anush
sumber
3
Saya tidak melihat bagaimana format input yang ketat ( :waktu terbatas pada jam 12 jam) menambah tantangan ini.
Shaggy
3
@Shaggy Parsing format input adalah sebagian besar tantangan bagi saya setidaknya, karena Anda tidak dapat mengambil posisi karakter karena jam dapat berupa satu atau dua karakter ...
Ryan
Apakah kode harus membaca beberapa baris? Atau apakah itu cukup jika membaca satu baris?
Luis Mendo
1
Ya kode harus menerima beberapa baris.
Anush
5
@ mbomb007 Anda dapat mengunduh, tetapi tidak menyukai format input bukan alasan untuk VTC.
Okx

Jawaban:

7

MATL , 28 byte

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

Cobalah online!

Luis Mendo
sumber
1
Ini sangat mengesankan!
Anush
Bukankah seharusnya output dalam format ini "XXhr YYmin"?
ibrahim mahrir
@ibrahimmahrir Tantangannya mengatakan kode Anda dapat menampilkan dalam format apa pun yang mudah dibaca oleh manusia yang nyaman bagi Anda
Luis Mendo
1
Ah, begitu! Saya akan mengedit jawaban saya untuk mempersingkat. Terima kasih!
ibrahim mahrir
5

Retina 0.8.2 , 83 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

\d+
$*

Konversikan input ke unary.

 (1+:)
 12$*1$1

Tambahkan 12 jam ke waktu berhenti.

+`1:
:60$*

Lipat gandakan jam dengan 60 dan tambahkan ke menit.

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

Kurangi waktu mulai dan waktu istirahat dari waktu berhenti.

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

Divmod oleh 60. (Simpan 5 byte untuk format output yang lebih membosankan.)

Neil
sumber
5

Perl 5 -pl, 80 74 71 byte

/:(\d+) (\d+):(\d+) /;$m=720+($2-$`)*60+$3-$1-$';$_=($m/60|0).":".$m%60

Cobalah online!

sundar - Pasang kembali Monica
sumber
4

Python 3, 161 byte

Saya tahu ini bahkan tidak akan mendekati terkecil, tetapi ia membaca dalam file:

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

Saya merasakan ironi untuk menghentikan kartu absen saya untuk melakukan ini ...

Python 2.7, 133 byte

Terima kasih atas sarannya di komentar! Beralih ke python 2.7 menyimpan beberapa byte lagi karena defaultnya adalah pembagian integer:

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

Pendekatan yang sama dengan python3 adalah 135 byte karena pernyataan cetak dan default ke divisi float:

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)
Ryan
sumber
1
Anda bisa menghemat 4 byte dengan meletakkannya i=intdi awal dan mengubah baris ketiga kem=-i(l[0])*60+i(l[1][:2])+(i(l[1][3:])*60+720+i(l[2][:2])-i(l[2][2:]))
DJMcMayhem
@DJMcMayhem Terima kasih! Saya mencoba memikirkan cara untuk menyederhanakan itu ...
Ryan
2
Jawaban pertama yang sangat bagus, selamat datang di Programming Puzzles & Code Golf! Untuk sedikit membantu bermain golf, Anda mungkin dapat mengambil input dari STDIN, gunakan map(int,l[:-1].split(':'))dan jatuhkan beberapa konversi ke int, pisahkan semuanya menjadi satu baris dengan mengganti lekukan dengan ;dll untuk menyimpan beberapa byte. Selain itu, Anda dapat mengunjungi Tip untuk bermain golf di Python untuk beberapa trik lebih rapi yang ditemukan pengguna lain selama masa pegolf mereka :).
Tn. Xcoder
1
Selain itu, OP tampaknya kurang membatasi tentang format output , jadi saya pikir print(m,m%60)sudah cukup. (Perhatikan juga penggunaan m%60di tempat m-(m//60*60))
Tn. Xcoder
@ Mr.Xcoder Terima kasih!
Ryan
4

C, 105 byte

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

Benar-benar mudah. Cobalah online di sini .

Tidak Disatukan:

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"
}
Ketidakseimbangan
sumber
Sarankan a,b,c,d;f(e)alih-alih a,b,c,d,e;f()dan ;printf("%d:%d ",a/60,a%60))a=(12+c-a)*60+d-b-e;}bukannya;)a=(12+c-a)*60+d-b-e,printf("%d:%d ",a/60,a%60);
ceilingcat
4

Bahasa Wolfram 125 119 111 byte

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

8 byte disimpan berkat pengguna 202729

Contoh

Singkatan tidak digunakan di sini, untuk membuatnya lebih mudah untuk mengikuti logika.

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 jam 51 menit

Interpreter["Time"][#2 <> "pm"] menafsirkan sebagai parameter kedua diikuti oleh "pm", yaitu, dalam hal ini, "4:12 pm", mengembalikan yang TimeObjectsesuai dengan 4:12 pm.

-Interpreter["Time"][# <> "am"])[[1]] - #3/60]. #3adalah parameter ketiga, yaitu 20 menit. Tanda minus mengurangi interval jam makan siang dari akhir waktu shift. Ini mengembalikan akhir waktu shift yang disesuaikan, yaitu, akhir shift yang berlaku jika orang tersebut tidak mengambil istirahat makan siang.

Interpreter["Time"][#] menafsirkan sebagai parameter pertama kali, dalam hal ini, "9:00", mengembalikan yang TimeObjectsesuai dengan 9:00 pagi.

Mengurangi shift mulai dari hasil penyesuaian waktu shift yang disesuaikan t, interval waktu dinyatakan dalam jam. IntegerPart[t]mengembalikan jumlah jam kerja lengkap. IntegerPart[60 Mod[t,1]], "min"}]mengembalikan menit tambahan yang berhasil.

DavidC
sumber
Iya. Terima kasih. Pertama kali saya lihat Mod[x, 1]digunakan.
DavidC
Diambil dari kiat (dihapus) ini . / Sebenarnya mod 1 berperilaku berbeda dari bagian pecahan untuk angka negatif. / Bisa Floordigunakan untuk apa IntegerPart?
user202729
Floor mengembalikan, bagi saya, hasil yang tidak dapat dijelaskan -6hr 52minuntuk nilai sampel yang saya gunakan. Saya perlu melihat ini untuk memahami mengapa nilai negatif selama berjam-jam (dan tampaknya menit) diproduksi.
DavidC
3

JavaScript, 83 byte 76 byte

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

Baru saja menyingkirkan fungsi batin dari solusi di bawah ini (Apa yang saya pikirkan?). Mengubah format output juga.

Cobalah online!


TUA: JavaScript, 112 byte 111 byte, 110 byte

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

Penjelasan:

Di dalam fungsi utama, kita mulai dengan mendefinisikan yang lain yang akan membantu kita menghitung menit waktu pemberian, menambahkan 12 jam ke parameter jam jika parameter ketiga benar:

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

Selanjutnya, kami membagi string dengan salah satu ' 'atau':' mencocokkan angka di dalam string yang menghasilkan array dari semua angka dalam string.

Kemudian kita menghitung perbedaan waktu akhir dan waktu mulai dan mengurangi waktu makan siang menggunakan fungsi yang didefinisikan sebelumnya (mengubah string menjadi angka bila diperlukan).

Akhirnya kami menghasilkan string hasil: jam adalah bagian integer r/60dan menit adalah r%60.

Cobalah online!

ibrahim mahrir
sumber
@ Jakob Saya pengguna codegolf baru. Saya masih tidak tahu bagaimana hal-hal di sekitar sini termasuk TIO. Saya juga bertanya dalam komentar ini bagaimana saya akan mendekati ini menggunakan javascript tapi tidak ada yang menjawab
ibrahim mahrir
@ Jakob TIO diperbaiki. Dan saya tidak menggunakan NodeJS, saya menggunakan konsol browser. NodeJS ditambahkan oleh TIO.
ibrahim mahrir
Masih tidak yakin metode input itu legal (pertanyaan ini sayangnya membatasi), tetapi kita mungkin perlu pegolf JS yang lebih berpengalaman untuk berpadu. Tetapi juga perhatikan bahwa program perlu mendukung data input beberapa hari - sayangnya itu tidak dibuat sangat jelas dalam uraiannya.
Jakob
@Jakob Jika hari lagi harus digunakan sebagai masukan saya hanya bisa membuat fungsi menerima array dan penggunaan map: a=>a.map(...). Ini akan menambah 5 byte jawaban saya. Tetapi saya masih menunggu tanggapan OP (atau siapa pun) terhadap komentar saya.
ibrahim mahrir
Karena murni JavaScript tidak memiliki akses ke input atau file standar , saya sarankan Anda menggunakan metode default menggunakan prompt GUI: codegolf.meta.stackexchange.com/a/2459/79343
OOBalance
3

Python 2 , 100 byte

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

Cobalah online!

Program lengkap yang membaca banyak baris dari file teks, seperti yang diarahkan oleh OP. Sebuah fungsi yang hanya mem-parsing satu baris akan menghemat tambahan al 10 byte.

Chas Brown
sumber
1
Ini juga jauh lebih mudah dibaca daripada upaya saya!
Ryan
3

Java 10, 194 191 byte

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 menyakitkan di Jawa. Berakhir secara abnormal ketika tidak ada baris input berikutnya untuk dibaca. Cobalah online di sini .

Tidak Disatukan:

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
}
Ketidakseimbangan
sumber
2

Merah , 35 byte

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

Cobalah online!

Catatan: Output dalam format hh:mm:ss

Galen Ivanov
sumber
Wow! Ini sangat mengejutkan :)
Anush
@Anush Ya, Merah (dan tentu saja Rebol) memiliki tipe data waktu yang bagus.
Galen Ivanov