Kapan Brexit akan terjadi?


27

Nah, Brexit terjadi . Dan Sky News, sebagai jenius mereka, telah memutuskan untuk membuat hitungan mundur di sisi bus.

masukkan deskripsi gambar di sini

Tugas Anda adalah melakukan hal serupa. Inggris meninggalkan Uni Eropa pada tanggal 31 Maret 2019 dan Anda harus membuat hitungan mundur digital untuk ini yang berubah setiap detik (dengan deviasi 0,05 detik diizinkan).

Memasukkan

Program Anda harus sama sekali tidak menerima input. Itu dilarang!

Keluaran

Ini harus menampilkan waktu sampai Brexit dalam format ddd:hh:mm:ss. Leading dan trailing newline diperbolehkan tetapi tampilan harus tetap di tempat yang sama setiap kali. Seharusnya terlihat seolah-olah berkurang di tempat. Seperti yang ditunjukkan oleh @AnthonyPham, ini tidak berarti mencetak cukup baris baru untuk "menghapus" layar, ini berarti Anda harus benar-benar menghapus layar.

Output seperti ini tidak diizinkan:

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

Ini juga tidak

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

karena mereka berada di lebih dari satu baris.

Anda tidak perlu khawatir setelah Brexit. Program Anda hanya perlu bekerja hingga 31/3/2019

Aturan

  • Celah standar tidak diijinkan
  • Ini adalah sehingga kode terpendek dalam byte menang.
  • Pesan kesalahan (meskipun saya tidak bisa memikirkan caranya) tidak diizinkan
  • Kode harus dapat dijalankan dalam waktu 2 tahun (ketika Inggris meninggalkan Uni Eropa) dan harus menampilkan waktu aktual dan tidak mulai dari 730 lagi (lihat di bawah)

Aturan hitung mundur

Hitungan mundur tidak boleh berupa kode keras dan harus dapat dijalankan kapan saja sebelum Brexit selesai dan masih menghasilkan hasil yang benar. Ketika hari baru dimulai jam harus mengikuti format di bawah ini

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

Biar saya katakan lagi, tanggal Brexit selesai adalah 31/3/2019 pada tengah malam untuk kenyamanan (31: 3: 19 00:00:00 atau 31: 3: 2019 00:00:00 atau format lain yang Anda inginkan)

NB: Saya pikir saya memiliki segalanya tetapi saya tidak memposting ini di Sandbox, kalau tidak waktunya tidak tepat. Jangan ragu untuk mengirim saran untuk perbaikan karena tidak sempurna.


Bisakah saya menjalankannya setiap milidetik tetapi masih memberikan tampilan pembaruan setiap detik? Ini hanya untuk membuat kode saya lebih pendek.
David Archibald

@ Davidvidchrald hanya mengatakan bahwa tampilan harus berubah setiap detik. Hanya saja sebagian besar jawaban akan lebih mudah dijalankan setiap detik.
caird coinheringaahing

ahh Yah saya harus meletakkan 1000jika saya ingin itu berubah sekali setiap detik. Terima kasih
David Archibald

Apakah memimpin nol diperlukan?
Shaggy

1
Tengah malam zona waktu apa: UCT atau GMT? Apakah kita harus memperhitungkannya?
Titus

Jawaban:


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)

Sunting: Disimpan 2 byte berkat @Shaggy. Disimpan 11 byte berkat @ l4m2.


Berhasil mengalahkan Anda @Neil ... dengan beberapa byte.
David Archibald

Kenapa tidak digunakan <a id=0>? Atau semacam itu?
Solomon Ucko

3
Atau bahkan document.body.innerHTMLbukannyao.innerHTML
cloudfeet

1
Saya ingin itu menjadi monospace untuk memastikan bahwa tampilan tetap di tempat yang sama, tapi saya rasa saya bisa menghemat satu byte dan menggunakannya <tt>.
Neil

3
Anda dapat menyimpan 2 byte dengan menjalankan kode setiap milidetik (atau 2, atau 3 ...).
Shaggy

