Khi nào Brexit sẽ xảy ra?


27

Vâng, Brexit đã xảy ra . Và Sky News, là những thiên tài họ, đã quyết định tạo ra một bộ đếm ngược ở bên cạnh một chiếc xe buýt.

nhập mô tả hình ảnh ở đây

Công việc của bạn là làm một cái gì đó tương tự. Vương quốc Anh rời EU vào ngày 31 tháng 3 năm 2019 và bạn phải tạo ra một bộ đếm ngược kỹ thuật số cho điều này thay đổi mỗi giây (với độ lệch 0,05 giây cho phép).

Đầu vào

Chương trình của bạn sẽ hoàn toàn không có đầu vào. Nó bị cấm!

Đầu ra

Nó sẽ xuất thời gian cho đến khi Brexit ở định dạng ddd:hh:mm:ss. Dòng mới hàng đầu và dấu được cho phép nhưng màn hình nên ở cùng một nơi mỗi lần. Nó sẽ trông như thể nó đang thực sự giảm tại chỗ. Như @AnthonyPham đã chỉ ra, điều này không có nghĩa là in đủ dòng mới để "xóa" màn hình, điều này có nghĩa là bạn phải thực sự xóa màn hình.

Một đầu ra như thế này không được phép:

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

Đây cũng không phải

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

vì họ đang ở trên nhiều dòng.

Bạn không phải lo lắng về sau Brexit. Chương trình của bạn chỉ phải hoạt động tối đa 31/3/2019

Quy tắc

  • Lỗ hổng tiêu chuẩn không được phép
  • Đây là để mã ngắn nhất tính theo byte thắng.
  • Thông báo lỗi (mặc dù tôi không thể nghĩ làm thế nào) không được phép
  • Mã sẽ có thể được chạy trong thời gian 2 năm (khi Vương quốc Anh rời EU) và sẽ hiển thị thời gian thực tế và không bắt đầu lại từ 730 (xem bên dưới)

Quy tắc đếm ngược

Việc đếm ngược không nên được mã hóa cứng và có thể chạy bất cứ lúc nào trước khi Brexit kết thúc và vẫn tạo ra kết quả chính xác. Khi một ngày mới được bắt đầu, giờ nên theo định dạng dưới đây

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

Hãy để tôi nói lại, ngày Brexit kết thúc là 31/3/2019 vào lúc nửa đêm để thuận tiện (31: 3: 19 00:00:00 hoặc 31: 3: 2019 00:00:00 hoặc bất kỳ định dạng nào bạn muốn)

NB: Tôi nghĩ rằng tôi có tất cả mọi thứ nhưng tôi đã không đăng cái này trong Sandbox, nếu không thì thời gian có thể đã bị tắt. Vui lòng gửi bất kỳ đề xuất cải tiến vì nó không hoàn hảo.


Tôi có thể chạy nó mỗi mili giây nhưng vẫn xuất hiện cập nhật mỗi giây không? Điều này chỉ để làm cho mã của tôi ngắn hơn.
David Archibald

@DavidArchibald nó chỉ nói rằng màn hình phải thay đổi mỗi giây. Chỉ là hầu hết các câu trả lời sẽ thấy dễ dàng hơn để chạy mỗi giây.
caird coinheringaahing

àh Vâng, tôi phải đặt 1000nếu tôi muốn nó thay đổi một lần một giây. Cảm ơn
David Archibald

Là số không hàng đầu cần thiết?
Shaggy

1
Nửa đêm múi giờ nào: UCT hay GMT? Chúng ta có phải tính đến điều đó không?
Tít

Câu trả lời:


12

JavaScript, 134 129 113 byte

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

Chỉnh sửa: Đã lưu 2 byte nhờ @Shaggy. Đã lưu 11 byte nhờ @ l4m2.


Quản lý để đánh bại bạn @Neil ... bằng một vài byte.
David Archibald

Tại sao không sử dụng <a id=0>? Hoặc điều tương tự?
Solomon Ucko

