稼働週の完了


8

私は標準的な9から5まで働きます。月曜日から金曜日まで。昼食は12時30分から13時まで30分。

実行すると、現在の週に完了した稼働週のパーセンテージを計算するプログラムを書いてください。

ルール

  • 実際に作業に費やした時間のみをカウントします。私は時間厳守で昼食をとりません。
  • 入力なし。現在の日時などの情報を取得できますが、便利です。
  • 稼働週は、金曜日の終わりから日曜日と月曜日の真夜中に完了すると見なされます。
  • タイムゾーンはローカルタイムゾーンです。
  • 出力は10進数である必要があります(例:66.25498、パーセント記号はオプション)。
  • プログラムは合理的に将来に対応できるものでなければなりません。うるう年にも対応できるはずです。
  • 出力解像度は1秒以上である必要があります。やかんが沸騰するのを見るのが好きです。
  • コードゴルフ。最短のコードが勝ちます。

1
あなたのタイムゾーンは何ですか?ローカルシステム?GMT?ああ、土曜日と日曜日の真夜中ですか、それとも日曜日と月曜日ですか?
Ilmari Karonen、2012

ルールを更新しました。現地時間、および日曜日/月曜日の午前0時。
skeevey 2012

昼休みに賃金を稼いでいますか?
DavidC 2012

それが違いを生むとは思いませんか?
skeevey 2012

もしあなたが昼食を
とっ

回答:


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

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

解像度は1分、つまり2/45パーセントです。それは十分なIMOです。


5

エクセル、132129123119、117

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

セルA4を%としてフォーマットして、正しいフォーマットを取得します

週40時間の有給の昼食:

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

1つ目はNOW()、午後5時を過ぎると機能しないようです。
ガフィ

augh-a * 24が間違った位置に.....
SeanC '21

:-)ちなみに、代わりに数式を使用して私のVBAアプローチで最高の仕事をしてくれました。さて、私は細心の注意を払っています...あなたのアップデート0は不要な文字()を追加しました!
Gaffi

私の言い訳は、私が5時以降かなり長い間仕事をしていないことです:D
SeanC 2012

2

Perl、124文字

OK、簡単な最初のソリューションで標準を設定します。

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)

で実行しperl -M5.010てPerl 5.10+ say機能を有効にします。解像度は1秒です。1分の解像度が許容できる場合は、+$s/3600パーツを削除して全長116文字にすることができます。

このソリューションはlocaltimeを使用して曜日と時刻を取得するため、少なくとも7日間の週の周期が変わらない限り、年の変更、うるう日、その他のカレンダーの特性に関係なく機能します。平日のDSTの変更は少し混乱しますが、それは基本的にとにかく起こることはありません。おそらくそれがあまりにも多くの混乱につながるためと考えられます。

(テストの便宜上、localtimeはオプションの引数としてUnixタイムスタンプを受け入れることに注意してください。)


2

Mathematica 169168212214 211 218210190文字

コード・ゴルフ基準による長続きします。

以下では、月または年の境界をまたぐ就業週と、うるう年を考慮しています。作業時間は、時間と分に従って計算されます。

曜日を綴るのを避ける方法が思いつきませんでした。Mathematicaは曜日を3文字の文字列として返します。これは数値に変換する必要があります。

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

脱ゴルフ

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

労働週


2

VBA 141

イミディエイトウィンドウから実行するようにフォーマットされています。10文字の改善を指摘してくれたSean Cheshireに感謝します。

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

n = n * 24を使用すると、さらに削減できます。それとの私の戦いはこれを生み出しました: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 '22

@SeanCheshire素晴らしいポイント!私のメソッドには、nを使用した以前のバージョンの構文が残っているため、変更できませんでした。
ガフィ

1

R、115文字

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

これは1週間のシミュレーションです。

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

今週の週の完了


1

ルビー、191 116、115 113

ロジックは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

単体テストでコードをテストする場合は、次の143文字のソリューションが必要です。

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

最短で最も効率的なコードではありませんが、単体テストを使用しています;)

191文字には改行が含まれます(1行にすることもできますが、各改行をに置き換えます;)。

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

そしてテストコード:

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文字

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)

3回目の試みは弱いソースですが、論理は正しいと思います。


1
これは機能しません。出力を一目で見ると、パーセンテージが同じままである長期間はありません。これは、毎日の午後5時から翌日の午前9時まで、および12時30分ごとに当てはまります。 -1:00 PM間隔。また、負の数と100を超える数を出力することもあります。
Fraxtil 2012

ああ、恥ずかしい。あなたは絶対的に正しいです。マリガン。
12

@Fraxtil私はあなたを髪の毛で突き刺したと思います
チャックスマッシュ

この範囲は0〜37.5のようです。ただし、適切な間隔で一時停止します。
Fraxtil 2012

ああ、デバッグの時間数を出力するように設定しました。答えを%に変更するのを忘れました。2文字ではそれができないと思うので、結局あなたは私を手に入れたと思います
チャックスマッシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.