11

PowerShell, 70 63 55 53 Bytes

Kutipan ganda dikecualikan, mudah -2 terima kasih kepada @ Joey

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

Menjalankan ini dengan sleep menambahkan 8 byte, tetapi input sebagian besar tidak terlihat jika dijalankan tanpa mereka, versi (63 byte) dengan sleep:

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

for() adalah loop tak terbatas, dan dalam loop itu ..

cls untuk menghapus layar,

dapatkan 31/3/19sebagai DateTimeobjek, dan -tanggal saat ini darinya, untuk memberikan sisa waktu, lalu .ToString()( |% T*) dengan format yang benar.

ini akan menampilkan waktu negatif setelah brexit.


Ini juga sensitif terhadap format tanggal lokal. Meskipun format dd / m / yy UK tepat, imo, formatnya tidak akan berjalan seperti apa adanya di komputer AS. Saya ingin tahu bagaimana cara T*kerjanya. Saya tidak terbiasa dengan itu.
Joel Coehoorn

@ JoelCoehoorn Ini trik yang bagus, %foreach benar-benar mengambil Tobjek oString, dan akan menerima string berikutnya sebagai argumennya. mengenai format datetime mengapa itu tidak akan berjalan di komputer AS? Saya pikir yang ddlain tidak peka budaya.
colsw

Sedang berusaha mencari bulan # 31 di mesin saya. Bekerja dengan baik jika saya mengubahnya 3/31/19. Akan juga bekerja di 2019-03-31mana saja, tetapi biaya beberapa byte.
Joel Coehoorn

@JoelCoehoorn ah benar - maaf aku sedang memikirkan output, Diperbarui untuk 31Mar19bukan 31/3/19yang mudah-mudahan harus memperbaikinya?
colsw

1
Anda bisa kehilangan tanda kutip di sekitar string format, karena parsing argumen perintah berlaku.
Joey

7

Excel VBA, 91 84 82 byte

Disimpan 7 byte berkat JoeMalpass menunjukkan bahwa Excel melihat tanggal sebagai angka.
Disimpan 2 byte berkat JoeMalpass

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

Output ke sel A1di lembar Excel aktif.


-6 byte dengan menukar ("2019-3-31")dengan (43555). Namun ketika saya mencoba menjalankan ini di Excel, membeku setelah sekitar 5-6 detik ...
CactusCake

1
@ Jooealpass Terima kasih, itu poin yang bagus. Terlihat setelah beberapa detik bagi saya juga, karena menghitung jauh lebih cepat dari 1 / detik. Menambahkan penundaan, menambahkan byte dan OP tidak mengatakan itu harus dapat terus dihitung mundur dari sekarang sampai Brexit tanpa membakar apa pun.
Engineer Toast

Tampaknya Nowbekerja tanpa ()...
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}  ");}}

Disimpan 16 byte berkat @Bob Disimpan 6 byte berkat @ Søren D. Ptæus

Versi yang diformat:

using System;

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

Bisakah kamu melakukannya (TimeSpan)0? Di telepon, tidak dapat menguji sekarang. Anda masih dapat menghapus yang jernih karena carriage return mengurusnya: ini mengembalikan kursor di awal baris.
Bob

2
Pemikiran: mengandalkan CR mungkin gagal jika panjangnya berubah (kurang dari 100 hari). Perbaiki: tambahkan dua ruang ekstra di ujungnya.
Bob

@ Bob saya lupa menghapus Clear! Saya konyol. Dan tidak ada yang tidak dapat dikonversi intke TimeSpansaya sudah mencoba yang itu.
TheLethalCoder

Anda dapat menyimpan 6 byte tulisan (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
Søren D. Ptæus

@ SørenD.Ptæus Ide yang bagus bahkan tidak memikirkan yang satu itu
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))})

Terima kasih kepada @Fels untuk referensi Math, @dgrcode untuk referensiconsole

