Brexit은 언제 발생합니까?


27

Brexit은 일어났다 . 그리고 천재 인 Sky News는 버스 옆에 카운트 다운을 만들기로 결정했습니다.

여기에 이미지 설명을 입력하십시오

당신의 임무는 비슷한 일을하는 것입니다. 영국은 2019 년 3 월 31 일 EU를 떠나고 매 초마다 변경되는 디지털 카운트 다운을 만들어야합니다 (0.05 초 편차 허용).

입력

당신의 프로그램은 절대 입력을받지 않아야합니다. 금지되어 있습니다!

산출

Brexit까지의 시간을 형식으로 출력해야합니다 ddd:hh:mm:ss. 선행 및 후행 줄 바꿈은 허용되지만 표시는 매번 같은 위치에 있어야합니다. 마치 실제로 감소하는 것처럼 보일 것입니다. @AnthonyPham이 지적한 것처럼 이것은 화면을 "지우기"에 충분한 줄 바꿈을 인쇄한다는 것을 의미하지는 않습니다. 이는 실제로 화면을 지워야한다는 것을 의미합니다.

이와 같은 출력은 허용되지 않습니다 :

100:20:10:05
100:20:10:04

이것도 아닙니다

100:20:10:05
*A thousand newlines*
100:20:10:04

그들은 둘 이상의 라인에 있기 때문에.

Brexit 후에 걱정할 필요가 없습니다. 귀하의 프로그램은 2019 년 3 월 31 일까지만 작동해야합니다.

규칙

  • 표준 허점 은 허용되지 않습니다
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.
  • 오류 메시지 (어떻게 생각할 수는 없지만)는 허용되지 않습니다.
  • 코드는 2 년 후에 (영국이 EU를 떠날 때) 실행될 수 있어야하고 실제 시간을 표시해야하며 730에서 다시 시작하지 않아야합니다 (아래 참조).

카운트 다운 규칙

카운트 다운은 하드 코딩되어서는 안되며 Brexit이 끝나기 전에 언제든지 실행할 수 있어야하며 올바른 결과를 얻을 수 있습니다. 새로운 날이 시작되면 시간은 아래 형식을 따라야합니다

712:00:00:01
712:00:00:00
711:23:59:59

다시 말하지만 Brexit이 끝나는 날짜는 자정에 31/3/2019입니다 (31 : 3 : 19 00:00:00 또는 31 : 3 : 2019 00:00:00 또는 원하는 다른 형식)

NB : 모든 것이 있다고 생각하지만 샌드 박스에 게시하지 않았습니다. 그렇지 않으면 타이밍이 해제되었을 수 있습니다. 완벽하지 않기 때문에 개선에 대한 제안 사항을 게시하십시오.


밀리 초마다 실행할 수 있지만 여전히 매 초마다 업데이트되는 것처럼 보일 수 있습니까? 이것은 단지 내 코드를 짧게 만드는 것입니다.
— David Archibald

@DavidArchibald 는 매 초마다 디스플레이 가 변경되어야 한다고 말합니다 . 대부분의 답변이 매 초마다 쉽게 실행된다는 것을 알 수 있습니다.
— caird coinheringaahing

아 10001 초에 한 번 바꾸고 싶다면 넣어야 합니다. 감사합니다
— David Archibald

선행 0이 필요합니까?
— Shaggy

1
자정 어떤 시간대 : UCT 또는 GMT? 우리는 그것을 고려해야합니까?
— Titus

답변:


12

자바 스크립트, 134 (129) 113 바이트

setInterval("d=-new Date;document.body.innerHTML=`<pre>${d/864e5+17986|0}:`+new Date(d).toJSON().slice(11,19)",1)

편집 : @Shaggy 덕분에 2 바이트가 절약되었습니다. @ l4m2 덕분에 11 바이트를 절약했습니다.


@Neil ...을 몇 바이트 이길 수있었습니다.
— David Archibald

왜 사용하지 <a id=0>않습니까? 아니면 그런가요?
— Solomon Ucko

3
또는 document.body.innerHTML대신o.innerHTML
— cloudfeet

1
디스플레이가 동일한 위치에 유지되도록 모노 스페이스가되기를 원했지만 바이트를 저장하고 사용할 수 있다고 생각합니다 <tt>.
— Neil

3
밀리 초마다 (또는 2 또는 3 ...) 코드를 실행하여 2 바이트를 절약 할 수 있습니다.
— Shaggy

11

PowerShell, 70 63 55 53 바이트

@Joey 덕분에 큰 따옴표를 제외하고 쉽게 -2

for(){cls;(date 31Mar19)-(date)|% T* ddd\:hh\:mm\:ss}

이것을 슬립으로 실행하면 8 바이트가 추가되지만 입력없이 슬립으로 실행하면 입력은 보이지 않습니다 (슬립이있는 버전 (63 바이트)).

