윤초를 고려하여 현재 시간… 인쇄 원하는 경우 인터넷에

(참고 : 관련 있지만,이 도전의 중복없는 이 일 이 자신의 시간을 자동으로 윤초를 결정하기보다는 하드 코딩이 필요하기 때문에, 그리고 중복되지 않습니다 이 하나의 어려움의 대부분은 윤초의 기울임없이 시간을 결정에서 오기 때문에 , 대부분의 시간에 API가 기본적으로하지 않는 것이므로 솔루션은 솔루션마다 문제가 다르게 보일 수 있습니다.)

2016 년 말에 출시 될 예정이지만 대부분의 사람들이 예상하는 것보다 약간 더 오래 걸립니다. 올해 초 초를 축하하는 도전이 있습니다.

현재 시간을 UTC,시, 분, 초로 출력합니다. 예를 들어 정오의 합법적 인 출력 형식에는 12:00:00및 이 포함 되며 [12,0,0]형식은 그다지 중요하지 않습니다.

그러나 비틀림이 있습니다. 프로그램은 과거와 미래의 윤초를 적절히 처리해야합니다 . 즉, 프로그램은 온라인 또는 자동 업데이트 / 업데이트 가능한 소스에서 윤초 목록을 가져와야합니다. 원하는 경우 인터넷에 연결하여이 정보를 얻을 수 있습니다. 그러나이 과제보다 오래된 URL에만 연결할 수 있습니다 (예 : 다른 부분에서 프로그램의 일부를 다운로드하지 않음). 현재 시간을 결정하기 위해 연결을 사용할 수 없습니다 (특히 : 액세스하려는 경우에도 프로그램이 작동해야 함) 인터넷은 최대 24 시간이 지난 페이지를 반환합니다).

현재 시간에 대한 대부분의 운영 체제 기본 API는 다른 방법으로 혼동 될 수있는 프로그램에서 숨기기 위해 윤초 단위로 시간을 기울입니다. 따라서이 문제의 주된 어려움은이를 취소 할 수있는 메서드 나 API를 찾아 UTC로 수정되지 않은 실제 시간을 계산하는 것입니다.

이론적으로 프로그램은 무한히 빠른 컴퓨터에서 실행되는 경우 완벽하게 정확해야하며 의도적으로 실행하는 데 0 시간 이상 걸리지 않아야합니다. (실제로 프로그램은 불완전한 컴퓨터에서 실행되므로 즉시 실행되지 않을 것입니다. 결과 무효화에 대해 걱정할 필요는 없지만 프로그램의 정확성을 위해 프로그램에 의존해서는 안됩니다. )

시스템 시계가 설정된 시간대에 관계없이 프로그램이 작동해야합니다. 그러나 운영 체제 또는 환경에 사용중인 시간대에 대한 정보를 요청할 수 있으며 회신이 정확하다고 가정 할 수 있습니다.

가장 짧은 프로그램이 이깁니다. 행운을 빕니다!



답변

PowerShell , 161 바이트

(('{0:H:m:s}','23:59:60')[(($d=[datetime]::UtcNow).Ticks-6114960*98e9)/1e8-in((irm ietf.org/timezones/data/leap-seconds.list)-split'[^@]	|
'-match'^\d{9}')])-f$d

온라인으로 사용해보십시오! (이 TIO 인식하지 못하는 것 같다, 여기에 작동하지 않습니다 irmiwr아마는 보안 기능이있어,?)

논리 테스트 (하드 코드 날짜) :

(('{0:H:m:s}','23:59:60')[(($d=[datetime]'1/1/2017 00:00:00').Ticks-6114960*98e9)/1e8-in((irm ietf.org/timezones/data/leap-seconds.list)-split'[^@]	|
'-match'^\d{9}')])-f$d

노트

정규식 문자열 에는 리터럴 TAB과 리터럴 줄 바꿈 ( 0xA)이 있으므로 이스케이프 할 필요가 없습니다 (각각 1 바이트 저장).

설명

ietf 파일에 주어진 (도약 초) 시간은 NTP 시대 (초) 이후 초입니다 1/1/1900 00:00:00. Windows에서 “틱”은 1 천만 분의 1 초 (10,000,000 틱 / 초)입니다.

정수를 추가하면 정수 [datetime]값을 틱으로 계산하므로 NTP epoch의 하드 코딩 된 틱 값을 사용하고 현재 UTC 시간의 틱 값에서 원래 값을 뺍니다 (원래 값이 동시에 할당 됨) 에 $d).

하드 코딩 된 틱 값을 더 작게 만들기 위해, 나는 0을 빼앗아 98로 나누고 98e9(98 * 10 9 ) 를 곱했습니다 .

이 뺄셈의 결과는 NTP 시대 이후의 틱 값입니다. NTP 시대 이후 초 단위의 값을 얻기 위해 (분명히 분명 1e8하지 않은 1e9이유로) 로 나눕니다 . 실제로는 10 배나 작아집니다.

IETF에서 문서를 검색하여 먼저 줄로 나누지 않고 타임 스탬프로 줄을 처리합니다. 타임 스탬프 TAB이후 에 나오는 줄 바꿈과 문자로 나누기로 결정했습니다 . 파일에 하나의 잘못된 행이 있기 때문에 원하지 않는 추가 타임 스탬프가 포함됩니다. 선은 다음과 같습니다.

#@	3707596800

그래서 정규식을 분할하여 [^@]\t( @다음에 오는 문자가 아닌 TAB) 해당 줄을 제외하도록 작동했지만 0각 타임 스탬프에서 마지막 을 소비하게 되었습니다.

내가 나누기 이유 1e8가 아니라 1e9누락에 대한 계정에, 0.

현재 타임 스탬프가 중성 된 윤초 타임 스탬프 목록에 있는지 확인합니다. 내가 설명한이 모든 프로세스는 배열 접근 자 안에 []있으므로 결과 [bool]값은 0( $false) 또는 1( $true)에 통합됩니다 . 색인을 생성하는 배열에는 시간을 표시하는 형식 문자열과 하드 코딩 된 두 가지 요소가 포함 23:59:60됩니다. 위에서 언급 한 비교의 진실성은 어느 것이 선택 될 것인지를 결정하며, -f이는 이전에 지정된 현재 날짜 $d를 매개 변수 로하여 형식 연산자 에 제공됩니다.