Tidak bermain golf

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
Anda dapat menyimpan sedikit penamaan ulang Matematika saya sepertig=Math;
Fels

Sepertinya aliasing Mathmasih bisa menghemat 2 byte, kan?
Marie

Anda dapat menyimpan sedikit lebih banyak dengan menggunakan fungsi panah dan menghilangkan var. Selain itu, pilih nama yang lebih pendek untuk variabel, seperti hbukan hours, atau mbukan minutes. Mungkin melakukan c=consoleakan menghemat beberapa byte lagi. Juga 1e3bukannya1000
Daniel Reina

4

PHP, 84 byte

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

Cukup mudah. 1553990400 adalah cap waktu untuk 31-3-2019 00:00:00 dalam UTC. Ini loop tak terhingga, menggunakan DateTime-> diff () -> format () untuk menampilkan berapa banyak waktu yang tersisa. Setelah Brexit terjadi, ia akan mulai menghitung mulai dari 0.

Versi yang dikomentari / lebih mudah dibaca:

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

Baru di sini, dan akan memposting jawaban saya sendiri. Beberapa hal: 1. Apakah kita boleh menghilangkan <?tag di sini? 2. Saya pikir kurung Anda salah, saat ini Anda memanggil ->diffgema daripada objek DateTime. 3. echo bekerja tanpa tanda kurung. 4. Bahkan setelah memperbaikinya, ini tidak berhasil untuk saya, tetapi saya baru bermain golf sehingga bisa saja saya menjadi idiot.
Sworrub Wehttam

1
Jalankan saja dan lihat, itu berfungsi dengan baik, sesuai persyaratan. Tidak perlu menyiram saat menjalankan PHP dari baris perintah. Ada awal di string untuk memindahkan kursor ke awal baris, itu terus menimpa waktu yang dikeluarkan sebelumnya. Ini adalah metode yang sama yang digunakan oleh banyak jawaban lain di sini.
chocochaos

1
Maaf, saya melewatkan komentar pertama Anda. Ya, kami diizinkan untuk menghapus tag pembuka, kecuali ada persyaratan untuk menyediakan program lengkap. Kurung baik-baik saja seperti mereka. Ya, gema berfungsi tanpa itu, tetapi memanggil diff pada objek DateTime tidak berfungsi tanpa mereka. Ini berjalan dengan baik di sini, versi PHP apa yang Anda gunakan dan bagaimana Anda menjalankan program? :)
chocochaos

1
Anda mungkin ingin memeriksa beberapa posting di sini: codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos

1
Itu hampir menutupinya, terima kasih atas wawasannya :)
Sworrub Wehttam

4

CJam, 69 62 59 57 byte

Disimpan 7 byte dengan mengonversi format waktu secara berbeda

Disimpan 3 byte berkat saran Martin Ender

Disimpan 2 byte dengan menggunakan carriage return bukan backspaces

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

Tidak dapat dijalankan di TIO karena alasan yang jelas.

Ini menulis ulang tampilan terus-menerus dalam loop tak terbatas sehingga jenis teks berkedip masuk dan keluar (setidaknya di konsol saya), meskipun hanya benar-benar memperbarui waktu sekali per detik.

Versi 70-byte ini hanya mencetak sekali per detik:

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

Penjelasan

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

Tidak dapat menguji sekarang, tetapi Anda mungkin dapat menggantinya Abdengan s, dan menyimpan byte dengan melakukan 1e3/terlebih dahulu lalu membaginya dalam urutan yang berlawanan 60md\60md\24md\]W%.
Martin Ender

@ Martin Yap, mereka berdua bekerja. Terima kasih
Bisnis Cat

Oh dan {60md\}2*menyimpan yang lain.
Martin Ender

3

Python 3.5 (118 Bytes)

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

Terima kasih kepada Bob karena telah menghemat 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}");}}

Program tidak digabungkan:

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

Terima kasih kepada Bob karena telah menyimpan 47 byte lagi!

Terima kasih kepada Martin Smith karena telah menghemat 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"));}}

