한 달의 근무일 비율 Output 2010-06

1 년 1 개월이 주어진 경우 해당 월의 근무일 비율을 찾으십시오. 공휴일 또는 기타 특별한 사항에 관계없이 월요일부터 금요일까지 근무일입니다. 그레고리력이 사용됩니다.

입력

ISO 8601 형식 (YYYY-MM)의 연도 및 월 연도에는 항상 네 자리 숫자가 있고 월에는 항상 두 자리 숫자가 있습니다. 주어진 연도는 1582 년 이전이 아닙니다.

산출

출력은 주어진 달의 근무일 비율 (위의 정의에 따라)이며 정수로 반올림됩니다. 뒤에 백분율 부호 나 소수가 없습니다.

샘플 1

Input                Output

2010-05              68

샘플 2

Input                Output

2010-06              73

샘플 3

Input                Output

1920-10              68

샘플 4

Input                Output

2817-12              68

일주일이 지났는데 답이 받아 들여졌습니다. 궁금한 점은 컨테스트에 제출 된 제출물의 크기입니다.

129 – Z 쉘
174 – VB.NET
222 – C
233 – C
300 – C

당사의 자체 (비 랭킹) 솔루션 :

  75 – PowerShell
  93 – Ruby
112 – Bourne 쉘



답변

64 비트 Perl, 67 68

Perl 5.10 이상 perl -E 'code here'또는perl -M5.010 filename

map{$d++,/^S/||$w++if$_=`date -d@ARGV-$_`}1..31;say int.5+100*$w/$d

코드 크기에 대한 양보 :

  • 로케일 구분 : date출력이 대문자 S로 시작하지 않는 날을 작업 일로 계산 LC_ALL=C합니다. 의심스러운 경우 실행 합니다.
  • 출력은 순수하고 형식이 양호하지만 31 2> /dev/null일 보다 짧은 달에 stderr에 “쓰레기”가 있습니다.
  • 어떤 이유로 내 버전은 date2817-12를 유효하지 않은 달로 간주합니다. 누가 새로운 GNU 묵시록이 나올지 알았습니다! date2038 이후의 날짜 에는 64 비트 빌드가 필요합니다. (Joy 감사합니다)

답변

PHP-135

며칠 전에 비슷한 문제 가 있었기 때문에 PHP로 만들었습니다 .

<?php $a=array(2,3,3,3,2,1,1);$t=strtotime($argv[1]);$m=date(t,$t);echo round((20+min($m-28,$a[date(w,strtotime('28day',$t))]))/$m*100)

(일부) 문자열로 사용되는 상수에 대한 통지없이 더 명확하게 :

<?php
date_default_timezone_set('America/New_York');
$additionalDays = array(2, 3, 3, 3, 2, 1, 1);
$timestamp = strtotime($argv[1]);
$daysInMonth = date('t', $timestamp);
$limit = $daysInMonth - 28;
$twentyNinthDayIndex = date('w', strtotime("+28 days", $timestamp));
$add = $additionalDays[$twentyNinthDayIndex];
$numberOfWorkDays = 20 + min($limit, $add);
echo round($numberOfWorkDays / $daysInMonth * 100);
?>

이것은 매우 간단한 알고리즘으로 한 달에 작업 일수를 계산할 수 있습니다.


답변

파이썬 152 문자

from calendar import*
y,m=map(int,raw_input().split('-'))
c=r=monthrange(y,m)[1]
for d in range(1,r+1):
 if weekday(y,m,d)>4:c-=1
print '%.f'%(c*100./r)

답변

배쉬 + coreutils, 82 바이트

f()(cal -NMd$1|sed -n "s/^$2.//p"|wc -w)
dc -e`f $1 "[^S ]"`d`f $1 S`+r200*r/1+2/p

답변

윈도우 PowerShell, 80

$x=$args;1..31|%{"$x-$_"|date -u %u -ea 0}|%{$a++
$b+=!!($_%6)}
[int]($b*100/$a)

답변

D : 186 자

auto f(S)(S s){auto d=Date.fromISOExtendedString(s~"-28"),e=d.endOfMonth;int n=20;while(1){d+=dur!"days"(1);if(d>e)break;int w=d.dayOfWeek;if(w>0&&w<6)++n;}return rndtol(n*100.0/e.day);}

더 읽기 :

auto f(S)(S s)
{
    auto d = Date.fromISOExtendedString(s ~ "-28"), e = d.endOfMonth;
    int n = 20;

    while(1)
    {
        d += dur!"days"(1);

        if(d > e)
            break;

        int w = d.dayOfWeek;

        if(w > 0 && w < 6)
            ++n;
    }

    return rndtol(n * 100.0 / e.day);
}

답변

파이썬-142

from calendar import*
y,m=map(int,raw_input().split('-'))
f,r=monthrange(y,m)
print'%.f'%((r-sum(weekday(y,m,d+1)>4for d in range(r)))*100./r)

달력 비트에 대한 fR0DDY 덕분입니다.