for(){cls;(date 31/3/19)-(date)|% T* ddd\:hh\:mm\:ss;sleep 1}

for() 무한 루프이며 그 루프 내에서 ..

cls 화면을 지우려면

남은 시간을 줄 수 31/3/19있는 DateTime객체와 -현재 날짜를 가져와 올바른 형식으로 .ToString()( |% T*) 가져옵니다.

brexit 후 음의 시간이 표시됩니다.


현지 날짜 형식에도 민감합니다. 영국의 dd / m / yy 형식이 적합하지만, 미국 컴퓨터에서는 그대로 실행되지 않습니다. 어떻게 T*작동 하는지 궁금합니다 . 나는 그것에 익숙하지 않다.
— Joel Coehoorn

@JoelCoehoorn %foreach는 실제로 ToString 객체를 선택 하고 다음 문자열을 인수로 받아들입니다. 날짜 시간 형식과 관련하여 왜 미국 컴퓨터에서 실행되지 않습니까? 나는 dd문화가 둔감 하다고 생각했습니다 .
— colsw

내 컴퓨터에서 월 # 31을 찾으려고합니다. 로 변경하면 정상적으로 작동합니다 3/31/19. 2019-03-31어디에서나 작동 하지만 몇 바이트가 소요됩니다.
— Joel Coehoorn

@JoelCoehoorn 아 맞아-미안 나는 출력을 생각하고 있었지만, 31Mar19대신에 31/3/19희망적으로 고쳐야하는 것으로 업데이트 되었습니까?
— colsw

1
명령 인수 구문 분석이 적용되면 형식 문자열 주위의 따옴표를 잃을 수 있습니다.
— Joey

7

Excel VBA, 91 84 82 바이트

JoeMalpass 덕분에 Excel에서 날짜가 숫자로 표시됨을 지적하여 7 바이트가 절약되었습니다.
JoeMalpass 덕분에 2 바이트 절약

Sub b()
Do
t=CDec(43555-Now)
Cells(1,1)=Int(t) &Format(t,":hh:mm:ss")
Loop
End Sub

출력은 A1활성 Excel 시트에서 셀로 출력됩니다 .


("2019-3-31")와 교환 하여 -6 바이트 (43555). 그러나 Excel에서 이것을 실행하려고하면 약 5-6 초 후에 정지됩니다 ...
— CactusCake

1
@JoeMalpass 감사합니다. 좋은 지적입니다. 1 / 초보다 빠르게 계산하기 때문에 몇 초 후에도 검색됩니다. 그러나 지연을 추가하면 바이트가 추가되고 OP는 아무 것도 설정하지 않고 Brexit까지 지금부터 지속적으로 카운트 다운해야한다고 말하지 않습니다.
— 엔지니어 토스트

명백히 너무 Now없이 작동합니다 ()...
— CactusCake

6

파이썬 3.6, 146 바이트

from datetime import*
x=datetime
while 1:d=x(2019,3,31)-x.now();s=d.seconds;a=s%3600;print(end=f"\r{d.days:03}:{s//3600:02}:{a//60:02}:{s%60:02}")

5

C #을 173 172 156 150 127 바이트

