Brexit ne zaman olacak?


27

Eh, Brexit oldu . Sky News, oldukları dahiler olan bir otobüs tarafında geri sayım yapmaya karar verdi.

görüntü tanımını buraya girin

Senin işin benzer bir şey yapmak. İngiltere, AB’yi 31 Mart 2019’da bırakıyor ve bunun için her saniye değişen (0,05 saniye sapma ile) dijital bir geri sayım oluşturmanız gerekiyor.

Giriş

Programınız kesinlikle giriş yapmamalı. Bu yasaklandı!

Çıktı

Brexit formatına kadar olan süreyi vermelidir ddd:hh:mm:ss. Öncü ve izleyen yeni hatlara izin verilir, ancak ekran her zaman aynı yerde kalmalıdır. Yerinde düşüyor gibi görünmelidir. @AnthonyPham tarafından belirtildiği gibi, bu, ekranı "temizlemek" için yeterince yeni satır yazdırmak anlamına gelmez, bu aslında ekranı temizlemeniz gerektiği anlamına gelir.

Bunun gibi bir çıktıya izin verilmiyor:

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

Bu da

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

Birden fazla hatta oldukları gibi.

Brexit’ten sonra endişelenmene gerek yok. Programınız yalnızca 31/3/2019 tarihine kadar çalışacaktır.

