Hoàn thành tuần làm việc


8

Tôi làm việc một tiêu chuẩn chín đến năm. Từ thứ Hai đến thứ sáu. Tôi dành nửa giờ cho bữa trưa từ 12:30 đến 13:00.

Viết cho tôi một chương trình, khi chạy, tính toán tỷ lệ phần trăm của tuần làm việc mà tôi đã hoàn thành vào thời điểm hiện tại.

Quy tắc

  • Chỉ tính thời gian thực sự dành cho công việc. Tôi đúng giờ và không làm việc quá trưa.
  • Không có đầu vào. Bạn có thể có được thông tin như thời gian / ngày hiện tại tuy nhiên thuận tiện.
  • Tuần làm việc được coi là hoàn thành từ thứ Sáu cuối ngày đến nửa đêm giữa Chủ Nhật và Thứ Hai.
  • Múi giờ là múi giờ địa phương.
  • Đầu ra phải là một số thập phân, ví dụ 66,25498, ký hiệu phần trăm tùy chọn.
  • Chương trình nên được chứng minh hợp lý trong tương lai. Nó sẽ có thể đối phó với năm nhuận.
  • Độ phân giải đầu ra phải là thứ hai hoặc tốt hơn. Tôi thích xem ấm đun nước sôi.
  • Mã golf. Mã ngắn nhất sẽ thắng.

1
Múi giờ của bạn là gì? Hệ thống cục bộ? GMT? Ồ, và đó là nửa đêm giữa Thứ Bảy và Chủ Nhật hay Chủ Nhật và Thứ Hai?
Ilmari Karonen

Tôi cập nhật các quy tắc. Giờ địa phương, và Chủ nhật / Thứ Hai nửa đêm.
hoài nghi

Bạn có kiếm được tiền lương trong giờ nghỉ trưa không?
DavidC

Tôi không nghĩ rằng điều đó sẽ làm cho một sự khác biệt?
hoài nghi

nếu bạn đang ăn trưa, bạn không làm việc, do đó, tôi đoán là vào tuần làm việc 37,5 giờ
SeanC

Câu trả lời:


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

5

Con trăn 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)))

Độ phân giải là một phút, hoặc 2/45 phần trăm. Thế là quá đủ IMO.


5

Excel, 132 , 129 , 123 , 119 , 117

dán vào 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

định dạng ô A4 là% để có định dạng đúng

40 giờ làm việc trong tuần - Trả tiền ăn trưa:

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

Cái đầu tiên không xuất hiện khi hoạt động NOW()sau 5 giờ chiều.
Gaffi

augh - a * 24 ở vị trí sai .....
SeanC

:-) BTW, công việc tốt cho tôi theo cách tiếp cận VBA của tôi bằng cách sử dụng các công thức thay thế. Bây giờ tôi đang nitpicking ... Bản cập nhật của bạn đã thêm một char ( 0) không cần thiết!
Gaffi

lý do của tôi là tôi đã không làm việc sau 5:00 khá lâu: D
SeanC

2

Perl, 124 ký tự

OK, giải pháp đơn giản đầu tiên để đặt mệnh:

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)

Chạy với perl -M5.010để kích hoạt saytính năng Perl 5.10+ . Nghị quyết là một giây; nếu độ phân giải một phút là chấp nhận được, +$s/3600phần có thể bị xóa trong tổng chiều dài là 116 ký tự .

Giải pháp này sử dụng localtimeđể có được ngày trong tuần và thời gian trong ngày, do đó, nó sẽ hoạt động bất kể thay đổi năm, ngày nhuận hay bất kỳ đặc thù nào khác trong lịch, ít nhất là miễn là chu kỳ bảy ngày không thay đổi. Những thay đổi DST trong ngày làm việc sẽ hơi gây nhầm lẫn, nhưng về cơ bản chúng không bao giờ xảy ra, có lẽ chính xác là vì điều đó sẽ dẫn đến quá nhiều nhầm lẫn.

(Để thuận tiện cho việc kiểm tra, lưu ý rằng localtimechấp nhận dấu thời gian Unix làm đối số tùy chọn.)


2

Mathematica 169 168 212 214 211 218 210 190 chars

Gió dài, theo tiêu chuẩn golf mã.

Sau đây sẽ tính đến các tuần làm việc vượt qua ranh giới tháng hoặc năm, cũng như năm nhuận. Nó tính toán thời gian làm việc theo giờ và phút.

Tôi không thể nghĩ ra cách nào để tránh đánh vần những ngày trong tuần. Mathematica trả về ngày trong tuần dưới dạng chuỗi 3 ký tự, phải được chuyển đổi thành số.

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

Bỏ chơi gôn

(* 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

tuần làm việc


2

VBA 141

Định dạng để chạy từ cửa sổ ngay lập tức. Cảm ơn Sean Cheshire đã chỉ ra một cải tiến 10 char!

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%")

sử dụng n = n * 24, và nó có thể giảm hơn nữa. cuộc chiến của tôi với nó đã tạo ra điều này: 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 Điểm tuyệt vời! Phương thức của tôi có một số cú pháp còn sót lại từ một phiên bản trước đó đã sử dụng n, vì vậy nó không thể được sửa đổi.
Gaffi

1

R, 115 ký tự

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

Đây là một mô phỏng một tuần:

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

tuần hoàn thành cho tuần hiện tại


1

Ruby, 191 116,115 113

Logic bị đánh cắp từ giải pháp 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

Nếu bạn muốn kiểm tra mã bằng kiểm tra đơn vị, bạn cần giải pháp 143 ký tự này:

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

Không phải là mã ngắn nhất và hiệu quả nhất, nhưng với một bài kiểm tra đơn vị;)

191 ký tự bao gồm các dòng mới (tôi có thể biến nó thành một lớp lót, chỉ cần thay thế mỗi dòng mới bằng một ;).

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

Và mã kiểm tra:

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

0

Python 2 130 ký tự

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)

Nỗ lực thứ ba của Meh là nước sốt yếu nhưng tôi nghĩ tôi đã hiểu logic.


1
Điều này không hoạt động. Nhìn thoáng qua về đầu ra, không có khoảng thời gian dài mà tỷ lệ phần trăm vẫn giữ nguyên, đó là trường hợp giữa 5:00 PM mỗi ngày đến 9:00 sáng ngày hôm sau, cũng như mỗi 12:30 -1: 00 giờ chiều. Nó cũng xuất ra số âm và số lớn hơn 100 lần.
Fraxtil

Ôi, xấu hổ với tôi. Bạn hoàn toàn đúng. Mulligan.
chucksmash

@Fraxtil Tôi nghĩ rằng tôi đã
nhổ

Điều này dường như có một phạm vi từ 0 đến 37,5. Nó không tạm dừng trong khoảng thời gian thích hợp, mặc dù.
Fraxtil

Ồ tôi đã cài đặt nó để in ra số giờ để gỡ lỗi. Tôi quên thay đổi nó thành% để trả lời. Tôi đoán tôi sẽ không thể làm điều đó trong 2 ký tự vì vậy tôi đoán rằng bạn đã nhận được tôi sau tất cả
chucksmash
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.