3
Hoặc thậm chí document.body.innerHTMLthay vìo.innerHTML
cloudfeet

1
Tôi muốn nó là không gian vũ trụ để đảm bảo rằng màn hình vẫn ở cùng một vị trí, nhưng tôi đoán tôi có thể lưu một byte và sử dụng <tt>.
Neil

3
Bạn có thể lưu 2 byte bằng cách chạy mã mỗi mili giây (hoặc 2 hoặc 3 ...).
Shaggy

11

PowerShell, 70 63 55 53 byte

Không bao gồm dấu ngoặc kép, dễ dàng -2 nhờ @Joey

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

Chạy cái này với chế độ ngủ thêm 8 byte, nhưng đầu vào hầu như vô hình nếu nó chạy mà không có chúng, phiên bản (63 byte) có chế độ ngủ:

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

for() là một vòng lặp vô hạn, và trong vòng lặp đó ..

cls để xóa màn hình,

lấy 31/3/19làm DateTimeđối tượng và -ngày hiện tại từ nó, để đưa ra thời gian còn lại, sau đó .ToString()( |% T*) với định dạng chính xác.

điều này sẽ hiển thị thời gian tiêu cực sau khi brexit.


Điều này cũng nhạy cảm với định dạng ngày địa phương. Mặc dù định dạng dd / m / yy của Anh là phù hợp, nhưng imo, nó sẽ không chạy như trên các máy của Hoa Kỳ. Tôi tò mò làm thế nào các T*công trình. Tôi không quen với điều đó.
Joel Coehoorn

@JoelCoehoorn Đó là một mẹo hay, %foreach thực sự chọn Tđối tượng oString và sẽ chấp nhận chuỗi tiếp theo làm đối số của nó. liên quan đến định dạng datetime tại sao nó không chạy trên các máy của Hoa Kỳ? Tôi nghĩ rằng ddvv là vô văn hóa.
colsw

Nó đang cố gắng tìm tháng # 31 trên máy của tôi. Hoạt động tốt nếu tôi thay đổi nó thành 3/31/19. Cũng sẽ làm việc ở 2019-03-31bất cứ đâu, nhưng điều đó làm bạn tốn một vài byte.
Joel Coehoorn

@JoelCoehoorn ah phải - xin lỗi tôi đã nghĩ đến đầu ra, Cập nhật lên 31Mar19thay vì 31/3/19hy vọng sẽ sửa nó?
colsw

1
Bạn có thể mất các trích dẫn xung quanh chuỗi định dạng, vì phân tích đối số lệnh được áp dụng.
Joey

7

VBA Excel, 91 84 82 byte

Đã lưu 7 byte nhờ JoeMalpass chỉ ra rằng Excel xem ngày là số.
Đã lưu 2 byte nhờ JoeMalpass

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

Đầu ra là ô A1trong bảng Excel hoạt động.


-6 byte bằng cách hoán đổi ("2019-3-31")với (43555). Tuy nhiên, khi tôi thử chạy cái này trong Excel, nó sẽ đóng băng sau khoảng 5-6 giây ...
CactusCake

1
@JoeMalpass Cảm ơn, đó là một điểm tốt. Nó cũng xuất hiện sau vài giây đối với tôi, bởi vì nó tính toán nhanh hơn 1 / giây. Tuy nhiên, việc thêm độ trễ, thêm byte và OP không nói rằng nó phải có khả năng đếm ngược liên tục từ giờ cho đến khi Brexit mà không gây ra bất cứ điều gì.
Kỹ sư Toast

Rõ ràng là Nowhoạt động mà không ()quá ...
CactusCake

6

Python 3.6, 146 byte

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 byte

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

Đã lưu 16 byte nhờ @Bob Lưu 6 byte nhờ @ Søren D. Ptæus

Phiên bản được định dạng:

using System;

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

