Penyelesaian Minggu Kerja

8

Saya mengerjakan standar sembilan sampai lima. Senin sampai Jumat. Saya membutuhkan waktu setengah jam untuk makan siang mulai pukul 12:30 hingga 13:00.

Tuliskan saya sebuah program yang, ketika dijalankan, menghitung persentase minggu kerja yang telah saya selesaikan saat ini.

Aturan

  • Hanya menghitung waktu yang benar-benar dihabiskan untuk bekerja. Saya tepat waktu dan tidak bekerja saat makan siang.
  • Tidak ada input Anda dapat memperoleh informasi seperti waktu / tanggal saat ini namun nyaman.
  • Minggu kerja dianggap selesai dari Jumat siang hingga tengah malam antara Minggu dan Senin.
  • Zona waktu adalah zona waktu lokal.
  • Output harus berupa angka desimal, mis. 66.25498, simbol persentase opsional.
  • Program ini harusnya cukup tahan di masa depan. Seharusnya bisa mengatasi tahun kabisat.
  • Resolusi keluaran harus sedetik atau lebih baik. Saya suka menonton ketel mendidih.
  • Golf kode. Kode terpendek menang.
skeevey
sumber
1
Apa zona waktu Anda? Sistem lokal? WAKTU GREENWICH? Oh, dan apakah tengah malam itu antara Sabtu dan Minggu atau Minggu dan Senin?
Ilmari Karonen
Saya memperbarui aturan. Waktu setempat, dan Minggu / Senin tengah malam.
skeevey
Apakah Anda mendapat upah saat istirahat makan siang?
DavidC
Saya tidak berpikir itu akan membuat perbedaan?
skeevey
jika Anda sedang makan siang, Anda tidak bekerja, oleh karena itu, saya kira pada 37,5 jam seminggu kerja
SeanC

Jawaban:

4

Q, 111 102

0|100*("i"$(27000000*((.z.d)mod 7)-2)+{0|((17:00:00&x)-09:00:00)-0|00:30:00&x-12:30:00}.z.t)%135000000
tmartin
sumber
5

Python 3, 132

from datetime import*
t=datetime.now().timetuple()
m=max(0,t[3]*2+t[4]/30-18)
print(20*min(5,(t[6]+min(15,m-min(8,max(7,m))+7)/15)))

Resolusi adalah satu menit, atau 2/45 persen. Itu lebih dari cukup IMO.

Fraxtil
sumber
5

Excel, 132 , 129 , 123 , 119 , 117

rekatkan ke A2: A4

=NOW()
=A2-INT(A2)-.375
=(WEEKDAY(A2,3)*7.5+IF(A3<0,0,IF(A3>TIME(8,0,0),7.5,(A3-IF(A3>.1875,TIME(0,30,0),0))*24)))/37.5

format sel A4 sebagai% untuk mendapatkan format yang benar

Makan siang berbayar 40 jam kerja:

88 , 81

=NOW()
=A1-INT(A1)-.375
=(WEEKDAY(A1,3)*8+IF(A2<0,0,IF(A2>TIME(8,0,0),8,A2*24)))/40
SeanC
sumber
Yang pertama tampaknya tidak berfungsi saat NOW()setelah pukul 17:00.
Gaffi
augh - a * 24 di posisi yang salah .....
SeanC
:-) BTW, pekerjaan yang bagus mengalahkan saya pada pendekatan VBA saya menggunakan formula sebagai gantinya. Sekarang saya tertarik ... Pembaruan Anda menambahkan char ( 0) yang tidak perlu!
Gaffi
alasan saya adalah saya belum berada di tempat kerja setelah jam 5:00 untuk waktu yang cukup lama: D
SeanC
2

Perl, 124 karakter

OK, solusi pertama yang sederhana untuk mengatur par:

say(($p=((($s,$m,$h,@t)=localtime)[6]+6)%7*20+(($h+=$m/60+$s/3600-9)<0?0:$h<3.5?$h:$h<4?3.5:$h<8?$h-.5:7.5)*8/3)<100?$p:100)