Program tidak digabungkan:

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)lebih pendek.
Martin Smith

1
Anda juga dapat menghapus Console.Cleardan alih-alih menambahkan "\r"ke string, misalnya"\r"+(x-a)...
Bob

1
Lebih banyak peningkatan: (x-a).ToString(@"d\:hh\:mm\:ss")setara dengan `String.Format (" \ r {0: d \\: hh \\: mm \\: ss} ", xa)` setara dengan $@"{x-a:d\:hh\:mm\:ss}"(string yang lebih pendek, yang diinterpolasi dalam C # 6.0). Jika Anda melakukannya, maka Anda dapat lebih mempersingkat penuh "\r"+$@"{x-a:d\:hh\:mm\:ss}"ke dalam $"\r{x-a:d\\:hh\\:mm\\:ss}".
Bob

1
@TheLethalCoder Saya menganggap itu hanya karena tidak mengizinkan pendekatan multi-baris "palsu". Pengembalian kereta masih menimpa satu-satunya hal di layar. Setidaknya satu jawaban lain juga menggunakan pendekatan ini. Juga dapat menghapus tidur karena hanya penting bahwa tampilan berubah sekali per detik, dengan pembaruan yang tidak berubah diizinkan (lihat komentar pertanyaan). sunting: sebenarnya, komentar pertanyaan juga secara eksplisit mengizinkan CR ...
Bob

1
@ Bob Maaf saya membaca saran Anda sebagai baris baru, kesalahan saya. Tapi ya, tidurnya bisa dihilangkan
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);}

Kerusakan

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
}

Bergantung pada timepengembalian jumlah detik sejak 01/01/1970, yang merupakan kasus bagi saya (menggunakan Dentang / GCC pada macOS) dan harus menjadi kasus untuk sebagian besar barang UNIX.

Menggunakan bash terminal escape sequence untuk memindahkan kursor ( <esc>[1Amemindahkan kursor ke atas 1 baris). Akan lebih baik jika hanya menggunakan \r, tetapi printftidak akan memerah sampai ia melihat baris baru, dan membilasnya secara manual membutuhkan lebih banyak.

Mungkin hitungan mundur CPU paling intensif yang pernah saya lihat. Berjalan dalam loop panas untuk memastikan selalu seakurat mungkin. Jika dijalankan setelah batas waktu, itu akan menghasilkan beberapa hal yang sangat aneh (negatif di mana-mana!)


@TobySpeight yakin, diperbaiki. Saya menganggap mereka sebagai bash karena saya selalu menggunakan halaman referensi ini: tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
Dave

Apakah ada aturan untuk bentuk main di C? Di C90: menghilangkan pengembalian dari penyebab utama UB jika penelepon (OS) akan menggunakan nilai kembali. Dalam standar C: main(x)bukan bentuk utama yang valid, int implisit telah dihapus dari bahasa. Saya percaya versi minimal dan aman adalah int main(){}.
Lundin

@Lundin dalam kode golf, bahasa ditentukan oleh implementasinya (yaitu jika Anda dapat menemukan kompiler yang tersedia untuk umum yang mengkompilasi kode seperti yang Anda inginkan, Anda dapat melakukannya, tetapi jika membutuhkan pengaturan bendera non-standar, bendera tersebut dihitung untuk Anda bytecount). Anda benar bahwa ini tidak sesuai dengan standar (dan juga hal-hal yang telah Anda perhatikan, ada fungsi yang didefinisikan secara implisit karena tidak ada impor dan ketergantungan pada waktu mengembalikan beberapa detik sejak 01/01/1970). Lihatlah meta untuk aturan (yang agak bubar) yang orang ikuti di sekitar sini.
Dave

Bagian dari kesenangan tantangan kode golf adalah menemukan peretasan bahasa aneh dan fitur usang!
Dave

3

AHK , 145 Bytes

Ini bukan jawaban terpendek tetapi hasilnya memberikan perasaan malapetaka yang sangat bagus, saya pikir. Saya awalnya mencoba untuk mengirim penekanan tombol Ctrl+ Adiikuti oleh DELdan kemudian apapun waktu itu tapi refresh rate terlalu lambat dan itu akan menghancurkan apa pun lingkungan Anda berada di. Sebaliknya, kemudian, saya pergi dengan GUI. Ternyata mengambil lebih sedikit byte untuk benar-benar menghancurkan jendela dan membuatnya kembali daripada yang dilakukannya untuk memperbarui kontrol berulang kali jadi saya pergi dengan itu. Ini efek yang bagus.

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
}