kurallar

  • Standart boşluklara izin verilmez
  • Bu yani bayt cinsinden en kısa kod kazanır.
  • Hata mesajları (nasıl olduğunu düşünemesem de) izin verilmez
  • Kod 2 yıl içerisinde çalışabilmelidir (İngiltere AB'den çıktığında) ve gerçek zamanı göstermeli ve 730'dan başlamamalıdır (aşağıya bakınız)

Geri sayım kuralı

Geri sayım kodlanmış olmamalı ve Brexit bitmeden herhangi bir zamanda çalışabilmeli ve yine de doğru sonucu verebilmelidir. Yeni bir güne başladığınızda, saat aşağıdaki formatı izlemelidir.

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

Tekrar söyleyeyim, rahatlık için Brexit'in bitiş tarihi 31/3/2019 (31: 3: 19 00:00:00 veya 31: 3: 2019 00:00:00 veya istediğiniz başka bir format)

Not: Sanırım her şeye sahibim ama bunu Sandbox'a göndermedim, aksi halde zamanlama kapanabilirdi. Gelişmeler için herhangi bir öneri göndermek için çekinmeyin, çünkü mükemmel değil.


Her milisaniyede çalıştırabilir miyim, ancak yine de her saniyede bir güncelleme yapabilir mi? Bu sadece kodumu kısaltmak için.
David Archibald

@DavidArchibald sadece ekranın her saniye değişmesi gerektiğini söylüyor . Sadece cevapların çoğu her saniye çalıştırmayı daha kolay bulacak.
caird coinheringaahing

ahh. 1000Saniyede bir kez değişmesini istersem koymak zorundayım . Teşekkürler
David Archibald

Baştaki sıfırlar gerekli mi?
Shaggy,

1
Gece yarısı hangi saat dilimi: UCT veya GMT? Bunu dikkate almak zorunda mıyız?
Titus

Yanıtlar:


12

JavaScript, 134 129 113 bayt

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

Düzenleme: @Shaggy sayesinde 2 bayt kaydedildi. @ L4m2 sayesinde 11 bayt kaydedildi.


@Neil ... 'i birkaç byte ile yenmeyi başardı.
David Archibald

Neden kullanmaz <a id=0>? Ya da böyle bir şey?
Solomon Ucko

3
Ya da document.body.innerHTMLyerineo.innerHTML
cloudfeet

1
Ekranın aynı yerde kalmasını sağlamak için tek boşluk olmasını istedim, ancak bir bayt kurtarabilir ve kullanabilirim <tt>.
Neil

3
Her milisaniyede bir (veya 2 veya 3 ...) kod çalıştırarak 2 bayt tasarruf edebilirsiniz.
Shaggy,

11

PowerShell, 70 63 55 53 Bayt

Dışlanan çift tırnak, @Joey sayesinde kolay -2

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

Bunu uyku ile çalıştırmak 8 byte ekler, ancak giriş onlarsız çalıştırıldığında çoğunlukla görünmezdir, uykuda sürüm (63 byte):

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

for() sonsuz bir döngüdür ve bu döngü içinde ..

cls ekranı temizlemek için

olsun 31/3/19bir şekilde DateTimenesneye ve -ardından kalan zaman vermek, ondan geçerli tarih .ToString()( |% T*) doğru formatta olduğunu.

Bu brexit sonra olumsuz zaman gösterecektir.


Bu aynı zamanda yerel tarih formatına da duyarlıdır. İngiltere dd / m / yy formatı uygun olsa da, imo, ABD makinelerinde olduğu gibi çalışmaz. Nasıl T*çalıştığını merak ediyorum . Buna aşina değilim.
Joel Coehoorn

@JoelCoehoorn Güzel bir numara, %foreach aslında ToString nesnesini seçti ve bir sonraki dizgeyi argümanı olarak kabul edecek. datetime biçimiyle ilgili olarak neden ABD makinelerinde çalışmaz? ddVb kültür-duyarsız olduğunu düşündüm .
colsw

Makinemde 31. ay bulmaya çalışıyor. Ben değiştirirseniz iyi çalışır 3/31/19. Ayrıca 2019-03-31her yerde çalışırdı, ama bu size birkaç byte eder.
Joel Coehoorn

@JoelCoehoorn ah sağ - üzgünüm çıktıyı düşünüyordum, 31Mar19bunun yerine Güncelleme 31/3/19hangi umarım düzeltmeli?
colsw

1
Komut argümanı ayrıştırma uygulandığı için, biçim dizgisinin etrafındaki tırnak işaretlerini kaybedebilirsiniz.
Joey,

7

Excel VBA, 91 84 82 bayt

Excel'in tarihleri ​​sayı olarak gördüğünü işaret eden JoeMalpass sayesinde 7 bayt kurtardı.
JoeMalpass sayesinde 2 bayt kaydedildi

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

Çıktı, A1aktif Excel sayfasındaki hücreyedir.


-6 değiştirerek bayt ("2019-3-31")ile (43555). Ancak bunu Excel'de çalıştırmayı denediğimde, yaklaşık 5-6 saniye sonra donuyor ...
CactusCake

1
@JoeMalpass Teşekkürler, bu iyi bir nokta. Benim için de birkaç saniye sonra görünüyor, çünkü 1 / saniyeden daha hızlı bir şekilde hesaplıyor. Yine de gecikmeler eklemek, bayt ekler ve OP, hiçbir zaman ateş yakmadan Brexit'e kadar sürekli geri sayım yapabileceğini söylemez.
Mühendis Toast,

Görünüşe göre çok Nowolmadan çalışıyor ()...
CactusCake

6

Python 3.6, 146 bayt

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 bayt

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

@Bob sayesinde 16 bayt kaydedildi @ Søren D. Ptæus ile kaydedilmiş 6 bayt

Biçimlendirilmiş versiyon:

using System;

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

Bunu yapabilir misin (TimeSpan)0? Telefonda, şu anda test edemiyorum. Taşıyıcı dönüşü çaresine bakarken hala temizliği bırakabilirsiniz: imleci satırın başlangıcına geri getirir.
Bob,

2
Düşünce: uzunluk değişirse (100 günden az) CR'ye güvenmek başarısız olabilir. Düzeltme: ucuna iki boşluk daha ekleyin.
Bob,

@ Bob kaldırmak için unuttum Clear! Aptal ben. Ve hayır dönüştüremezsin int, TimeSpanbunu çoktan denedim.
TheLethalCoder

Yazarken 6 bayt kaydedebilirsiniz (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
Søren D. Ptæus

@ SørenD.Ptæus İyi bir fikir bile bunu düşünmedi
TheLethalCoder

4

JavaScript ES5, 320 319 316 305 295 284 bayt

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

Referans için @Fels sayesinde Mathreferans alma, @dgrcodeconsole

Un-golfed

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
Benim yeniden adlandırma Matematik biraz gibi kaydedebilirsinizg=Math;
Fels

Görünüşe göre takma ad Mathhala 2 byte tasarruf sağlayabilir, değil mi?
Marie

Ok işlevlerini kullanarak ve kurtularak biraz daha fazla tasarruf edebilirsiniz var. Ayrıca, değişkenler hyerine hours, myerine veya yerine daha kısa adlar seçin minutes. Muhtemelen yapıyorsanız c=consolebirkaç bayt daha fazla tasarruf sağlayacaktır. Ayrıca 1e3yerine1000
Daniel Reina

4

PHP, 84 bayt

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

Yeterince açıksözlü. 1553990400 UTC'de 31-3-2019 00:00:00 saatleri için zaman damgasıdır. Ne kadar zaman kaldığını göstermek için DateTime-> diff () -> format () kullanarak sonsuz döngüler. Brexit olduktan sonra 0'dan saymaya başlayacaktır.

Yorum / okunabilir sürüm:

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

Burada yeni ve kendi cevabımı göndermek üzeresiniz. Birkaç şey: 1. <?Buradaki etiketi atlamamıza izin var mı? 2. Parantezinizin yanlış olduğunu düşünüyorum, şu anda ->diffDateTime nesnesi yerine yankıyı çağırıyorsunuz . 3. yankı yine de parantez olmadan çalışır. 4. Bunu düzelttikten sonra bile, bu benim için işe yaramıyor, ama ben sadece aptal olmak için golf oynamak için yeniyim.
Sworrub Wehttam

1
Sadece çalıştırın ve görün, gereksinimlere göre, iyi çalışıyor. PHP'yi komut satırından çalıştırırken yıkamaya gerek yoktur. İmleci satırın başına getirmek için dizenin başında bir \ r var, daha önce çıkarılan zamanın üzerine yazıyor. Buradaki birçok cevabın kullandığı yöntem.
chocochaos

1
Üzgünüm, ilk yorumunuzu kaçırdım. Evet, tam bir program sağlama zorunluluğu olmadığı sürece açılış etiketlerini atlamamıza izin verilir. Parantez, oldukları gibi gayet iyi. Evet, echo onsuz çalışır, ancak DateTime nesnesindeki diff'i çağırmak onlarsız çalışmaz. Burada iyi çalışıyor, hangi PHP sürümünü kullanıyorsunuz ve programı nasıl kullanıyorsunuz? :)
chocochaos

1
Buradaki bazı yayınları incelemek isteyebilirsiniz: codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos

1
Bu hemen hemen kapsar, içgörü için teşekkürler :)
Sworrub Wehttam

4

CJam, 69 62 59 57 bayt

Farklı şekilde saat biçimine dönüştürerek 7 bayt kaydedildi

Martin Ender'in önerileri sayesinde 3 bayt kaydedildi

Backspaces yerine bir satır başı kullanarak 2 bayt kaydedildi

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

Belirgin nedenlerden dolayı TIO'da çalıştırılamaz.

Ekranı sürekli olarak sonsuz bir döngüde yeniden yazar, böylece metin türü içeri ve dışarı yanıp söner (en azından konsolumda), gerçekte yalnızca saniyede bir kez günceller.

Bu 70 baytlık sürüm yalnızca saniyede bir kez yazdırılır:

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

açıklama

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

Şu anda test edemez, ancak muhtemelen yerini alabilir Abile sve yaparak bir byte kaydetmek 1e3/birinci ve daha sonra ters sırayla bölmek 60md\60md\24md\]W%.
Martin Ender