Bạn có thể làm được (TimeSpan)0không Trên điện thoại, không thể kiểm tra ngay bây giờ. Bạn vẫn có thể thả rõ ràng khi trả lại vận chuyển chăm sóc nó: nó đặt con trỏ trở lại ở đầu dòng.
Bob

2
Suy nghĩ: dựa vào CR có thể thất bại nếu độ dài thay đổi (dưới 100 ngày). Khắc phục: thêm hai khoảng trắng ở cuối.
Bob

@Bob Mình quên gỡ Clear! Tôi ngớ ngẩn quá. Và không thể chuyển đổi intthành TimeSpantôi đã thử cái đó.
TheLethalCoder

Bạn có thể lưu 6 byte viết (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
Søren D. Ptæus

@ SørenD.Ptæus Ý tưởng hay thậm chí không nghĩ đến điều đó
TheLethalCoder

4

JavaScript ES5, 320 319 316 305 295 284 byte

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))})

Cảm ơn @Fels đã tham khảo Math, @dgrcode đã tham khảoconsole

Không chơi gôn

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
Bạn có thể tiết kiệm một chút việc đổi tên Toán của tôi như thế nàog=Math;
Fels

Có vẻ như răng cưa Mathvẫn có thể tiết kiệm 2 byte, phải không?
Marie

Bạn có thể tiết kiệm thêm một chút bằng cách sử dụng các chức năng mũi tên và loại bỏ var. Ngoài ra, chọn tên ngắn hơn cho các biến, như hthay vì hourshoặc mthay vì minutes. Có lẽ làm c=consolesẽ tiết kiệm thêm một vài byte. Cũng 1e3thay vì1000
Daniel Reina

4

PHP, 84 byte

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

Khá đơn giản. 1553990400 là dấu thời gian cho ngày 31-3-2019 00:00:00 tại UTC. Nó lặp vô hạn, sử dụng DateTime-> diff () -> format () để xuất thời gian còn lại. Sau khi Brexit đã xảy ra, nó sẽ bắt đầu đếm từ 0.

Phiên bản bình luận / dễ đọc hơn:

// 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.
}

Mới ở đây, và sắp đăng câu trả lời của riêng tôi. Một vài điều: 1. Chúng ta có được phép bỏ qua <?thẻ ở đây không? 2. Tôi nghĩ rằng dấu ngoặc đơn của bạn sai, ngay bây giờ bạn đang gọi ->diffecho chứ không phải là đối tượng DateTime. 3. echo hoạt động mà không có dấu ngoặc đơn nào. 4. Ngay cả sau khi sửa lỗi này, điều này không phù hợp với tôi, nhưng tôi mới chơi golf để có thể chỉ là tôi là một thằng ngốc.
Sworrub Wehttam

1
Chỉ cần chạy nó và xem, nó hoạt động tốt, theo yêu cầu. Không cần phải tuôn ra khi chạy PHP từ dòng lệnh. Có một \ r ở đầu chuỗi để di chuyển con trỏ đến đầu dòng, nó tiếp tục ghi đè thời gian đã xuất trước đó. Đó là cùng một phương pháp mà nhiều câu trả lời khác ở đây đang sử dụng.
chocochaos

1
Xin lỗi, tôi đã bỏ lỡ bình luận đầu tiên của bạn. Có, chúng tôi được phép bỏ qua các thẻ mở, trừ khi có yêu cầu cung cấp một chương trình đầy đủ. Các dấu ngoặc đơn là tốt theo cách họ đang có. Có, echo hoạt động mà không có nó, nhưng gọi diff trên đối tượng DateTime không hoạt động mà không có chúng. Nó chạy tốt ở đây, bạn đang sử dụng phiên bản PHP nào và bạn đang chạy chương trình như thế nào? :)
chocochaos

1
Bạn có thể muốn xem một số bài đăng ở đây: codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos

1
Điều đó chỉ nói về nó, cảm ơn vì sự sáng suốt :)
Sworrub Wehttam

4

CJam, 69 62 59 57 byte

Đã lưu 7 byte bằng cách chuyển đổi sang định dạng thời gian khác nhau