Aku akan menyanyikan lagu malapetaka!


3

C #, 128 127 Bytes

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

Kode tidak dikunci:

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

Saya tidak akan menemukan trik tanpa bantuan dari jawaban C # lainnya di sini.

Untuk siapa pun yang mencari peningkatan lebih lanjut, Anda juga bisa memasukkan ekspresi Write () di dalam for loop. Sepertinya saya harus dapat menyimpan byte di sini, karena itu menyelamatkan saya titik koma untuk pernyataan itu, tetapi berhasil ke nomor yang sama karena Anda tidak dapat memiliki tubuh yang sepenuhnya kosong:

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

Selamat datang di PPCG!
Martin Ender

Anda masih dapat menyimpan satu karakter dengan menggunakan string yang diinterpolasi;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
Bob

Dimainkan dengan baik, saya mencoba mencari cara untuk memiliki loop sementara (benar) dalam kode sesingkat mungkin! Saya akan ingat trik itu. Anda mungkin perlu menambahkan beberapa spasi seperti yang saya lakukan pada tulisan Anda sebaliknya jika hari-hari berubah dari 3 digit menjadi 2 digit, itu tidak akan menimpa karakter terakhir dari string waktu Anda dan Anda akan mendapatkan hasil yang aneh
NibblyPig

Anda dapat menyimpan byte dengan menggunakan string interpolasi seperti pada jawaban saya. Format dddpad Anda nol, terlihat lebih baik daripada metode dua spasi yang bagus.
TheLethalCoder

Diperbarui untuk string interpolasi.
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}

Tidak disatukan

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

Pada dasarnya salah satu pengiriman Python, dengan beberapa perbaikan. Kami hanya memancarkan "\ r" untuk memulai string sebelum rendering ulang. Dan untuk format string "%03d:%02d:%02d:%02d", kita benar-benar tidak peduli tentang lebar pada specifier pertama ... jadi kita bisa melakukannya "%02d"*4, dan memancarkan backspace dan ruang untuk membersihkan titik dua yang tidak perlu.

Juga, saya menemukan dua karakter yang lebih pendek print: $><<. $>adalah singkatan global untuk $defout, yang merupakan aliran output untuk printdan printfdan default ke STDOUT. IO#<<menulis sisi kanannya ke aliran. Bagaimana dua karakter lebih pendek? Nah, sekarang saya bisa menghilangkan ruang yang memimpin sebelum tanda kurung membungkus string format.

Pada titik ini saya benar-benar berpikir tidak ada cara yang mungkin untuk mempersingkat program ini lebih lanjut di Ruby.

Sunting: Saya salah. Alih-alih pertama Time.new(2019,3,31), kita hanya bisa menggunakan waktu UNIX baku: 1553990400.

Sunting 2: Saya sudah mencoba bermain-main dengan memfaktorkan menit, dan membagi cap waktu UNIX dengan konstanta itu, tetapi sebenarnya tidak berakhir menghemat byte. :(

Sunting 3: Ternyata caching h=3600sebenarnya melukai saya dua byte. Aduh.

Sunting 4: Disimpan 3 byte berkat @EricDuminill. Dia menggunakan pelampung, tetapi rasional bekerja tanpa kehilangan presisi!

Sunting 5: Array#*sebagai alias untuk Array#join, dengan Ruby ?-syntax untuk masing-masing karakter!


Bekerja dengan jam alih-alih detik tampaknya menghemat 3 byte: loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}Detik mungkin mati 1, karena pembulatan.
Eric Duminil