using System;class P{static void Main(){for(;;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:d\\:hh\\:mm\\:ss}  ");}}

@Bob 덕분에 16 바이트 절약 @ Søren D. Ptæus 덕분에 6 바이트 절약

형식화 된 버전 :

using System;

class P
{
    static void Main()
    {
        for (;;)
            Console.Write($"\r{new DateTime(2019, 3, 31) - DateTime.Now:d\\:hh\\:mm\\:ss}  ");
    }
}

당신은 할 수 있습니까 (TimeSpan)0? 휴대 전화에서 지금 테스트 할 수 없습니다. 캐리지 리턴이 처리 할 때 여전히 클리어를 삭제할 수 있습니다. 줄 시작 부분에 커서를 다시 놓습니다.
— Bob

2
생각 : 길이가 변경되면 (100 일 미만) CR에 의존하지 못할 수 있습니다. 수정 : 끝에 두 개의 여분의 공백을 추가하십시오.
— Bob

@ 밥 나는 제거하는 것을 잊었다 Clear! 바보 나. 그리고 더는 변환 할 수 없습니다 int에 TimeSpan이미 한 것을 시도 것입니다.
— TheLethalCoder

6 바이트 쓰기를 저장할 수 있습니다 (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
— Søren D. Ptæus

@ SørenD.Ptæus 좋은 생각조차 그 생각조차하지 않았다
— TheLethalCoder

4

자바 스크립트 ES5, 320 319 316 305 295 284 바이트

setInterval(function(){a=Math,b=a.floor,c=console,d=Date,e="00",f=new d(2019,2,31),g=a.abs(f-new d)/1e3,h=b(g/86400);g-=86400*h;var i=b(g/3600)%24;g-=3600*i;var j=b(g/60)%60;g-=60*j,c.clear(),c.log((e+h).slice(-3)+":"+(e+i).slice(-2)+":"+(e+j).slice(-2)+":"+(e+a.ceil(g)).slice(-2))})

참조 Math를위한 @Fels, 참조를위한 @dgrcodeconsole

언 골프

setInterval(function() {

  var math = Math, floor = math.floor, c = console, d = Date;

  var leadings = "00";

  // set our brexit date
  var brexit = new d(2019, 2, 31);

  // get total seconds between brexit and now
  var diff = math.abs(brexit - new d()) / 1000;

  // calculate (and subtract) whole days
  var days = floor(diff / 86400);
  diff -= days * 86400;

  // calculate (and subtract) whole hours
  var hours = floor(diff / 3600) % 24;
  diff -= hours * 3600;

  // calculate (and subtract) whole minutes
  var minutes = floor(diff / 60) % 60;
  diff -= minutes * 60;

  // what's left is seconds

  // clear the console (because OP said it must print in the same place)
  c.clear();

  // log the countdown, add the leadings and slice to get the correct leadings 0's
  c.log((leadings + days).slice(-3) + ":" + (leadings + hours).slice(-2) + ":" + (leadings + minutes).slice(-2) + ":" + (leadings + math.ceil(diff)).slice(-2));

});


2
당신은 내 이름 바꾸기 수학을 조금 절약 할 수 있습니다g=Math;
— Fels

앨리어싱 Math이 여전히 2 바이트를 절약 할 수있는 것 같습니다 .
— Marie

화살표 기능을 사용하고를 제거하여 조금 더 절약 할 수 있습니다 var. 또한, h대신 hours또는 m대신 변수의 짧은 이름을 선택하십시오 minutes. 아마도 그렇게 c=console하면 몇 바이트가 더 절약됩니다. 또한 1e3대신1000
— 다니엘 레이나

4

PHP, 84 바이트

for(;$c=DateTime;)echo(new$c('@1553990400'))->diff(new$c)->format("\r%a:%H:%I:%S ");

매우 간단합니다. 1553990400은 31-3-2019 00:00:00 (UTC)의 타임 스탬프입니다. DateTime-> diff ()-> format ()을 사용하여 남은 시간을 출력하기 위해 무한 반복됩니다. Brexit이 발생한 후 0부터 카운트 업을 시작합니다.

댓글 / 더 읽기 쉬운 버전 :

// Infinite loop, assign DateTime (as a string) to $class
for (; $class = DateTime;) {
    echo (new $class('@1553990400')) // Create a new DateTime object for the brexit date/time.
            ->diff(new $class) // Caulculate the difference to the current date/time.
            ->format("\r%a:%H:%I:%S "); // Format it according to the specification, starting with a \r character to move to the start of the line and overwrite the previous output.
}

여기에 새로운, 그리고 내 자신의 답변을 게시하려고합니다. 몇 가지 : 1. <?여기 에서 태그 를 생략 할 수 있습니까? 2. 괄호가 잘못되었다고 생각합니다. 현재 ->diffDateTime 객체가 아닌 에코를 호출 하고 있습니다. 3. 에코는 괄호없이 작동합니다. 4.이 문제를 해결 한 후에도이 방법은 효과가 없지만 골프를 처음 접하므로 바보가 될 수 있습니다.
— Sworrub Wehttam

1
그냥 실행하고 요구 사항에 따라 제대로 작동하는지 확인하십시오. 명령 행에서 PHP를 실행할 때 플러시 할 필요가 없습니다. 문자열의 시작 부분에 \ r이있어 커서를 줄의 시작 부분으로 옮기면 이전에 출력 된 시간을 덮어 씁니다. 여기에 다른 많은 답변이 사용하는 것과 같은 방법입니다.
— chocochaos

1
죄송합니다. 첫 의견을 놓쳤습니다. 예, 전체 프로그램을 제공해야하는 경우가 아니라면 여는 태그를 생략 할 수 있습니다. 괄호는 그대로 있습니다. 예, echo는 그것 없이는 작동하지만 DateTime 객체에서 diff를 호출하면 그것들이 없으면 작동하지 않습니다. 여기서 잘 작동합니다. 어떤 PHP 버전을 사용하고 있으며 어떻게 프로그램을 실행하고 있습니까? :)
— chocochaos


1
통찰력에 감사드립니다 :)
— Sworrub Wehttam

4

CJam, 69 62 59 57 바이트

시간 형식을 다르게 변환하여 7 바이트 절약

Martin Ender의 제안으로 3 바이트 절약

백 스페이스 대신 캐리지 리턴을 사용하여 2 바이트 절약

{15539904e5esm1e3/{60md\}2*24md\]W%{sYTe[}%':*CTe[oDco1}g

명백한 이유로 TIO에서 실행할 수 없습니다.

디스플레이는 무한 루프로 지속적으로 다시 작성되므로 텍스트 종류는 (최소한 내 콘솔에서) 깜박입니다 (실제로는 초당 1 회만 시간 업데이트).

이 70 바이트 버전은 초당 한 번만 인쇄합니다.

{15539904e5es:Xm1e3/{60md\}2*24md\]W%{sYTe[}%':*CTe[oDco{esXm1e3<}g1}g

설명

{                           e# Begin a while loop
  15539904e5                e#  The timestamp on which Brexit will occur
  es                        e#  The current timestamp
  m                         e#  Subtract
  1e3/                      e#  Integer divide by 1000, converting to seconds from ms
  {                         e#  Run this block twice
   60md                     e#   Divmod by 60
   \                        e#   Swap top elements
  }2*                       e#  (end of block) 
                            e#    This block divmods the timestamp by 60, resulting in 
                            e#    the remaining minutes and seconds. Then the minutes get 
                            e#    divmod-ed by 60, to get hours and minutes remaining
  24md\                     e#  Divmod hours remaining by 24 and swap top elements, to get
                            e#    the hours left and days left.
  ]                         e#  Wrap the entire stack in an array
  W%                        e#  Reverse it since it's currently in the wrong order
  {                         e#  Apply this block to each element of the array
   s                        e#   Cast to string (array of digit characters)
   YTe[                     e#   Pad to length 2 by adding 0s to the left
  }%                        e#  (end of map block)
  ':*                       e#  Join with colons
  CTe[                      e#  Pad to length 12 by adding 0s to the left, dealing with the
                            e#    special case of the day being 3 digits. 
  o                         e#  Pop and print the resulting string, which is the time
  Dco                       e#  Print a carriage return, moving the cursor back to the start
  1                         e#  Push 1
}g                          e# Pop 1, if it's true, repeat (infinite loop)

지금 테스트 할 수 없습니다,하지만 당신은 아마 대체 할 수 Ab와 함께 s, 그리고 수행하여 바이트를 저장 1e3/먼저 다음 반대 순서로 나눕니다 60md\60md\24md\]W%.
— Martin Ender

@MartinEnder 네, 둘 다 작동합니다. 감사합니다
— 비즈니스 고양이

아 그리고 {60md\}2*다른 것을 저장합니다.
— Martin Ender

3

파이썬 3.5 (118 바이트)

import datetime as d,os
d=d.datetime
while 1:os.system("cls");e=str(d(2019,3,31)-d.today());print(e[:3]+':'+e[-15:-7])

3

C # 6, 149 바이트

57 바이트를 절약 한 Bob 에게 감사 합니다!

using System;class P{static void Main(){DateTime a,x=new DateTime(2019,3,31);while((a=DateTime.Now)<x)Console.Write($"\r{x-a:ddd\\:hh\\:mm\\:ss}");}}

언 골프 프로그램 :

using System;

class P
{
    static void Main()
    {
        DateTime a,
                x = new DateTime(2019, 3, 31);
        while ( (a = DateTime.Now) < x)
            Console.Write($"\r{x-a:ddd\\:hh\\:mm\\:ss}");
    }
}

C #을 210 206 159 바이트

47 바이트를 더 절약 한 Bob 에게 감사 합니다!

4 바이트를 절약 한 Martin Smith 에게 감사 합니다!

using System;class P{static void Main(){DateTime a,x=new DateTime(2019,3,31);while((a=DateTime.Now)<x)Console.Write("\r"+(x-a).ToString(@"ddd\:hh\:mm\:ss"));}}

언 골프 프로그램 :

using System;

class P
{
    static void Main()
    {
        DateTime a,
                x = new DateTime(2019, 3, 31);
        while ( (a = DateTime.Now) < x)
            Console.Write("\r" + (x - a).ToString(@"ddd\:hh\:mm\:ss"));
    }
}

1
new DateTime(2019,3,31)더 짧습니다.
— Martin Smith

1
또한 제거 할 수 있습니다 Console.Clear대신 앞에 추가 "\r"예를 들어 문자열에"\r"+(x-a)...
— 밥

1
더 향상된 기능 : (x-a).ToString(@"d\:hh\:mm\:ss")`String.Format ( "\ r {0 : d \\ : hh \\ : mm \\ : ss}", xa)와 같습니다 $@"{x-a:d\:hh\:mm\:ss}"(C # 6.0에서 더 짧고 보간 된 문자열). 당신이 할 경우, 당신은 더 전체 줄일 수 "\r"+$@"{x-a:d\:hh\:mm\:ss}"로를 $"\r{x-a:d\\:hh\\:mm\\:ss}".
— Bob

1
@TheLethalCoder 나는 단순히 "가짜"다중 개행 접근을 허용하지 않는 것으로 생각했다. 캐리지 리턴은 여전히 ​​화면의 유일한 내용을 덮어 씁니다. 적어도 하나의 다른 답변 도이 ​​접근법을 사용합니다. 또한 변경 되지 않는 업데이트가 허용 된 상태 에서 디스플레이 가 초당 한 번만 변경 되는 것이 중요하므로 절전 모드를 제거 할 수도 있습니다 (질문 설명 참조). 편집 : 실제로, 질문 의견은 명시 적으로 CR을 허용합니다 ...
— Bob

1
@ 밥 미안 나는 당신의 제안을 새로운 줄, 내 실수로 읽었습니다. 그러나 그래 수면을 제거 할 수 있습니다
— TheLethalCoder

3

C, 104 바이트

main(x){for(;x=1553990400-time(0);)printf("\n%03d:%02d:%02d:%02d\e[1A",x/86400,x/3600%24,x/60%60,x%60);}

고장

main(x){
    for(;x=1553990400-time(0);)             // Seconds remaining
        printf("\n%03d:%02d:%02d:%02d\e[1A",// Move cursor and print:
            x/86400,                        // Days
            x/3600%24,                      // Hours
            x/60%60,                        // Minutes
            x%60);                          // Seconds
    puts("Now we can stop talking about it forever."); // Wishful thinking
}

에 의존 time 1 일 이후의 초 수 반환하는데, 이는 macOS에서 Clang / GCC를 사용하는 경우이며 대부분의 UNIX 경우입니다.

bash 터미널 이스케이프 시퀀스를 사용 하여 커서를 움직입니다 ( <esc>[1A커서를 한 줄 위로 이동). 단순히을 사용하는 것이 더 \r좋지만 printf줄 바꿈 이 보일 때까지 플러시하지 않으며 수동으로 플러시하는 데 더 많은 시간이 걸립니다.

아마도 내가 본 것 중 가장 CPU 집약적 인 카운트 다운 일 것입니다. 핫 루프에서 실행되어 항상 가능한 한 정확해야합니다. 마감일 이후에 실행하면 꽤 이상한 물건이 생성됩니다 (모든 곳에서 부정적!)


@TobySpeight가 수정되었습니다. tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
— Dave

C에서 main 형식에 대한 규칙이 있습니까? C90에서 : 호출자 (OS)가 리턴 값을 사용할 경우 main에서 리턴을 생략하면 UB가 발생합니다. 표준 C에서 : main(x)유효한 형식의 기본 형식이 아니며 암시 적 int가 언어에서 제거되었습니다. 최소한의 안전한 버전은 int main(){}입니다.
— Lundin

코드 골프에서 @Lundin, 언어는 구현에 의해 정의됩니다 (즉, 원하는 방식으로 코드를 컴파일하는 공개적으로 사용 가능한 컴파일러를 찾을 수 있다면 할 수 있지만 비표준 플래그 설정이 필요한 경우 해당 플래그는 바이트 수). 이것은 표준을 준수하지 않는 곳이 아니라는 것입니다. 사람들이 여기에서 따르는 (분산이 아닌) 규칙에 대한 메타를 살펴보십시오.
— Dave

코드 골프 과제의 재미 중 하나는 기괴한 언어 해킹과 더 이상 사용되지 않는 기능을 발견하는 것입니다!
— Dave

3

AHK , 145 바이트

이것은 가장 짧은 대답은 아니지만 결과는 아주 좋은 운명의 느낌을줍니다. 나는 원래 키 스트로크 Ctrl+ A다음에 DEL시간 을 보내려고 했지만 새로 고침 속도가 너무 느려서 어떤 환경이든 파괴 할 수있었습니다. 대신 GUI를 사용했습니다. 창을 완전히 파괴하고 다시 생성하는 데 필요한 바이트 수를 줄이면서 컨트롤을 반복해서 업데이트하는 것보다 더 많은 것으로 나타났습니다. 좋은 효과입니다.

Loop{
s=20190331000000
s-=A_Now,S
d:=t:=20000101000000
t+=s,S
d-=t,D
d*=-1
FormatTime f,%t%,:HH:mm:ss
GUI,Destroy
GUI,Add,Text,,%d%%f%
GUI,Show
}

나는 운명의 노래를 부를거야!


3

기음#, 128 127 바이트

using System;class P{static void Main(){for(;;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");}}

Ungolfed 코드 :

using System;
class P
{
    static void Main()
    {
        for(;;)
            Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}"); 
    }
}

다른 C # 답변의 도움없이 \ r 트릭을 알아 내지 못했을 것입니다.

추가 개선을 원하는 사람은 for 루프 안에 Write () 표현식을 넣을 수도 있습니다. 어떻게 든 여기에 바이트를 저장할 수있는 것처럼 보입니다. 왜냐하면 그 문장의 세미콜론을 저장하기 때문입니다. 그러나 완전히 비어있는 본문을 가질 수 없기 때문에 같은 숫자로 작동합니다.

using System;class P{static void Main(){for(;;Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}"));}}

PPCG에 오신 것을 환영합니다!
— Martin Ender

보간 된 문자열을 사용하여 단일 문자를 계속 저장할 수 있습니다.;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
— Bob

잘 연주했습니다. 가장 짧은 코드에서 while (true) 루프를 만드는 방법을 찾으려고 노력했습니다! 그 트릭을 기억할 것입니다. 당신은이 개 자리에 3 개 자리에서 일을 진행 할 때 쓰기에, 그렇지 않으면 당신의 시간 문자열의 마지막 문자를 덮어 쓰지 않았지만 나는 같은 공간의 몇 가지를 추가해야 할 수 있습니다 당신은 이상한 결과를 얻을 것이다
— NibblyPig을

내 대답과 같이 보간 된 문자열을 사용하여 바이트를 저장할 수 있습니다. ddd0 의 패드 형식은 두 공백 방법보다 좋습니다.
— TheLethalCoder

보간 된 문자열에 대해 업데이트되었습니다.
— Joel Coehoorn

3

루비 (83 바이트)

loop{h=431664-Time.now.to_r/3600;$><<['%02d']*4*?:%[h/24,h%24,h%1*60,h*3600%60]+?\r}

언 골프

loop do
  seconds = 1553990400 - Time.now.to_r

  print (["%02d"] * 4).join(':') % [
    seconds / 24 / 60 / 60     ,
    seconds      / 60 / 60 % 24,
    seconds           / 60 % 60,
    seconds                % 60,
  ] + "\r"
end

기본적으로 파이썬 제출 중 하나이며 일부 개선되었습니다. 다시 렌더링하기 전에 문자열의 시작 부분으로 이동하기 위해 "\ r"을 내 보냅니다. 그리고 문자열 형식의 "%03d:%02d:%02d:%02d"경우 첫 번째 지정자의 너비는 신경 쓰지 않습니다. 그래서 우리는 할 수 있습니다."%02d"*4 불필요한 공백을 제거하기 위해 백 스페이스와 공백을 방출 .

또한, 나는 두 문자 짧은 발견 print: $><<. $>글로벌 속기 인 $defout의 출력 스트림, print및 printf및 기본값은STDOUT .IO#<<오른쪽을 스트림에 씁니다. 이 두 문자는 어떻게 더 짧습니까? 글쎄, 이제 괄호가 앞의 형식 문자열을 감싸기 전에 주도했던 공간을 생략 할 수 있습니다.

이 시점에서 저는 루비에서이 프로그램을 더 짧게 할 수있는 방법이 없다고 생각합니다.

편집 : 나는 틀렸다. 첫 번째 대신 Time.new(2019,3,31)원시 UNIX 시간을 사용할 수 있습니다.1553990400 .

편집 2 : 분을 배제하고 UNIX 타임 스탬프를 그 상수로 나눠서 시도했지만 실제로 바이트를 절약하는 것은 아닙니다. :(

편집 3 : 캐싱 h=3600 실제로 2 바이트 나에게 상처를 입혔습니다. 으악.

편집 4 : @EricDuminill 덕분에 3 바이트가 절약되었습니다. 그는 수레를 사용했지만, 합리성은 정밀도의 손실없이 작동합니다!

편집 5 : Array#*에 대한 별명으로 Array#join, ?개별 문자에 대한 Ruby 구문을 사용하십시오 !


초 대신 시간으로 작업하면 3 바이트를 절약하는 것처럼 보입니다 loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}. 반올림으로 인해 초가 1만큼 꺼져있을 수 있습니다.
— Eric Duminil

감사! 지금 PHP와 연결되어 있습니다. :) 정확성을 유지하기 위해 to_r대신 사용 했습니다 to_f.
— Stephen Touset

천만에요. 이 시계는 여전히 심지어와 초기하지만 1 초 수 있습니다 .to_r대신.to_f
— 에릭 Duminil

@StephenTouset +"\r"배열의 오른쪽으로 이동할 수 있습니다 . 이렇게하면 ['%02d']*4*?:대신 사용할 '%02d:'*4+"\b "수 있으므로 괄호를 잃어 버릴 수 있습니다. +?\r대신 쓰는 대신 다른 바이트를 저장하십시오 +"\r".
— Synoli

훌륭한 발견!
— Stephen Touset


2

C #, 142 바이트

using System;class P{static void Main(){a:Console.Write($"\r{(new DateTime(2019,3,31)-DateTime.Now).ToString("d\\:h\\:mm\\:ss  ")}");goto a;}}

언 골프 프로그램 :

using System;
class P
{
    static void Main()
    {
        a: Console.Write($"\r{(new DateTime(2019, 3, 31) - DateTime.Now).ToString(@"d\:h\:mm\:ss  ")}"); goto a;
    }
}

Brexit에 도달해도 인쇄가 중단되지 않습니다. 문제가 있는지 확실하지 않습니다.
— TheLethalCoder

@TheLethalCoder 합법입니다. 이 지침에 따르면 코드는 2019 년 3 월 31 일까지만 작동해야하며 이후에는 어떤 일이 발생하는지는 중요하지 않습니다. 그 날짜 이후에 이상한 출력이나 예외가 발생하여 바이트를 절약 할 수 있다면 더 많은 힘을 얻습니다.
— Joel Coehoorn

또한 : 나는 생략하여도 단락을 얻을 수있을 것입니다 의심 ToString()바이트 대신) (쓰기에 방법, 아니면 보간 문자열 서식을 구축
— 조엘 Coehoorn

그래 ... 확실히 가능하다. 127 바이트로 줄였습니다. 원본 아래에 추가하므로 기본 goto아이디어에 대한 크레딧을 얻을 수 있습니다 .
— Joel Coehoorn

내 편집 이동은 닦아 :( 난 내 자신의 대답을 게시 할 것 같아요.
— 조엘 Coehoorn을

2

배쉬 + GNU 날짜, 128 바이트

@muru 덕분에 2 바이트가 줄었고 @This Guy 덕분에 2 바이트가 줄었습니다.

C=:%02d;while sleep 1;do D=$[B=3600,A=24*B,1553990400-`date +%s`];printf "%03d$C$C$C\r" $[D/A] $[D%A/B] $[D%A%B/60] $[D%60];done

언 골프

DAY=86400
HOUR=3600
while sleep 1 ; do
 DIFF=$[1553990400-`date +%s`]
 printf "%03d:%02d:%02d:%02d\r" \
         $[DIFF/DAY] \
         $[DIFF%DAY/HOUR] \
         $[DIFF%DAY%HOUR/60] \
         $[DIFF%60]
done

1
Bash에서 골프를 타 본 적이 없지만 그 동안 공간을 제거 할 수 while[1]있습니까?
— caird coinheringaahing

페어 포인트, 이제 시도해 보았지만 line 1: [1]: command not found오류가 발생했습니다. 공백은 필수입니다 :-(
— steve

2
36002 바이트를 절약하기 위해 변수에 할당 하시겠습니까? 당신은 또한 변경할 수 있습니다 B=3600;A=86400에 B=3600;A=24*B다른 바이트를 위해?
— caird coinheringaahing

3600 변수가 완료되었습니다. 24 * B는 가능할 필요 A=$[24*B]가 없습니다
— steve

1
C=:%02d;printf "%03d$C$C$C\r"바이트를 저장하려면? 그리고 산술 문맥에서 과제를 A와 B로 D=$[B=3600,A=24*B,1553990400-`date +%s`]옮기십시오.
— muru

2

MATL, 45 바이트

737515`tZ'-tkwy-':HH:MM:SS'XOw'%03d'YDwYcDXxT

TIO는 분명히 출력 지우기를 지원하지 않지만 고맙게도 MATL Online은 지원합니다 !

2 바이트 이상, pause매초마다 (슬립) 수행하는 CPU 친화적 인 버전입니다 .

737515`tZ'-tkwy-':HH:MM:SS'XOw'%03d'YDwYcDT&XxT

MATL Online에서 이것을 시도하십시오

737515"2019 년 3 월 31 일"은 MATLAB의 기본 에포크 형식을 나타냅니다. 0000 년 1 월 0 일부터 일 수이며, 선택적으로 시간을 나타내는 소수 부분을 포함합니다. (어쨌든 계산하여 이것을 단축하려고 시도했지만 유일한 요인은 5와 6 자리 숫자 (147503) 뿐이며 6 바이트 미만으로 수행하는 방법을 알 수 없었습니다.)

`    % start do-while loop
tZ`- % duplicate Brexit date, get current date (& time), subtract
tk   % duplicate the difference, get the floor of it (this gives number of days left)
w    % switch stack to bring unfloored difference to top
y    % duplicate the floored value on top of that
-    % subtract to get fractional part representing time
':HH:MM:SS'XO % get a datestr (date string) formatted this way
w    % switch to bring number of days back on top
'%03d'YD      % format that to take 3 places, with 0 padding if needed
wYc  % switch to bring time string back on top, concatenate date and time
D    % display the concatenated result!
T&Xx % clear screen after a 1 second pause (the pause is optional, without it the call is `Xx`)
T    % push True on stack to continue loop

1

PHP, 64 바이트

while($d=1553990401-time())echo--$d/86400|0,date(":H:i:s\r",$d);

이 때까지 정확하게 계산 0:00:00:00한 다음 중단 / 나가기를 수행합니다. 로 실행하십시오 -r.

0을 인쇄하지 않으면 -2 바이트입니다.


1

RPL, 83 78 바이트

HP48 또는 이와 유사한 것이 올바른 영국 시간 및 날짜, mm / dd 날짜 형식 및 24 시간 형식으로 설정되었다고 가정합니다.

WHILE 1REPEAT DATE 3.302019DDAYS":"1.1 24TIME HMS- TSTR 15 23SUB + + 1DISP END

주위의 공백을 제거하여 2 바이트를 절약 할 수 있다는 것에 놀랐습니다 ":". 1.1은 가장 짧은 유효 날짜이며 나중에에 의해 덤프됩니다 SUB. 에뮬레이터에주의하십시오. 시간이 벽시계보다 빠르거나 느리게 (또는 전혀) 실행되지 않을 수 있습니다. 실제 HP에서는 ON 키를 눌러이 프로그램을 중지하거나… 빈 배터리를 기다릴 수 있습니다.


0

PHP, 102 95 90 바이트

@TheLethalCoder 덕분에 7 바이트 절약 및 팩토링하지 않음

연결하여 5 바이트를 더 절약했습니다.

<? $b=1553990400-time();echo floor($b/$d=86400).date(':H:i:s', $b%$d);header('Refresh:1');

이것은 나의 첫번째 골프이다. 그래서 나는 아마 약간의 속임수를 놓치고있을 것이다. 그러나 여기에서 당신은 관계 없다.

그렇지 않으면 @chocochaos의 PHP 답변에 관해서는 내 의견에서 설명 한 이유로 결함이 있다고 생각하지만 여기에 처음 왔을 때 잘못되었을 수 있습니다. 아니면 난 그냥 초보자입니다 :)


닫는 태그가 필요할 수 있습니까? (잘 모르겠습니다). 당신은 $a한 번만 사용하므로 번호를 사용할 수도 있습니다. 나는 PHP에 너무 익숙하지는 않지만 더 많은 개선이있을 것으로 보인다
— TheLethalCoder

무슨 소리 야 flawed because of reasons stated in the comments? 당신이 그들의 답변에 대한 의견을 의미한다면, 당신은 유일한 사람입니다.
— caird coinheringaahing

@TheLethalCoder 닫기 태그가 필요하지 않습니다. 그리고 좋은 것!
— Sworrub Wehttam

1
<?=여는 태그 를 사용 하고 에코를 드롭하여 $b처음 사용하는 위치에 할당 하여 ~ 7 바이트를 절약 할 수 있습니다 . 또한 ^0대신을 사용하여 3 바이트를 저장할 수 있습니다 floor. 그것은 비트 단위이거나 int로 캐스트를 포함하며, 내가 본 int로 캐스트하는 가장 짧은 방법입니다.
— user59178

1
내 대답은 잘 작동합니다 :) 또한 codegolf.meta.stackexchange.com/questions/tagged/php 일부 게시물을 읽을 수도 있습니다. 태그를 열 필요가 없습니다. 명령 줄에서 실행되는 방식으로 솔루션을 작성하는 것이 좋습니다. 그러면 새로 고치기 위해 헤더를 엉망으로 만들 필요가 없습니다. 이 새로 고침은 또한 요청 자체에서 손실 된 시간을 고려하지 않기 때문에 솔루션이 잠시 동안 "누락"하게합니다.
— chocochaos

0

AWK , 78 바이트

BEGIN{for(;v=1552953600-systime();printf"\r%d:%s",v/86400,strftime("%T",v)){}}

온라인으로 사용해보십시오!

종료 시간을 미리 계산할 수 있다는 것을 깨닫기 전에 더 오래 걸렸습니다. 때로는 게임에 약간 늦어서 다른 사람들로부터 아이디어를 얻는 것이 좋습니다.

참고로, TIO 링크는 \r제대로 구현되지 않으므로 제대로 작동 하지 않습니다 .


0

F #, 142 바이트

open System
let f=
 let t=DateTime(2019,3,31)
 while DateTime.Now<=t do Console.Clear();t-DateTime.Now|>printf"%O";Threading.Thread.Sleep 1000

나는 국경에서 약 1km 떨어진 아일랜드에서 자랐습니다. "Welcome to Fermanagh"표시와 도로 표시 변경으로 인해 다른 국가에 들어갔다는 것을 알 수 없습니다. 학교에가는 길에 두 번 교차하는 데 사용됩니다.


0

c, gcc 114 바이트

main(s){system("clear");if(s=1553900399-time(0)){printf("%d:%d:%d:%d\n",s/86400,s/3600%24,s/60%60,s%60);main(s);}}

아무것도 생략하지 않고, 전체 프로그램. 이 프로그램은 우분투에서 gcc로 컴파일합니다. 카운트 다운이 0 초에 도달하면 시스템 호출이 지워지고 중지되기 때문에 카운트 다운에 긴 인쇄 내역이 표시되지 않습니다.

언 골프

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>


//Brexit countdown timer
int main(){
  int sec = 1553900400 - time(0);//seconds remaining until Brexit
  if(sec){
    sleep(1);
    system("clear");
    printf("Brexit Countdown\n");
    printf("days Hours Mins Secs\n");
    printf("%d:  %d:    %d:  %d\n",
            sec/86400, sec/3600%24,
            sec/60%60, sec%60);
    main();
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.