@MartinEnder Yep, ikisi de çalışıyor. Teşekkürler
Business Cat

Oh ve {60md\}2*başka kaydeder.
Martin Ender

3

Python 3.5 (118 Bayt)

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 bayt

Bob'a 57 byte kaydettiği için teşekkürler !

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

Ungolfed programı:

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 bayt

Bob'a 47 byte daha kaydettiğin için teşekkürler !

4 byte'ı kurtardığı için Martin Smith'e teşekkürler !

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

Ungolfed programı:

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)daha kısa.
Martin Smith

1
Ayrıca Console.Clearve yerine "\r"dizeyi hazırlayabilirsiniz , örneğin"\r"+(x-a)...
Bob

1
Daha fazla gelişme: (x-a).ToString(@"d\:hh\:mm\:ss")`String.Format (" \ r {0: d \\: hh \\: mm \\: ss} ", xa) 'ye eşdeğerdir $@"{x-a:d\:hh\:mm\:ss}"(C # 6.0'da daha kısa, enterpolasyonlu dize). Bunu yaparsanız, daha sonra tam "\r"+$@"{x-a:d\:hh\:mm\:ss}"içine kısaltabilirsiniz $"\r{x-a:d\\:hh\\:mm\\:ss}".
Bob,

1
@ TheLethalCoder "Sahte" multi-newline yaklaşımına izin vermemeyi basitçe kabul ettim. Bir satır başı hala ekrandaki tek şeyin üzerine yazar. En az bir başka cevap da bu yaklaşımı kullanır. Ayrıca, değişmeyen güncellemelere izin verilen ekranın saniyede bir kez değişmesi önemli olduğu için uykuyu da kaldırabilirsiniz (soru açıklamalarına bakın). düzenleme: aslında, soru yorumları da açıkça CR izin verir ...
Bob

1
@Bob Üzgünüm önerinizi yeni bir satır olarak okudum, hatam. Ama evet uyku kaldırılabilir
TheLethalCoder

3

C, 104 bayt

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

Yıkmak

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
}

Güveniyor time(MacOS üzerinde Clang / GCC kullanarak) benim için böyledir ve çoğu UNIX şeyler için durum olması gereken 01/01/1970 beri saniye sayısını dönüyor.

İmleci hareket ettirmek için bash terminali kaçış dizilerini kullanır ( <esc>[1Aimleci 1 satır yukarı taşır). Basitçe kullanabilmek daha güzel olurdu \r, ancak printfyeni bir satır görene kadar akmayacak ve manuel olarak yıkamak çok daha fazla zaman alıyor.

Muhtemelen şimdiye kadar gördüğüm en yoğun CPU sayımı. Her zaman olabildiğince doğru olduğundan emin olmak için sıcak bir döngüde çalışır. Son teslim tarihinden sonra koşulursa, bazı garip şeyler üretecektir (her yerde negatifler!).


@TobySpeight kesin, düzeltildi. Bunları bash olarak düşünüyorum çünkü her zaman bu referans sayfasını kullanıyorum: tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
Dave

C de ana form için herhangi bir kural var mı? C90'da: Arayanın (OS) geri dönüş değerini kullanması durumunda, ana geri dönüşün ihmal edilmesi UB'ye neden olur. C standartında: main(x)geçerli bir ana biçim değildir, örtük int dilden kaldırılmıştır. Asgari, güvenli sürüm olduğuna inanıyorum int main(){}.
Lundin

@Lundin kod golfünde, dilleri kendi uygulamalarına göre tanımlanır (örneğin, kodu istediğiniz şekilde derleyen halka açık bir derleyici bulabilirseniz, bunu yapabilirsiniz, ancak standart olmayan bayraklar ayarına ihtiyaç duyuyorsa, bu bayraklar size göre sayılır. bytecount). Bunun, standartlara uygun hiçbir yerde olmadığını doğrularsınız (fark ettiğiniz şeylerin yanı sıra, hiçbir ithalat ve 01/01 / 1970'den bu yana birkaç saniye geri dönen zamana güvenme nedeniyle dolaylı olarak tanımlanmış işlevler vardır). İnsanların buralarda takip ettiği (dağılma) kurallar için metaya bir göz atın.
Dave,

Kod golf mücadelelerinin eğlenceli bir parçası tuhaf dil hackleri ve eski özellikleri keşfetmek!
Dave,

3

AHK , 145 Bayt

Bu en kısa cevap değil ama sonuç çok iyi bir kıyamet duygusu veriyor. Başlangıçta tuş vuruşlarını Ctrl+ Aardından göndermeye çalıştım, DELsonra ve her ne zaman olsaydı ama yenileme hızı çok yavaştı ve içinde bulunduğunuz ortamı yok edecekti. Bunun yerine GUI'ye gittim. Pencereyi tamamen tahrip etmek ve tekrar tekrar kontrol etmekten daha fazla yenilemek için tekrar yarattığımızdan daha az bayt aldım ve bununla devam ettim. Güzel bir etki.

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
}

Doom şarkısını söyleyeceğim!


3

C #, 128 127 Bayt

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

Ungolfed kod:

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

Buradaki diğer C # cevaplarından yardım almadan hileyi çözemezdim.

Daha fazla gelişme isteyen herkes için, for () döngüsüne Write () ifadesini de koyabilirsiniz. Görünüşe göre bir baytı burada bir şekilde saklayabilmeliyim, çünkü bu bana bu ifadenin noktalı virgülünü kazandırıyor, ancak aynı sayıya kadar çalışıyor, çünkü tamamen boş bir gövdeye sahip olamazsınız:

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

PPCG'ye Hoşgeldiniz!
Martin Ender

Enterpolasyonlu bir dize kullanarak tek bir karakteri hala kaydedebilirsiniz;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
Bob

İyi oynadım, mümkün olan en kısa kodda bir süre (gerçek) bir döngü elde etmenin bir yolunu bulmaya çalıştım! Bu numarayı hatırlayacağım. Aksi halde, günler 3 basamaktan 2 basamağa geçtiğinde yazmanıza rağmen yaptığım gibi birkaç boşluk eklemeniz gerekebilir, zaman dizenizin son karakterinin üzerine yazmaz ve garip bir çıktı alırsınız
NibblyPig

Cevabımdaki gibi enterpolasyonlu bir dize kullanarak bir bayt kaydedebilirsiniz. dddPed formatınız sıfırları, iki boşluk metodundan daha iyi görünüyor.
TheLethalCoder

Enterpolasyonlu dize için güncellendi.
Joel Coehoorn

3

Yakut (83 bayt)

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

Ungolfed

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

Temelde Python gönderilerinden biri, bazı geliştirmeler ile. Yeniden oluşturmadan önce dizenin başlangıcına gitmek için sadece bir "\ r" yayarız. Ve dize formatı "%03d:%02d:%02d:%02d"için, ilk belirleyicideki genişliği umursamıyoruz… böylece sadece "%02d"*4gereksiz kolonu temizlemek için bir geri ve bir boşluk yayabiliriz.

Ayrıca, iki karakter daha kısa bulundu print: $><<. $>küresel bir kısaltmadır $defoutiçin çıkış akışı, printve printfve varsayılan için STDOUT. IO#<<sağ tarafını dere yazar. Bu iki karakter nasıl daha kısa? Şimdi, parantezden önce biçim dizesini saran boşluğu atlayabilirim.

Bu noktada, gerçekten Ruby'de bu programı daha da kısaltmanın bir yolu olmadığını düşünüyorum.

Düzenleme: Yanılmışım. Bunun yerine ilk Time.new(2019,3,31)biz sadece çiğ UNIX zaman kullanabilirsiniz: 1553990400.

Düzenleme 2: Dakikaları çarpanlarla oynamayı ve UNIX zaman damgasını bu sabit ile bölerek denemeyi denedim, ancak aslında baytlardan tasarruf edilmesini önlüyor. :(

Düzenleme 3: Önbelleklemenin h=3600aslında iki byte kadar bana zarar verdiği ortaya çıktı. Whoops.

Düzenleme 4: @EricDuminill sayesinde 3 bayt kaydedildi. Yüzenleri kullandı, ancak gerekçeler hassasiyet kaybı olmadan çalışıyor!

Düzenleme 5: Array#*takma ad olarak Array#join, ?tek tek karakterler için Ruby -syntax ile !


Saniyeler yerine saatlerle çalışmak 3 bayttan tasarruf sağlıyor gibi görünüyor: loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}Saniyeler, yuvarlama nedeniyle olsa 1 ile kapalı olabilir.
Eric Duminil

Teşekkürler! Şimdi PHP ile bağlı. :) Hassasiyeti korumak to_ryerine kullandım to_f.
Stephen Touset,

Rica ederim. Bu saat hala 1 saat erken olsa bile, .to_ryerine.to_f
Eric Duminil

@StephenTouset Dizinin sağına gidebilirsiniz +"\r". Bu, ['%02d']*4*?:yerine kullanmanıza olanak tanır , '%02d:'*4+"\b "böylece bir bayt ağını tutan parantezleri kaybedebilirsiniz. Yerine başka byte +?\ryerine yazarak kaydedin +"\r".
Synoli,

Mükemmel keşif!
Stephen Touset

2

JavaScript + HTML, 136 + 7 = 143 bayt

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


2

C #, 142 bayt

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

Ungolfed programı:

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

Bu, brexit'e çarptığında yazdırmayı durdurmaz, bir sorun olup olmadığından emin değil
TheLethalCoder

@TheLethalCoder Bu yasal. Talimatlar, kodun yalnızca 31/3 / 2019'a kadar çalışması gerektiğini ve bundan sonra ne olacağını önemli olarak belirtir. Bu tarihten sonra garip çıktı veya hatta istisnalar yaparak baytları kurtarırsanız, o zaman size daha fazla güç kazandırır.
Joel Coehoorn

Ayrıca: Baytları atlayarak ToString()ve bunun yerine biçimlendirmeyi Write () yöntemine ya da enterpolasyonlu bir dizgeye ekleyerek bu kısaltmayı elde etmenin mümkün olacağından şüpheleniyorum
Joel Coehoorn

Tamam ... kesinlikle mümkün. 127 bayta indirdim. Orijinalin altına ekliyorum, bu yüzden hala temel gotofikir için kredi alıyorsunuz .
Joel Coehoorn

Düzenlemem go wiped :( Sanırım kendi cevabımı göndermek zorunda kalacağım.
Joel Coehoorn

2

Bash + GNU tarihi, 128 bayt

@Muru sayesinde 2 bayt tıraş edildi ve @Bu Guy sayesinde 2 bayt daha erken.

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

Ungolfed

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
Daha önce Bash'de golf oynamamıştım, ancak boşlukları kaldırabilir while[1]misin?
caird coinheringaahing

Adil nokta, şimdi bir denemede bulundum ama line 1: [1]: command not foundhata veriyor . Boşluklar zorunlu gibi görünüyor :-(
steve

2
36002 bayt kaydetmek için bir değişkene atama ? Ayrıca değiştirmek mümkün olabilir B=3600;A=86400için B=3600;A=24*Bbaşka byte için?
caird coinheringaahing

3600 değişkeni şimdi yapıldı, thx. 24 * B A=$[24*B]orada mümkün olsa gerek
steve

1
C=:%02d;printf "%03d$C$C$C\r"bir bayt kaydetmek için? Ve ödevleri aritmetik bağlamda A ve B'ye taşıyın: D=$[B=3600,A=24*B,1553990400-`date +%s`]başka bir tane kaydetmek için?
muru

2

MATL, 45 bayt

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

Görünüşe göre TIO çıktı temizlemeyi desteklemiyor, ama neyse ki MATL Online bunu yapıyor !

2 bayt daha, pauseher saniye bir uyku (uyku) yapan biraz daha CPU-dostu sürüm :

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

Bunu MATL Online'da deneyin

737515"31 Mart 2019", MATLAB’nın varsayılan çağ formatını temsil eder - isteğe bağlı olarak günün zamanını temsil eden kesirli bir kısmı da içeren 0 Ocak 0000’den gün sayısı. (Bir şekilde hesaplayarak bunu kısaltmaya çalıştım, ancak tek faktörleri 5 ve bir altı basamaklı sayı (147503), ve bunu 6 bayttan daha az yapmanın bir yolunu bulamadım.)

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

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

Bu kesin olarak kesin 0:00:00:00ve sonra kopar / çıkar. İle koş -r.

0 yazdırmak zorunda kalmazsam -2 bayt.


1

RPL, 83 78 bayt

HP48'inizin veya benzerlerinin, doğru (İngiltere) saat ve tarih, mm / gün tarih formatı ve 24 saat biçiminde olduğunu varsayalım:

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

Etraftaki boşlukları kaldırarak 2 byte tasarruf edebilmeme şaşırdım ":". 1.1, en kısa geçerli tarihtir ve daha sonra terkedilir SUB. Emülatörlere dikkat edin, zaman duvar saatinizden daha hızlı veya daha yavaş (veya hiç) çalışabilir. Gerçek bir HP ile, ON tuşuna basarak bu programı durdurabilirsiniz… veya boş piller için bekleyiniz.


0

PHP, 102 95 90 bayt

@TheLethalCoder & faktoring yapmama sayesinde 7 bayt kaydedildi

Birleştirerek başka 5 bayt kurtardı

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

Bu benim ilk golf'üm, bu yüzden muhtemelen birkaç püf noktasını özlüyorum, ama burada ne olursa olsun.

@Chocochaos'un PHP'ye cevap vermesi halinde, bunun birincisi olur, yorumlarımda açıkladığım nedenlerden dolayı kusurlu olduğuna inanıyorum, ancak burada yeni olduğum için yanlış olabilirim. Ya da ben sadece acemi değilim :)


Bir kapanış etiketine ihtiyacınız olabilir mi? (Bundan emin değilim). Sadece bir $akez kullanırsınız, bu yüzden numarayı yerinde kullanın. Php ile fazla aşina değilim ama daha fazla gelişme olabileceği
anlaşılıyor

Ne demek istiyorsun flawed because of reasons stated in the comments? Cevaplarıyla ilgili yorumları kastediyorsanız, yorum yapan sadece sizsiniz.
caird coinheringaahing

@TheLethalCoder Kapatma etiketi gerekmez. Ve güzel olanı!
Sworrub Wehttam

1
Bir <?=açılış etiketi kullanarak ve ekoyu bırakarak, $bilk kullandığınız yere atayarak ~ 7 bayt kaydedebilirsiniz . Ek olarak, ^0yerine 3 bayt kaydedebilirsiniz floor. Bitsel ya da int a int a içeriyor, int int almanın en kısa yolu.
user59178

1
Cevabım gayet iyi çalışıyor :) Ayrıca, burada bazı gönderileri okumak isteyebilirsiniz: codegolf.meta.stackexchange.com/questions/tagged/php Ayrıca etiketleri açmaya gerek yoktur. Çözümünüzü komut satırından çalışacak şekilde yazmanızı öneririm, sonra yenilemek için başlıklarla uğraşmanıza gerek kalmayacaktı. Bu yenileme, çözümünüzün bir süre sonra bir kez "özlemesine" neden olur, çünkü isteğin kendisinde kaybedilen zamanı hesaba katmaz.
chocochaos

0

AWK , 78 bayt

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

Çevrimiçi deneyin!

Son zamanı önceden hesaplayabileceğimi fark etmeden önce çok daha uzun sürdü. Bazen oyuna biraz geç kalması ve başkalarından fikir alması gerekiyor.

Bilginize, TIO bağlantısı \rdüzgün çalışmıyor çünkü çok iyi çalışmıyor.


0

F #, 142 bayt

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

İrlanda'da sınırdan yarım kilometre ötede büyüdüm. "Fermanagh'a Hoşgeldiniz" işareti ve sizi değiştiren yol işaretleri dışında başka bir ülkeye girdiğinizi bilmeyeceksiniz. Okula giderken iki kez geçmek için kullanılır.


0

c, gcc 114 bayt

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

Hiçbir şey ihmal edildi, tam program. Program Ubuntu'da gcc'de derlenmektedir. Geri sayım 0 saniyeye ulaştığında silme ve durma nedeniyle yapılan sistem çağrısı nedeniyle geri sayım uzun bir baskı ifadesi göstermez.

UnGolfed

#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();
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.