Terima kasih! Terikat dengan PHP sekarang. :) Saya menggunakan to_rbukannya to_fmenjaga presisi.
Stephen Touset

Sama-sama. Jam ini mungkin masih 1s lebih awal, bahkan dengan .to_rbukan.to_f
Eric Duminil

@StephenTouset Anda dapat bergerak +"\r"ke kanan array. Ini memungkinkan Anda untuk menggunakan ['%02d']*4*?:alih-alih '%02d:'*4+"\b "agar Anda dapat kehilangan tanda kurung, yang berarti Anda satu byte. Simpan byte lain dengan menulis +?\ralih-alih +"\r".
Synoli

Penemuan luar biasa!
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

Apakah skor menjadikannya ... byte cinta ?
Engineer 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;}}

Program tidak digabungkan:

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

Ini tidak akan berhenti mencetak ketika menyentuh brexit, tidak yakin apakah itu masalah
TheLethalCoder

@TheLethalCoder Itu legal. Instruksi khusus menyatakan kode hanya bekerja sampai 31/3/2019, dan apa yang terjadi setelah itu tidak masalah. Jika Anda dapat menghemat byte dengan memiliki output aneh atau bahkan pengecualian setelah tanggal itu, maka lebih banyak kekuatan untuk Anda.
Joel Coehoorn

Juga: Saya menduga akan mungkin untuk mendapatkan korslet ini bahkan dengan melewatkan ToString()byte dan bukannya membangun pemformatan ke dalam metode Write (), atau mungkin string yang diinterpolasi
Joel Coehoorn

Oke ... itu pasti mungkin. Saya memilikinya hingga 127 byte. Saya menambahkannya di bawah yang asli, sehingga Anda masih mendapatkan kredit untuk gotoide dasarnya .
Joel Coehoorn

