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에 “쓰레기”가 있습니다. 어떤 이유로 내 버전은date
2817-12를 유효하지 않은 달로 간주합니다. 누가 새로운 GNU 묵시록이 나올지 알았습니다!date
2038 이후의 날짜 에는 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 덕분입니다.