Đã lưu 3 byte nhờ đề xuất của Martin Ender

Đã lưu 2 byte bằng cách sử dụng trả về vận chuyển thay vì khoảng trống

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

Không thể chạy trên TIO vì lý do rõ ràng.

Nó viết lại màn hình hiển thị liên tục trong một vòng lặp vô hạn để loại văn bản nhấp nháy vào và ra (ít nhất là trong bảng điều khiển của tôi), mặc dù nó chỉ thực sự cập nhật thời gian một lần mỗi giây.

Phiên bản 70 byte này chỉ in một lần mỗi giây:

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

Giải trình

{                           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)

Không thể kiểm tra ngay bây giờ, nhưng bạn có thể có thể thay thế Abbằng svà lưu một byte bằng cách thực hiện 1e3/trước rồi chia theo thứ tự ngược lại 60md\60md\24md\]W%.
Martin Ender

@MartinEnder Yep, cả hai đều hoạt động. Cảm ơn
Mèo kinh doanh

Oh và {60md\}2*tiết kiệm khác.
Martin Ender

3

Python 3.5 (118 byte)

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 byte

Cảm ơn Bob vì đã tiết kiệm được 57 byte!

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}");}}

Chương trình Ungolfed:

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 byte

Cảm ơn Bob vì đã tiết kiệm thêm 47 byte!

Cảm ơn Martin Smith vì đã tiết kiệm 4 byte!

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"));}}

Chương trình Ungolfed:

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)ngắn hơn
Martin Smith

1
Bạn cũng có thể loại bỏ các Console.Clearvà thay vào đó thêm vào trước "\r"vào chuỗi, ví dụ:"\r"+(x-a)...
Bob

1
Nhiều cải tiến hơn: (x-a).ToString(@"d\:hh\:mm\:ss")tương đương với `String.Format (" \ r {0: d \\: hh \\: mm \\: ss} ", xa)` tương đương với $@"{x-a:d\:hh\:mm\:ss}"(chuỗi ngắn hơn, được nội suy trong C # 6.0). Nếu bạn làm điều đó, sau đó bạn có thể rút ngắn toàn bộ "\r"+$@"{x-a:d\:hh\:mm\:ss}"vào $"\r{x-a:d\\:hh\\:mm\\:ss}".
Bob

1
@TheLethalCoder Tôi chỉ đơn giản là không cho phép một cách tiếp cận đa dòng "giả". Một chiếc xe ngựa trở về vẫn ghi đè lên điều duy nhất trên màn hình. Ít nhất một câu trả lời khác cũng sử dụng phương pháp này. Cũng có thể loại bỏ giấc ngủ vì điều quan trọng là màn hình thay đổi một lần mỗi giây, với các cập nhật không thay đổi được phép (xem bình luận câu hỏi). chỉnh sửa: trên thực tế, các nhận xét câu hỏi cũng cho phép rõ ràng CR ...
Bob

1
@Bob Xin lỗi tôi đã đọc đề xuất của bạn như một dòng mới, lỗi của tôi. Nhưng vâng, giấc ngủ có thể được loại bỏ
TheLethalCoder

3

C, 104 byte

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);}

Phá vỡ

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
}

Dựa vào timesố giây trả về kể từ ngày 01/01/1970, đó là trường hợp của tôi (sử dụng Clang / GCC trên macOS) và nên là trường hợp của hầu hết các công cụ UNIX.

