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! 바보 나. 그리고 더는 변환 할 수 없습니다 intTimeSpan이미 한 것을 시도 것입니다.
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의 출력 스트림, printprintf및 기본값은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=86400B=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.