Jalankan dengan perl -M5.010untuk mengaktifkan fitur Perl 5.10+ say. Resolusi adalah satu detik; jika resolusi satu menit dapat diterima, +$s/3600bagian itu dapat dihapus dengan total panjang 116 karakter .

Solusi ini digunakan localtimeuntuk mendapatkan hari dalam seminggu dan waktu dalam sehari, jadi itu harus bekerja terlepas dari perubahan tahun, hari kabisat atau keanehan kalender lainnya, setidaknya selama siklus tujuh hari seminggu tidak berubah. Perubahan DST selama hari kerja akan sedikit membingungkan, tetapi hal itu pada dasarnya tidak pernah terjadi, mungkin karena itu akan menyebabkan terlalu banyak kebingungan.

(Untuk kenyamanan pengujian, perhatikan bahwa localtimemenerima cap waktu Unix sebagai argumen opsional.)

Ilmari Karonen
sumber
2

Mathematica 169 168 212 214 211 211 210 210 karakter

Bertele-tele, dengan kode Standar golf.

Berikut ini memperhitungkan minggu kerja yang melintasi batas bulan atau tahun, serta tahun kabisat. Ini menganggap waktu bekerja sesuai dengan jam dan menit.

Saya tidak bisa memikirkan cara untuk menghindari mengeja hari dalam seminggu. Mathematica mengembalikan hari dalam seminggu sebagai string 3 karakter, yang harus dikonversi ke angka.