Sử dụng các chuỗi thoát bash terminal để di chuyển con trỏ xung quanh ( <esc>[1Adi chuyển con trỏ lên 1 dòng). Nó sẽ đẹp hơn khi có thể sử dụng một cách đơn giản \r, nhưng printfsẽ không tuôn ra cho đến khi nó nhìn thấy một dòng mới, và việc xả nó bằng tay sẽ tốn nhiều công sức hơn.

Có lẽ là đếm ngược nhiều CPU nhất mà tôi từng thấy. Chạy trong một vòng lặp nóng để đảm bảo nó luôn chính xác nhất có thể. Nếu chạy theo thời hạn, nó sẽ tạo ra một số thứ khá kỳ lạ (tiêu cực ở khắp mọi nơi!)


@TobySpeight chắc chắn, đã sửa. Tôi nghĩ về chúng như bash vì tôi luôn sử dụng trang tham khảo này: tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
Dave

Có bất kỳ quy tắc cho hình thức chính trong C? Trong C90: bỏ trả về từ nguyên nhân chính trong trường hợp người gọi (HĐH) sẽ sử dụng giá trị trả về. Trong tiêu chuẩn C: main(x)không phải là một hình thức chính của hợp lệ, int ẩn đã bị xóa khỏi ngôn ngữ. Tôi tin rằng phiên bản tối thiểu, an toàn là int main(){}.
Lundin

@Lundin trong mã golf, các ngôn ngữ được xác định bởi cách triển khai của chúng (nghĩa là nếu bạn có thể tìm thấy trình biên dịch có sẵn công khai biên dịch mã theo cách bạn muốn, bạn có thể làm điều đó, nhưng nếu nó cần cài đặt cờ không chuẩn, các cờ đó sẽ được tính vào bytecount). Bạn đã đúng rằng đây không phải là nơi tuân thủ các tiêu chuẩn (cũng như những điều bạn nhận thấy, có các chức năng được xác định rõ ràng do không nhập khẩu và sự phụ thuộc vào thời gian trả về một số giây kể từ ngày 01/01/1970). Hãy xem meta cho các quy tắc (khá phân tán) mọi người theo dõi ở đây.
Dave

Một phần thú vị của những thử thách chơi gôn mã là khám phá những bản hack ngôn ngữ kỳ quái và những đặc điểm lỗi thời!
Dave

3

AHK , 145 byte

Đây không phải là câu trả lời ngắn nhất nhưng kết quả mang lại cảm giác tuyệt vời cho sự diệt vong, tôi nghĩ vậy. Ban đầu, tôi đã cố gắng gửi tổ hợp phím Ctrl+ Atheo sau DELvà sau đó bất kể thời gian là gì nhưng tốc độ làm mới quá chậm và nó sẽ phá hủy mọi môi trường bạn đang ở. Thay vào đó, tôi đã đi với GUI. Hóa ra là mất ít byte hơn để phá hủy hoàn toàn cửa sổ và tạo lại nó so với trước đây để cập nhật điều khiển nhiều lần nên tôi đã thực hiện điều đó. Đó là một hiệu ứng tốt đẹp.

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
}

Tôi sẽ hát bài hát cam chịu!


3

C #, 128 127 byte

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

Mã bị đánh cắp:

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

Tôi sẽ không tìm ra thủ thuật \ r mà không có sự trợ giúp từ các câu trả lời C # khác ở đây.

Đối với bất kỳ ai đang tìm kiếm cải tiến hơn nữa, bạn cũng có thể đặt biểu thức Write () bên trong vòng lặp for. Có vẻ như tôi có thể lưu một byte bằng cách nào đó ở đây, bởi vì điều đó tiết kiệm cho tôi dấu chấm phẩy cho câu lệnh đó, nhưng nó hoạt động đến cùng một số vì bạn không thể có một cơ thể hoàn toàn trống rỗng:

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

Chào mừng đến với PPCG!
Martin Ender

Bạn vẫn có thể lưu một ký tự bằng cách sử dụng chuỗi nội suy;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
Bob

Chơi tốt, tôi đã cố gắng tìm một cách để có một vòng lặp while (true) trong mã ngắn nhất có thể! Tôi sẽ nhớ mẹo đó. Bạn có thể cần thêm một vài khoảng trắng như tôi đã viết cho bạn bằng cách khác khi ngày chuyển từ 3 chữ số thành 2 chữ số, nó sẽ không ghi đè ký tự cuối cùng của chuỗi thời gian của bạn và bạn sẽ nhận được một đầu ra kỳ lạ
NibblyPig