Hasil edit saya dihapus :( Kira saya harus memposting jawaban saya sendiri.
Joel Coehoorn

2

Tanggal Bash + GNU, 128 byte

2 byte dikurangi berkat @muru, dan 2 byte sebelumnya berkat @ 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

Tidak disatukan

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
Tidak pernah golfed di Bash sebelumnya, tapi dapat Anda menghapus spasi di sementara: while[1]?
caird coinheringaahing

Poin yang wajar, sekarang telah mencoba itu tetapi menghasilkan line 1: [1]: command not foundkesalahan. Tampaknya ruang wajib :-(
steve

2
Tetapkan 3600ke variabel untuk menyimpan 2 byte? Anda mungkin juga dapat mengubah B=3600;A=86400ke B=3600;A=24*Bbyte lain?
caird coinheringaahing

3600 variabel sekarang selesai, terima kasih. 24 * B akan perlu A=$[24*B]jadi tidak mungkin di sana
steve

1
C=:%02d;printf "%03d$C$C$C\r"untuk menyimpan byte? Dan pindahkan tugas ke A dan B dalam konteks aritmatika: D=$[B=3600,A=24*B,1553990400-`date +%s`]untuk menyimpan yang lain?
muru

2

MATL, 45 byte

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

TIO tampaknya tidak mendukung kliring output, tetapi untungnya MATL Online melakukannya !

Dengan 2 byte lebih banyak, versi yang lebih ramah-CPU yang melakukan pause(tidur) setiap detik:

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

Coba ini di MATL Online

737515adalah "31 Maret 2019" mewakili format zaman standar MATLAB - jumlah hari sejak 0 Januari 0000, secara opsional termasuk bagian fraksional untuk mewakili waktu hari. (Saya mencoba memperpendek ini dengan menghitungnya entah bagaimana, tetapi satu-satunya faktor adalah 5 dan enam digit angka lainnya (147503), dan saya tidak dapat menemukan cara untuk melakukannya dalam waktu kurang dari 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);

Ini akan menghitung dengan tepat sampai 0:00:00:00dan kemudian break / keluar. Jalankan dengan -r.

-2 byte jika saya tidak perlu mencetak 0.


1

RPL, 83 78 byte

Dengan asumsi HP48 Anda, atau yang serupa, diatur dengan waktu dan tanggal (UK) yang benar, format tanggal mm / dd, dan format waktu 24 jam:

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

Saya terkejut bisa menghemat 2 byte dengan menghapus spasi di sekitar ":". 1.1 adalah tanggal valid terpendek, kemudian dibuang oleh SUB. Hati-hati dengan emulator, waktu dapat berjalan lebih cepat atau lebih lambat (atau tidak sama sekali) dari jam dinding Anda. Dengan HP asli, Anda dapat menghentikan program ini dengan menekan tombol ON ... atau menunggu baterai kosong.


0

PHP, 102 95 90 byte

Disimpan 7 byte berkat @TheLethalCoder & dengan tidak memfaktorkan

Menyimpan 5 byte lainnya dengan menggabungkan

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

Ini golf pertama saya, jadi saya mungkin kehilangan beberapa trik, tetapi di sini Anda terlepas dari itu.

Adapun jawaban PHP @chocochaos 'yang kalau tidak akan truf ini, saya percaya itu cacat karena alasan yang saya jelaskan dalam komentar saya, tetapi karena saya baru di sini saya mungkin salah. Atau saya hanya seorang pemula :)


Anda mungkin perlu tag penutup? (Tidak yakin tentang itu). Anda hanya menggunakan $asekali jadi sebaiknya gunakan nomor di tempat. Saya tidak terlalu terbiasa dengan php tetapi sepertinya mungkin ada lebih banyak perbaikan
TheLethalCoder

Apa maksudmu flawed because of reasons stated in the comments? Jika Anda mengomentari jawaban mereka, hanya Anda yang berkomentar.
caird coinheringaahing

@TheLethalCoder Tidak perlu tag penutup. Dan yang bagus!
Sworrub Wehttam

1
Anda dapat menyimpan ~ 7 byte dengan menggunakan <?=tag pembuka dan menjatuhkan gema, menetapkan $bdi tempat Anda pertama kali menggunakannya. Selain itu Anda dapat menghemat 3 byte menggunakan ^0bukan floor. Ini bitwise atau dan melibatkan pemain ke int, ini adalah cara terpendek untuk pemain ke int yang pernah saya lihat.
user59178

1
Jawaban saya berjalan dengan baik :) Juga, Anda mungkin ingin membaca beberapa posting di sini: codegolf.meta.stackexchange.com/questions/tagged/php Tidak perlu membuka tag juga. Saya benar-benar merekomendasikan untuk menulis solusi Anda sedemikian rupa sehingga akan berjalan dari baris perintah, maka Anda tidak perlu dipusingkan dengan header untuk menyegarkan. Penyegaran itu juga akan menyebabkan solusi Anda "ketinggalan" sesekali, karena itu tidak memperhitungkan waktu yang hilang pada permintaan itu sendiri.
chocochaos

0

AWK , 78 byte

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

Cobalah online!

Lebih lama sebelum saya menyadari saya bisa menghitung ulang waktu akhir. Terkadang agak terlambat untuk bermain dan mendapatkan ide dari orang lain.

FYI, tautan TIO tidak berfungsi dengan baik, karena tidak diterapkan \rdengan benar.


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

Saya tumbuh di Irlandia sekitar setengah kilometer dari perbatasan. Terlepas dari tanda "Selamat datang di Fermanagh" dan tanda jalan berubah Anda tidak akan tahu Anda akan memasuki negara lain. Digunakan untuk menyeberang dua kali dalam perjalanan ke sekolah.


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

Tidak ada yang dihapus, program lengkap. Program dikompilasi dalam gcc di Ubuntu. Hitung mundur tidak akan menampilkan jejak panjang pernyataan cetak karena panggilan sistem untuk menghapus dan berhenti ketika hitungan mundur mencapai 0 detik.

Tidak disatukan

#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();
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.