h = Plus @@ {#1, #2/60, #3/3600} & @@ Take[DateList[], -3]; 100*Min[37.5, (StringTake[DateString[], 3] /. {"Mon" -> 0, "Tue" -> 1, "Wed" -> 2 , "Thu" -> 3, "Fri" -> 4, _ -> 5})*7.5 + Which[h < 12.5, Max[0, h - 9], h < 13, 4, True, 4 + Min[h - 13, 4]]]/37.5

De-golf

(* d returns {year, mo, day, h, m, s}   *)
d = DateList[]

(* finished Days: hours worked *)
f = (StringTake[DateString[],  3] /. {"Mon" -> 0, "Tue" -> 1, "Wed" -> 2 , "Thu" -> 3, "Fri" -> 4, _ -> 5})*7.5

(* time of day in hours *)
h = Plus @@ {#1, #2/60} & @@ Take[d, -3]

(* today: hours Worked. It also computes hours for Sat and Sunday but does not use 
them in the final tabulation, which has a maximum of 37.5. *)
t = Which[h < 12.5, Max[0, h - 9], h < 13, 4, _, 4 + Min[h - 13, 4]]

(* hours Worked in week *)
tot = Min[37.5, f + t]

(* % of working week completed *)
100*tot/37.5

minggu kerja

DavidC
sumber
2

VBA 141

Diformat untuk dijalankan dari jendela langsung. Terima kasih kepada Sean Cheshire karena menunjukkan peningkatan 10-arang!

n=(Now-Int(Now))*24:a=(Weekday(Now,3)*7.5+IIf(n>17,7.5,IIf(n>9,IIf(n<12.5,n,IIf‌​(n>13,n-.5,n))-9,0)))/37.5:MsgBox Format(IIf(a>1,1,a),".0%")
Gaffi
sumber
gunakan n = n * 24, dan itu bisa dikurangi lagi. Perjuangan saya dengan itu menghasilkan ini: n=(Now-Int(Now))*24:a=(Weekday(Now,3)*7.5+IIf(n>17,7.5,IIf(n>9,IIf(n<12.5,n,IIf(n>13,n-.5,n))-9,0)))/37.5:MsgBox Format(IIf(a>1,1,a),".0%")@ 139
SeanC
@SeanCheshire Poin luar biasa! Metode saya memiliki beberapa sintaks sisa dari versi sebelumnya yang menggunakan n, jadi tidak bisa dimodifikasi.
Gaffi
1

R, 115 karakter

---------1---------2---------3---------4---------5---------6---------7---------8---------9---------0---------1---------2
T=as.POSIXlt(Sys.time()-86400);z=T$h+T$mi/60-9;D=function(x,M)min(M,max(0,x));D(((D(z,8)-D(z-3.5,.5))/7.5+T$w)/5,1)

Berikut ini adalah simulasi satu minggu:

week.frac <- function(t) {
   T <- as.POSIXlt(t-86400)
   z <- T$h+T$mi/60-9
   D <- function(x,M)min(M,max(0,x))
   D(((D(z,8)-D(z-3.5,.5))/7.5+T$w)/5,1)
}

time <- seq(from = as.POSIXlt(as.Date("2012-08-20")),
            to   = as.POSIXlt(as.Date("2012-08-27")),
            by   = "min")
week.completion <- sapply(time, week.frac)
plot(time, week.completion, type = "l")

minggu selesai untuk minggu ini

flodel
sumber
1

Ruby, 191 116.115 113

Logikanya dicuri dari solusi Fraxtils Python .

t=Time.now
d=t.wday
m=[0,t.hour*2+t.min/3e1-18].max
p d<1?100:20*[5,(d-1+[15,m-[8,[7,m].max].min+7].min/15)].min

Jika Anda ingin menguji kode dengan unit test, Anda memerlukan solusi 143 karakter ini:

class Time  
def r
m=[0,hour*2+min/3e1-18].max
d=wday
d<1?100:20*[5,(d-1+[15,m-[8,[7,m].max].min+7].min/15)].min
end    
end
p Time.now.r

Bukan kode terpendek dan paling efisien, tetapi dengan unit test;)

191 karakter termasuk baris baru (saya bisa membuatnya satu baris, cukup ganti setiap baris baru dengan a ;).

class Time
def r
i=0
d{|t|i+=t.w}
i/1350.0
end
def d
t=dup
yield t-=1 until t.strftime('%w%T')=='109:00:00'
end
def w
h=hour
wday<1||wday>5||h<9||h>16||h==12&&min>29?0:1
end
end
p Time.now.r

Dan kode tes:

require 'test/unit'
class MyTest < Test::Unit::TestCase
  def test_mo
    assert_equal( 20, Time.new(2012,8,13,20).r) #monday
  end
  def test_tue
    assert_equal( 40, Time.new(2012,8,14,20).r) #tuesday
  end
  def test_wed_morning
    assert_equal( 40, Time.new(2012,8,15,7).r)
  end
  def test_wed
    assert_equal( 60, Time.new(2012,8,15,20).r)
  end
  def test_thu
    assert_equal( 80, Time.new(2012,8,16,20).r)
  end
  def test_fri
    assert_equal(100, Time.new(2012,8,17,20).r)
  end
  def test_sat
    assert_equal(100, Time.new(2012,8,18,20).r)
  end
  def test_sun
    assert_equal(100, Time.new(2012,8,19,20).r)
  end
  def test_middle
    assert_equal(50, Time.new(2012,8,15,13,15).r)
  end
end
knut
sumber
0

Python 2 130 karakter

from datetime import*
t=datetime.now().timetuple();
m=min
a=max
n=t[3]+t[4]/60.0
print m(17,a(9,n))-9-(a(0,m(.5,n-12.5)))+7.5*m(t[6],4)

Upaya ketiga saya adalah saus yang lemah tapi saya pikir saya sudah mendapatkan logika yang benar.

chucksmash
sumber
1
Ini tidak berhasil. Sekilas tentang output, tidak ada periode waktu yang panjang di mana persentasenya tetap sama, yang seharusnya menjadi kasus antara jam 17:00 setiap hari hingga jam 9:00 hari berikutnya, serta setiap jam 12:30 -1: 00 PM interval. Ini juga menampilkan angka negatif dan angka lebih besar dari 100 pada suatu waktu.
Fraxtil
Oh, malu pada saya. Anda benar sekali. Mulligan.
chucksmash
@Fxtxtil Saya pikir saya telah mengalahkan Anda dengan rambut
chucksmash
Ini tampaknya memiliki kisaran 0 hingga 37,5. Itu berhenti selama interval yang sesuai, meskipun.
Fraxtil
Oh saya sudah mengatur untuk mencetak jumlah jam untuk debugging. Saya lupa mengubahnya ke% untuk jawaban. Saya kira saya tidak akan bisa melakukan itu dalam 2 karakter jadi saya kira Anda mendapatkan saya setelah semua
chucksmash