Bạn có thể lưu một byte bằng cách sử dụng một chuỗi nội suy như trong câu trả lời của tôi. Định dạng của bạn của các dddmiếng đệm số 0, trông đẹp hơn so với phương pháp hai dấu cách.
TheLethalCoder

Cập nhật cho chuỗi nội suy.
Joel Coehoorn

3

Ruby (83 byte)

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

Bị đánh cắp

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

Về cơ bản là một trong những đệ trình Python, với một số cải tiến. Chúng tôi chỉ phát ra một "\ r" để bắt đầu chuỗi trước khi kết xuất lại. Và đối với định dạng chuỗi của "%03d:%02d:%02d:%02d", chúng tôi thực sự không quan tâm đến chiều rộng trên bộ xác định đầu tiên, vì vậy chúng tôi chỉ có thể làm "%02d"*4và phát ra một khoảng lùi và khoảng trắng để xóa dấu hai chấm không cần thiết.

Ngoài ra, tôi tìm thấy một ký tự ngắn hơn hai ký tự print: $><<. $>là một cách viết tắt toàn cầu $defout, đó là dòng đầu ra cho printprintfvà mặc định STDOUT. IO#<<viết phía bên tay phải của nó vào luồng. Làm thế nào là hai nhân vật ngắn hơn? Chà, bây giờ tôi có thể bỏ qua khoảng trắng dẫn trước dấu ngoặc đơn gói chuỗi định dạng.

Tại thời điểm này, tôi thực sự nghĩ rằng không có cách nào có thể rút ngắn chương trình này hơn nữa trong Ruby.

Chỉnh sửa: Tôi đã sai. Thay vì lần đầu tiên Time.new(2019,3,31), chúng ta chỉ có thể sử dụng thời gian UNIX thô : 1553990400.

Chỉnh sửa 2: Tôi đã thử chơi xung quanh với bao thanh toán trong vài phút và chia dấu thời gian UNIX cho hằng số đó, nhưng nó không thực sự tiết kiệm được bất kỳ byte nào. :

Chỉnh sửa 3: Hóa ra bộ nhớ đệm h=3600thực sự làm tổn thương tôi bởi hai byte. Rất tiếc.

Chỉnh sửa 4: Đã lưu 3 byte nhờ @EricDuminill. Ông đã sử dụng phao, nhưng lý trí làm việc mà không mất độ chính xác!

Chỉnh sửa 5: Array#*dưới dạng bí danh Array#join, với Ruby ?-syntax cho từng nhân vật!


Làm việc với hàng giờ thay vì vài giây dường như tiết kiệm 3 byte: loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}Tuy nhiên, giây có thể bị tắt bởi 1, do làm tròn số.
Eric Duminil

Cảm ơn! Liên kết với PHP bây giờ. :) Tôi đã sử dụng to_rthay vì to_fđể bảo vệ độ chính xác.
Stephen Touset

Không có gì. Đồng hồ này có thể vẫn còn sớm 1 giây, ngay cả khi .to_rthay vì.to_f
Eric Duminil

@StephenTouset Bạn có thể di chuyển +"\r"sang bên phải của mảng. Điều này cho phép bạn sử dụng ['%02d']*4*?:thay vì '%02d:'*4+"\b "vậy bạn có thể mất dấu ngoặc đơn, tạo cho bạn một byte. Lưu một byte khác bằng cách viết +?\rthay vì +"\r".
Synoli

Khám phá tuyệt vời!
Stephen Touset

2

JavaScript + HTML, 136 + 7 = 143 byte

setInterval("d=1553990400-new Date/1e3|0;w.innerText=[60,60,24,999].map(z=>(q='00'+d%z,d=d/z|0,q.slice(z<61?-2:-3))).reverse().join`:`")
<a id=w

Điểm số có làm cho nó một ... tình yêu byte ?
Kỹ sư Toast

2

C #, 142 byte

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;}}

Chương trình Ungolfed:

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;
    }
}

Điều này sẽ không dừng in khi nó chạm brexit, không chắc đó có phải là sự cố không
TheLethalCoder

@TheLethalCoder Đó là hợp pháp. Các hướng dẫn nêu cụ thể mã chỉ phải hoạt động cho đến ngày 31/3/2019 và những gì xảy ra sau đó không thành vấn đề. Nếu bạn có thể lưu byte bằng cách có đầu ra kỳ lạ hoặc thậm chí ngoại lệ sau ngày đó, thì bạn sẽ có thêm sức mạnh.
Joel Coehoorn

Ngoài ra: Tôi nghi ngờ sẽ có thể rút ngắn điều này bằng cách bỏ qua các ToString()byte và thay vào đó xây dựng định dạng thành phương thức Write () hoặc có thể là một chuỗi nội suy
Joel Coehoorn

Được rồi ... nó chắc chắn có thể. Tôi có nó xuống tới 127 byte. Tôi đang nối nó bên dưới bản gốc của bạn, vì vậy bạn vẫn nhận được tín dụng cho gotoý tưởng cơ bản .
Joel Coehoorn

Bản chỉnh sửa của tôi bị xóa sạch :( Đoán tôi sẽ phải đăng câu trả lời của riêng mình.
Joel Coehoorn

2

Ngày Bash + GNU, 128 byte

2 byte bị loại bỏ nhờ @muru và 2 byte trước đó nhờ @ This Guy.

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

Bị đánh cắp

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
Chưa bao giờ chơi gôn ở Bash trước đây nhưng bạn có thể xóa các khoảng trống tại thời điểm đó while[1]không?
caird coinheringaahing

Điểm công bằng, bây giờ đã cho rằng một thử nhưng nó mang lại line 1: [1]: command not foundlỗi. Không gian là bắt buộc có vẻ như :-(
steve

2
Gán 3600cho một biến để lưu 2 byte? Bạn cũng có thể thay đổi B=3600;A=86400sang B=3600;A=24*Bmột byte khác?
caird coinheringaahing

3600 biến bây giờ được thực hiện, thx. 24 * B sẽ không cần A=$[24*B]đến vậy mặc dù
steve

1
C=:%02d;printf "%03d$C$C$C\r"để tiết kiệm một byte? Và chuyển các bài tập sang A và B trong bối cảnh số học: D=$[B=3600,A=24*B,1553990400-`date +%s`]để cứu người khác?
muru

2

MATL, 45 byte

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

TIO rõ ràng không hỗ trợ xóa đầu ra, nhưng rất may MATL Online đã làm được !

Với thêm 2 byte, phiên bản thân thiện với CPU hơn một chút, pausemỗi giây:

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

Hãy thử điều này trên MATL Online

737515là "ngày 31 tháng 3 năm 2019" đại diện cho định dạng kỷ nguyên mặc định của MATLAB - số ngày từ ngày 0 tháng 1 năm 0000, tùy ý bao gồm một phần phân số để biểu thị thời gian trong ngày. (Tôi đã cố gắng rút ngắn điều này bằng cách tính toán bằng cách nào đó, nhưng các yếu tố duy nhất của nó là 5 và một số sáu chữ số khác (147503) và tôi không thể tìm ra cách để làm điều đó dưới 6 byte.)

`    % 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 byte

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

Điều này sẽ được tính chính xác cho đến khi 0:00:00:00và sau đó phá vỡ / thoát. Chạy với -r.

-2 byte nếu tôi không thể in 0.


1

RPL, 83 78 byte

Giả sử HP48 của bạn hoặc tương tự, được thiết lập với thời gian và ngày chính xác (Anh), định dạng ngày mm / dd và định dạng thời gian 24h:

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

Tôi đã rất ngạc nhiên khi có thể lưu 2 byte bằng cách loại bỏ khoảng trắng xung quanh ":". 1.1 là ngày hợp lệ ngắn nhất, sau đó được kết xuất bởi SUB. Hãy cẩn thận với trình giả lập, thời gian có thể chạy nhanh hơn hoặc chậm hơn (hoặc hoàn toàn không) so với đồng hồ treo tường của bạn. Với một HP thực sự, bạn có thể dừng chương trình này bằng cách nhấn phím BẬT hoặc chờ pin hết.


0

PHP, 102 95 90 byte

Đã lưu 7 byte nhờ @TheLethalCoder & bằng cách không bao thanh toán

Đã lưu thêm 5 byte bằng cách ghép

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

Đây là môn đánh gôn đầu tiên của tôi, vì vậy tôi có thể thiếu khá nhiều thủ thuật, nhưng ở đây bạn không quan tâm.

Đối với câu trả lời PHP của @chocochaos nếu không sẽ nói điều này, tôi tin rằng nó còn thiếu sót vì những lý do tôi đã giải thích trong các bình luận của mình, nhưng vì tôi mới ở đây nên tôi có thể sai. Hoặc tôi chỉ là một người mới :)


Bạn có thể cần một thẻ đóng? (Không chắc về điều đó). Bạn chỉ sử dụng $amột lần vì vậy cũng có thể sử dụng số tại chỗ. Tôi không quá quen thuộc với php nhưng có vẻ như có thể có nhiều cải tiến hơn
TheLethalCoder

Bạn có ý nghĩa flawed because of reasons stated in the commentsgì? Nếu bạn có ý kiến ​​về câu trả lời của họ, bạn là người duy nhất nhận xét.
caird coinheringaahing

@TheLethalCoder Không cần thẻ đóng. Và một trong những tốt đẹp!
Sworrub Wehttam

1
Bạn có thể lưu ~ 7 byte bằng cách sử dụng <?=thẻ mở và thả tiếng vang, gán $bở nơi bạn sử dụng lần đầu tiên. Ngoài ra, bạn có thể lưu 3 byte bằng cách sử dụng ^0thay vì floor. Đó là bitwise hoặc và liên quan đến việc chuyển sang int, đó là cách ngắn nhất để chuyển sang int tôi đã thấy.
dùng59178

1
Câu trả lời của tôi chỉ chạy tốt :) Ngoài ra, bạn có thể muốn đọc một số bài đăng ở đây: codegolf.meta.stackexchange.com/questions/tagged/php Không cần mở thẻ. Tôi thực sự khuyên bạn nên viết giải pháp của bạn theo cách nó sẽ chạy từ dòng lệnh, sau đó bạn sẽ không phải loay hoay với các tiêu đề để làm mới. Việc làm mới đó cũng sẽ khiến giải pháp của bạn "bỏ lỡ" một giây một lần, bởi vì nó không tính đến thời gian bị mất theo yêu cầu.
chocochaos

0

AWK , 78 byte

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

Hãy thử trực tuyến!

Đã lâu hơn trước khi tôi nhận ra tôi có thể tính toán trước thời gian kết thúc. Đôi khi nó trả tiền để hơi muộn với trò chơi và lấy ý tưởng từ những người khác.

FYI, liên kết TIO không hoạt động tốt, vì nó không thực hiện \rđúng.


0

F #, 142 byte

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

Tôi lớn lên ở Ireland cách biên giới khoảng nửa km. Ngoài biển báo "Chào mừng bạn đến Fermanagh" và vạch kẻ đường thay đổi, bạn sẽ không biết mình đã đến một quốc gia khác. Được sử dụng để vượt qua nó hai lần trên đường đến trường.


0

c, gcc 114 byte

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);}}

Không có gì bỏ qua, chương trình đầy đủ. Chương trình biên dịch bằng gcc trên Ubuntu. Việc đếm ngược sẽ không hiển thị một vệt dài các câu lệnh in vì lệnh hệ thống sẽ xóa và tạm dừng khi đếm ngược đạt 0 giây.

Vô duyên

#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();
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.