เมื่อ Brexit จะเกิดขึ้น?


27

Brexit เกิดขึ้นแล้ว และ Sky News ซึ่งเป็นอัจฉริยะพวกเขาได้ตัดสินใจที่จะสร้างการนับถอยหลังที่ด้านข้างของรถบัส

ป้อนคำอธิบายรูปภาพที่นี่

งานของคุณคือทำสิ่งที่คล้ายกัน สหราชอาณาจักรออกจากสหภาพยุโรปเมื่อวันที่ 31 มีนาคม 2019 และคุณต้องสร้างการนับถอยหลังแบบดิจิทัลสำหรับสิ่งนี้ที่เปลี่ยนแปลงทุกวินาที (โดยมีค่าเบี่ยงเบน 0.05 วินาทีที่อนุญาต)

อินพุต

โปรแกรมของคุณไม่ควรป้อนข้อมูลใด ๆ มันถูกแบน!

เอาท์พุต

มันควรเอาท์พุทเวลาจนกว่า Brexit ddd:hh:mm:ssในรูปแบบ ขึ้นบรรทัดใหม่นำหน้าและต่อท้ายได้ แต่การแสดงควรอยู่ในที่เดียวกันทุกครั้ง ควรดูราวกับว่ามันลดลงจริงในสถานที่ ตามที่ระบุโดย @AnthonyPham สิ่งนี้ไม่ได้หมายความว่าพิมพ์บรรทัดใหม่เพียงพอที่จะ "ล้าง" หน้าจอซึ่งหมายความว่าคุณต้องล้างหน้าจอจริง

ไม่อนุญาตให้ใช้เอาต์พุตเช่นนี้:

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

ไม่เป็นเช่นนี้

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

เพราะพวกมันมากกว่าหนึ่งบรรทัด

คุณไม่ต้องกังวลหลังจาก Brexit โปรแกรมของคุณใช้งานได้จนถึง 31/3/2019

กฎระเบียบ

  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • นี่คือรหัสเพื่อให้สั้นที่สุดในไบต์ชนะ
  • ข้อความแสดงข้อผิดพลาด (แม้ว่าฉันจะไม่สามารถคิดได้) จะไม่ได้รับอนุญาต
  • รหัสควรจะสามารถทำงานในเวลา 2 ปี (เมื่อสหราชอาณาจักรออกจาก EU) และควรแสดงเวลาจริงและไม่เริ่มต้นจาก 730 อีกครั้ง (ดูด้านล่าง)

กฎการนับถอยหลัง

การนับถอยหลังไม่ควรเขียนรหัสแบบยากและควรสามารถทำงานได้ตลอดเวลาก่อนที่ Brexit จะเสร็จสิ้นและยังให้ผลลัพธ์ที่ถูกต้อง เมื่อเริ่มวันใหม่ชั่วโมงควรเป็นไปตามรูปแบบด้านล่าง

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

ให้ฉันพูดอีกครั้งวันที่ Brexit เสร็จสิ้นเป็น 31/3/2562 เวลาเที่ยงคืนเพื่อความสะดวก (31: 3: 19 00:00:00 หรือ 31: 3: 2019 00:00:00 หรือรูปแบบอื่น ๆ ที่คุณต้องการ)

NB: ฉันคิดว่าฉันมีทุกอย่าง แต่ฉันไม่ได้โพสต์สิ่งนี้ใน Sandbox ไม่เช่นนั้นเวลาจะถูกปิด อย่าลังเลที่จะโพสต์คำแนะนำสำหรับการปรับปรุงเพราะมันไม่สมบูรณ์แบบ


ฉันสามารถใช้งานได้ทุกมิลลิวินาที แต่ยังคงให้การปรับปรุงทุกวินาที? นี่เป็นเพียงการทำให้รหัสของฉันสั้นลง
David Archibald

@DavidArchibald เพียง แต่บอกว่าจอแสดงผลต้องเปลี่ยนทุกวินาที เป็นเพียงคำตอบที่ส่วนใหญ่จะพบว่าการเรียกใช้ทุกวินาทีง่ายขึ้น
caird coinheringaahing

อ่า ฉันต้องใส่1000ถ้าฉันต้องการให้เปลี่ยนหนึ่งครั้ง ขอบคุณ
David Archibald

ต้องมีศูนย์นำหน้าหรือไม่
ขนปุย

1
เที่ยงคืนคือเขตเวลาใด: UCT หรือ GMT เราจำเป็นต้องคำนึงถึงเรื่องนี้หรือไม่?
ติตัส

คำตอบ:


12

JavaScript, 134 129 113 ไบต์

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

แก้ไข: บันทึก 2 ไบต์ขอบคุณ @Shaggy บันทึกแล้ว 11 ไบต์ด้วย @ l4m2


จัดการเพื่อเอาชนะคุณ @ Neil ... เพียงไม่กี่ไบต์
David Archibald

ทำไมไม่ใช้<a id=0>? หรืออะไรแบบนั้น
โซโลมอน Ucko

3
หรือแม้กระทั่งdocument.body.innerHTMLแทนo.innerHTML
cloudfeet

1
ฉันอยากให้มันเป็นแบบ monospace เพื่อให้แน่ใจว่าจอแสดงผลยังคงอยู่ในที่เดียวกัน แต่ฉันคิดว่าฉันสามารถบันทึกไบต์และใช้งาน<tt>ได้
Neil

3
คุณสามารถบันทึก 2 ไบต์โดยเรียกใช้รหัสทุกมิลลิวินาที (หรือ 2 หรือ 3 ... )
ขนปุย

11

PowerShell, 70 63 55 53 ไบต์

ไม่รวมเครื่องหมายคำพูดคู่ง่าย -2 ด้วย@Joey

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

การรันสิ่งนี้ด้วย sleep เพิ่ม 8 ไบต์ แต่อินพุตจะมองไม่เห็นส่วนใหญ่ถ้ามันรันโดยไม่มีพวกมัน version (63 bytes) ด้วย sleep:

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

for() คือวงวนไม่สิ้นสุดและภายในวงนั้น ..

cls เพื่อล้างหน้าจอ

รับ31/3/19เป็นDateTimeวัตถุและ-วันที่ปัจจุบันจากมันเพื่อให้เวลาที่เหลืออยู่จากนั้น.ToString()( |% T*) ที่มีรูปแบบที่ถูกต้อง

สิ่งนี้จะแสดงเวลาลบหลังจาก Brexit


รูปแบบนี้มีความอ่อนไหวต่อรูปแบบวันที่ท้องถิ่น แม้ว่ารูปแบบ dd / m / yy ในสหราชอาณาจักรจะเหมาะสม แต่ imo จะไม่ทำงานตามที่เป็นอยู่ในเครื่องของสหรัฐอเมริกา ฉันอยากรู้ว่าวิธีการT*ทำงาน ฉันไม่คุ้นเคยกับสิ่งนั้น
Joel Coehoorn

@JoelCoehoorn มันเป็นกลอุบายที่ดี%foreach หยิบTวัตถุ oString ขึ้นมาและจะยอมรับสตริงถัดไปเป็นอาร์กิวเมนต์ เกี่ยวกับรูปแบบวันที่และเวลาทำไมจึงไม่ทำงานบนเครื่องสหรัฐฯ ฉันคิดว่าสิ่งddอื่นนั้นมีความรู้สึกไวต่อวัฒนธรรม
colsw

กำลังพยายามหาเดือน # 31 บนเครื่องของฉัน 3/31/19ทำงานได้ดีถ้าผมเปลี่ยนไป จะใช้งาน2019-03-31ได้ทุกที่ แต่จะมีค่าใช้จ่ายไม่กี่ไบต์
Joel Coehoorn

@JoelCoehoorn ใช่มั้ย - ขอโทษที่ฉันนึกถึงผลลัพธ์อัปเดตเป็น31Mar19แทนที่จะ31/3/19หวังว่าจะแก้ไขได้หรือไม่
colsw

1
คุณสามารถทำเครื่องหมายคำพูดรอบสตริงรูปแบบได้เนื่องจากการแยกวิเคราะห์คำสั่งจะมีผล
Joey

7

Excel VBA, 91 84 82 ไบต์

บันทึก 7 ไบต์ด้วย JoeMalpass ซึ่งชี้ให้เห็นว่า Excel เห็นวันที่เป็นตัวเลข
บันทึก 2 ไบต์ขอบคุณ JoeMalpass

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

ผลลัพธ์คือเซลล์A1ในแผ่นงาน Excel ที่ใช้งานอยู่


-6 ไบต์โดยการแลกเปลี่ยนกับ("2019-3-31") (43555)เมื่อฉันลองเรียกใช้งานใน Excel แต่จะหยุดหลังจากนั้นประมาณ 5-6 วินาที ...
CactusCake

1
@ JoeMalpass ขอบคุณเป็นจุดที่ดี หลังจากนั้นสองสามวินาทีฉันก็ค้นหาด้วยเช่นกันเพราะมันเป็นวิธีการคำนวณที่เร็วกว่า 1 / วินาที อย่างไรก็ตามการเพิ่มความล่าช้านั้นเพิ่มไบต์และ OP ไม่ได้บอกว่ามันจะต้องสามารถนับถอยหลังอย่างต่อเนื่องนับจากนี้ไปจนถึง Brexit โดยไม่ต้องติดไฟอะไรเลย
Engineer Toast

เห็นได้ชัดว่าNowการทำงานโดยไม่ต้อง()เกินไป ...
CactusCake

6

Python 3.6, 146 ไบต์

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

5

C #, 173 172 156 150 127 ไบต์

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

บันทึกแล้ว 16 ไบต์ขอบคุณ @Bob บันทึกแล้ว 6 ไบต์ขอบคุณ @ Søren D. Ptæus

เวอร์ชันที่จัดรูปแบบ:

using System;

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

คุณสามารถทำ(TimeSpan)0อะไร บนโทรศัพท์ไม่สามารถทดสอบได้ในขณะนี้ คุณยังสามารถดร็อปค่าเคลียร์ได้เนื่องจากการขึ้นบรรทัดใหม่ดูแล: วางเคอร์เซอร์ไว้ที่จุดเริ่มต้นของบรรทัด
บ๊อบ

2
ความคิด: การพึ่งพา CR อาจล้มเหลวหากความยาวเปลี่ยนแปลง (น้อยกว่า 100 วัน) การแก้ไข: เพิ่มช่องว่างสองพิเศษในตอนท้าย
บ๊อบ

@Bob ฉันลืมที่จะลบClear! โง่ฉัน และไม่สามารถเปลี่ยนintเป็นTimeSpanฉันได้ลองไปแล้ว
TheLethalCoder

คุณสามารถบันทึก 6 (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0ไบต์เขียน
Søren D. Ptæus

@ SørenD.Ptæusความคิดที่ดีไม่ได้นึกถึงเรื่องนั้น
TheLethalCoder

4

JavaScript ES5, 320 319 316 305 295 284 ไบต์

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

ขอบคุณ @Fels สำหรับการอ้างอิงMath@dgrcode สำหรับการอ้างอิงconsole

ยกเลิกแข็งแรงเล่นกอล์ฟ

setInterval(function() {

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

  var leadings = "00";

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

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

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

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

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

  // what's left is seconds

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

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

});


2
คุณสามารถบันทึกคณิตศาสตร์การเปลี่ยนชื่อของฉันได้นิดหน่อยg=Math;
Fels

ดูเหมือนว่านามแฝงMathยังสามารถบันทึก 2 ไบต์ใช่ไหม
มารี

varคุณสามารถบันทึกมากขึ้นอีกนิดด้วยการใช้ฟังก์ชั่นลูกศรและการกำจัด นอกจากนี้ยังเลือกชื่อที่สั้นสำหรับตัวแปรเช่นhแทนhoursหรือแทนm minutesอาจc=consoleจะช่วยประหยัดอีกสองไบต์ ก็1e3แทน1000
แดเนียลเรน่า

4

PHP, 84 ไบต์

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

ค่อนข้างตรงไปตรงมา 1553990400 เป็นเวลาประทับสำหรับ 31-3-2019 00:00:00 ใน UTC มันวนซ้ำโดยใช้ DateTime-> diff () -> format () เพื่อส่งออกว่าเหลือเวลาเท่าไร หลังจาก Brexit เกิดขึ้นจะเริ่มนับจาก 0

ความเห็น / รุ่นที่อ่านได้มากขึ้น:

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

ใหม่ที่นี่และกำลังจะโพสต์คำตอบของฉันเอง บางสิ่ง: 1. เราได้รับอนุญาตให้ละเว้น<?แท็กหรือไม่ 2. ฉันคิดว่าวงเล็บของคุณผิดตอนนี้คุณกำลังโทรหา->diffก้องมากกว่าวัตถุ DateTime 3. เสียงสะท้อนนั้นทำงานได้โดยไม่มีวงเล็บ 4. แม้หลังจากแก้ไขสิ่งนี้แล้วมันก็ไม่ได้ผลสำหรับฉัน แต่ฉันยังใหม่กับการเล่นกอล์ฟเพื่อที่ฉันจะได้เป็นคนงี่เง่า
Sworrub Wehttam

1
เพียงแค่เรียกใช้และดูว่ามันทำงานได้ดีตามความต้องการ ไม่จำเป็นต้องล้างออกเมื่อใช้งาน PHP จากบรรทัดคำสั่ง มี \ r ที่จุดเริ่มต้นของสตริงเพื่อเลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดมันจะเขียนทับเวลาเอาท์พุทก่อนหน้านี้ เป็นวิธีเดียวกับที่ใช้คำตอบอื่น ๆ ที่นี่
chocochaos

1
ขออภัยฉันพลาดความเห็นแรกของคุณ ใช่เราได้รับอนุญาตให้ละเว้นแท็กเปิดเว้นแต่จะมีข้อกำหนดในการจัดหาโปรแกรมเต็มรูปแบบ เครื่องหมายวงเล็บเป็นเพียงปรับในแบบที่พวกเขาเป็น ใช่เสียงสะท้อนทำงานได้โดยไม่มีมัน แต่การโทรต่างกับวัตถุ DateTime จะไม่ทำงานหากไม่มี มันทำงานได้ดีที่นี่คุณใช้ PHP เวอร์ชันใดและคุณใช้งานโปรแกรมอย่างไร :)
chocochaos

1
คุณอาจต้องการดูโพสต์บางส่วนได้ที่นี่: codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos

1
นั่นเป็นเพียงเกี่ยวกับผ้าห่มก็ขอบคุณสำหรับความเข้าใจ :)
Sworrub Wehttam

4

CJam, 69 62 59 57 ไบต์

บันทึก 7 ไบต์ด้วยการแปลงเป็นรูปแบบเวลาต่างกัน

บันทึกแล้ว 3 ไบต์ด้วยคำแนะนำของ Martin Ender

บันทึก 2 ไบต์โดยใช้ carriage return แทนที่จะเป็น backspaces

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

ไม่สามารถเรียกใช้บน TIO ด้วยเหตุผลที่ชัดเจน

มันเขียนใหม่การแสดงผลอย่างต่อเนื่องในวงวนไม่สิ้นสุดดังนั้นชนิดของข้อความกะพริบเข้าและออก (อย่างน้อยในคอนโซลของฉัน) แม้ว่ามันจะปรับปรุงเวลาจริงเพียงครั้งเดียวต่อวินาที

รุ่น 70- ไบต์นี้พิมพ์เพียงครั้งเดียวต่อวินาที:

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

คำอธิบาย

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

ไม่สามารถทดสอบในขณะนี้ แต่คุณอาจจะสามารถแทนที่Abด้วยsและบันทึกไบต์โดยทำครั้งแรกแล้วแบ่งในการสั่งซื้อตรงข้าม1e3/ 60md\60md\24md\]W%
Martin Ender

@MartinEnder ใช่พวกเขาทั้งคู่ทำงาน ขอบคุณ
Business Cat

โอ้และ{60md\}2*ช่วยอีกคน
Martin Ender


3

C # 6, 149 ไบต์

ขอบคุณBob ที่ช่วยประหยัด 57 ไบต์!

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:

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 ไบต์

ขอบคุณBob ที่ช่วยประหยัดอีก 47 ไบต์!

ขอบคุณMartin Smith ที่ช่วยประหยัด 4 ไบต์!

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:

using System;

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

1
new DateTime(2019,3,31)สั้นกว่า
Martin Smith

1
นอกจากนี้คุณยังสามารถลบConsole.Clearและเติมรายชื่อ"\r"ลงในสตริงได้เช่น"\r"+(x-a)...
Bob

1
การปรับปรุงเพิ่มเติม: (x-a).ToString(@"d\:hh\:mm\:ss")เทียบเท่ากับ `String.Format (" \ r {0: d \\: hh \\: mm \\: ss} ", xa)` เทียบเท่ากับ$@"{x-a:d\:hh\:mm\:ss}"(สตริงที่สั้นลงและสอดแทรกใน C # 6.0) ถ้าคุณทำอย่างนั้นแล้วคุณสามารถเพิ่มเติมร่นเต็มเข้า"\r"+$@"{x-a:d\:hh\:mm\:ss}" $"\r{x-a:d\\:hh\\:mm\\:ss}"
บ๊อบ

1
@TheLethalCoder ฉันทำเช่นนั้นเพราะไม่อนุญาตให้มีวิธีการขึ้นบรรทัดใหม่แบบ "ปลอม" การขึ้นบรรทัดใหม่จะเขียนทับสิ่งเดียวบนหน้าจอ อย่างน้อยอีกหนึ่งคำตอบก็ใช้วิธีนี้เช่นกัน นอกจากนี้ยังสามารถลบการนอนหลับได้เนื่องจากเป็นสิ่งสำคัญที่หน้าจอจะเปลี่ยนหนึ่งครั้งต่อวินาทีโดยอนุญาตให้อัปเดตที่ไม่เปลี่ยนแปลง (ดูความคิดเห็นของคำถาม) แก้ไข: จริง ๆ แล้วความคิดเห็นของคำถามยังอนุญาต CR อย่างชัดเจน ...
Bob

1
@Bob ขออภัยฉันอ่านคำแนะนำของคุณเป็นบรรทัดใหม่ความผิดพลาด แต่คุณสามารถลบการนอนหลับได้
TheLethalCoder

3

C, 104 ไบต์

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

ทำให้พังถล่ม

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

ขึ้นอยู่กับการtimeส่งคืนจำนวนวินาทีตั้งแต่ 01/01/1970 ซึ่งเป็นกรณีของฉัน (ใช้ Clang / GCC บน macOS) และควรเป็นกรณีสำหรับสิ่ง UNIX ส่วนใหญ่

ใช้ลำดับการยกเว้นเทอร์มินัลของbashเพื่อเลื่อนเคอร์เซอร์ไปรอบ ๆ ( <esc>[1Aเลื่อนเคอร์เซอร์ขึ้น 1 บรรทัด) มันจะดีกว่าที่จะสามารถใช้งานได้ง่าย\rแต่printfจะไม่ล้างจนกว่าจะเห็นบรรทัดใหม่และการล้างด้วยตนเองจะใช้เวลามากขึ้น

อาจนับถอยหลัง CPU มากที่สุดที่ฉันเคยเห็น ทำงานเป็นวนรอบร้อนแรงเพื่อให้แน่ใจว่าแม่นยำเสมอ หากวิ่งตามกำหนดเวลามันจะผลิตของแปลก ๆ ออกมา


@TobySpeight แน่นอนว่าถูกต้อง ฉันคิดว่าพวกเขาเป็นคนทุบตีเพราะฉันมักจะใช้หน้าอ้างอิงนี้: tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
เดฟ

มีกฎสำหรับรูปแบบหลักใน C หรือไม่? ใน C90: ละเว้นการส่งคืนจากสาเหตุหลัก UB ในกรณีที่ผู้เรียก (OS) จะใช้ค่าส่งคืน ในมาตรฐาน C: main(x)ไม่ใช่รูปแบบหลักที่ถูกต้อง int โดยนัยได้ถูกลบออกจากภาษา ผมเชื่อว่าน้อยที่สุด, int main(){}รุ่นปลอดภัย
Lundin

@Lundin ใน code golf ภาษาถูกกำหนดโดยการใช้งานของพวกเขา (เช่นถ้าคุณสามารถค้นหา compiler สาธารณะที่รวบรวมรหัสที่คุณต้องการคุณสามารถทำได้ แต่ถ้าต้องการการตั้งค่าธงที่ไม่เป็นมาตรฐาน bytecount) คุณถูกต้องที่นี่ไม่มีมาตรฐานใกล้เคียง (เช่นเดียวกับสิ่งที่คุณสังเกตเห็นมีฟังก์ชั่นที่กำหนดโดยปริยายเนื่องจากไม่มีการนำเข้าและการพึ่งพาเวลาที่ส่งคืนจำนวนวินาทีตั้งแต่ 01/01/1970) ดูเมตาสำหรับกฎ (ค่อนข้างแยกย้ายกัน) ที่ผู้คนติดตามรอบ ๆ ที่นี่
เดฟ

ส่วนหนึ่งของความสนุกของการแข่งขันกอล์ฟโค๊ดคือการค้นพบภาษาแปลก ๆ และคุณสมบัติที่ล้าสมัย!
เดฟ

3

AHK , 145 ไบต์

นี่ไม่ใช่คำตอบที่สั้นที่สุด แต่ผลลัพธ์ก็ให้ความรู้สึกที่ดีกับการลงโทษฉันคิดว่า ฉันพยายามส่ง keystrokes Ctrl+ Aตามด้วยDELแล้วก็ตามไม่ว่าเวลาจะเป็นเท่าไหร่แต่อัตราการรีเฟรชช้าเกินไปและมันจะทำลายสภาพแวดล้อมที่คุณอาศัยอยู่แทนจากนั้นฉันก็ไปกับ GUI มันกลับกลายเป็นว่าใช้เวลาน้อยกว่าไบต์ในการทำลายหน้าต่างและสร้างมันขึ้นมาใหม่เพื่อปรับปรุงการควบคุมซ้ำแล้วซ้ำอีกดังนั้นฉันจึงไปกับมัน มันเป็นผลที่ดี

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

ฉันจะร้องเพลงเพลงลงโทษ!


3

C #, 128 127 ไบต์

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

รหัสไม่ได้รับการตอบกลับ:

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

ฉันจะไม่หาเคล็ดลับโดยไม่ได้รับความช่วยเหลือจากคำตอบ C # อื่นที่นี่

สำหรับผู้ที่กำลังมองหาการปรับปรุงเพิ่มเติมคุณสามารถใส่นิพจน์ Write () ไว้ในลูป for ดูเหมือนว่าฉันควรจะสามารถบันทึกไบต์อย่างใดอย่างหนึ่งที่นี่เพราะที่ช่วยฉันกึ่งลำไส้ใหญ่สำหรับคำสั่งที่ แต่มันทำงานออกมาเป็นจำนวนเดียวกันเพราะคุณไม่ได้มีร่างกายที่ว่างเปล่าอย่างเต็มที่:

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

ยินดีต้อนรับสู่ PPCG!
Martin Ender

คุณยังสามารถบันทึกอักขระเดี่ยวได้โดยใช้สตริงการประมาณค่า);Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
Bob

เล่นได้ดีฉันพยายามหาวิธีที่จะมีการวนสักครู่ (จริง) ในรหัสที่สั้นที่สุด! ฉันจะจำเคล็ดลับนั้นได้ คุณอาจต้องเพิ่มช่องว่างสองสามอย่างเช่นที่ฉันทำกับการเขียนของคุณไม่เช่นนั้นเมื่อวันนั้นเปลี่ยนจาก 3 หลักเป็น 2 หลักมันจะไม่เขียนทับอักขระตัวสุดท้ายของสตริงเวลาของคุณและคุณจะได้ผลลัพธ์แปลก ๆ
NibblyPig

คุณสามารถบันทึกไบต์โดยใช้สตริงการแก้ไขเช่นเดียวกับในคำตอบของฉัน รูปแบบของdddแผ่นเสริมเป็นศูนย์ดูดีกว่าวิธีเว้นวรรคทั้งสอง
TheLethalCoder

อัพเดตสำหรับสตริงการแก้ไข
Joel Coehoorn

3

ทับทิม (83 ไบต์)

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

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

โดยพื้นฐานแล้วหนึ่งใน Python ที่ส่งมาพร้อมกับการปรับปรุงบางอย่าง เราเพิ่งปล่อย "\ r" เพื่อเริ่มต้นสตริงก่อนที่จะเรนเดอร์ใหม่ และสำหรับรูปแบบสตริงของ"%03d:%02d:%02d:%02d"เราไม่สนใจความกว้างของตัวระบุแรก ... ดังนั้นเราสามารถทำได้"%02d"*4และปล่อย backspace และช่องว่างเพื่อล้างลำไส้ใหญ่ที่ไม่จำเป็นออกไป

นอกจากนี้ฉันพบว่าตัวละครสองตัวที่สั้นกว่าprint: $><<. $>เป็นชวเลขทั่วโลก$defoutซึ่งเป็นกระแสออกสำหรับprintและและค่าเริ่มต้นprintf เขียนทางด้านขวาของมันไปยังสตรีม อักขระสองตัวนั้นสั้นอย่างไร ทีนี้ฉันสามารถเว้นช่องว่างที่นำหน้าเครื่องหมายวงเล็บที่ตัดสตริงรูปแบบได้STDOUTIO#<<

ณ จุดนี้ฉันคิดอย่างแท้จริงว่าไม่มีทางที่จะทำให้โปรแกรมนี้สั้นลงในรูบี

แก้ไข: ฉันผิด แต่แรกTime.new(2019,3,31)เราก็สามารถใช้เวลา UNIX 1553990400ดิบ:

แก้ไข 2: ฉันได้ลองเล่นด้วยการแยกตัวประกอบนาทีและแบ่งการประทับเวลา UNIX ด้วยค่าคงที่ แต่จริง ๆ แล้วมันไม่ได้ช่วยประหยัดไบต์ใด ๆ :(

แก้ไข 3: เปิดใช้งานการแคชh=3600จริง ๆ เจ็บฉันสองไบต์ อ๊ะ

แก้ไข 4: บันทึก 3 ไบต์ด้วย @EricDuminill เขาใช้ลอย แต่ปันส่วนทำงานโดยไม่สูญเสียความแม่นยำ!

แก้ไข 5: Array#*เป็นนามแฝงสำหรับArray#joinด้วย Ruby ?-syntax สำหรับอักขระแต่ละตัว!


การทำงานกับชั่วโมงแทนที่จะเป็นวินาทีดูเหมือนจะประหยัดได้ 3 ไบต์: loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}วินาทีอาจถูกปิดด้วย 1 เนื่องจากการปัดเศษ
Eric Duminil

ขอบคุณ! เชื่อมโยงกับ PHP ทันที :) ฉันใช้to_rแทนto_fเพื่อรักษาความแม่นยำ
Stephen Touset

ไม่เป็นไร นาฬิกานี้อาจยังคงเร็วกว่า 1 วินาทีถึงแม้ว่าจะใช้.to_rแทน.to_f
Eric Duminil

@StephenTouset คุณสามารถเลื่อน+"\r"ไปทางขวาของอาร์เรย์ สิ่งนี้ช่วยให้คุณสามารถใช้['%02d']*4*?:แทน'%02d:'*4+"\b "ดังนั้นคุณสามารถสูญเสียวงเล็บซึ่ง nets คุณหนึ่งไบต์ บันทึกยังไบต์อื่นโดยการเขียนแทน+?\r +"\r"
Synoli

การค้นพบที่ยอดเยี่ยม!
Stephen Touset


2

C #, 142 ไบต์

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

โปรแกรม 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;
    }
}

สิ่งนี้จะไม่หยุดการพิมพ์เมื่อพบกับ brexit ไม่แน่ใจว่าเป็นปัญหาหรือไม่
TheLethalCoder

@TheLethalCoder ถูกต้องตามกฎหมาย คำแนะนำระบุรหัสเฉพาะจะต้องทำงานจนถึง 31/3/2562 และสิ่งที่เกิดขึ้นหลังจากนั้นไม่สำคัญ หากคุณสามารถบันทึกไบต์ด้วยการส่งออกแปลกหรือแม้กระทั่งข้อยกเว้นหลังจากวันที่แล้วพลังมากขึ้นกับคุณ
Joel Coehoorn

นอกจากนี้: ฉันสงสัยว่ามันจะเป็นไปได้ที่จะได้รับแม้สั้นโดยการข้ามToString()ไบต์และสร้างการจัดรูปแบบในวิธีการเขียน () หรืออาจจะเป็นสายการแก้ไข
Joel Coehoorn

โอเค ... มันเป็นไปได้อย่างแน่นอน ฉันมีมันลงถึง 127 ไบต์ ฉันกำลังผนวกที่ด้านล่างต้นฉบับของคุณดังนั้นคุณยังคงได้รับเครดิตสำหรับgotoแนวคิดพื้นฐาน
Joel Coehoorn

การแก้ไขของฉันหายไป :( คิดว่าฉันจะต้องโพสต์คำตอบของตัวเอง
Joel Coehoorn

2

Bash + GNU date, 128 bytes

2 ไบต์ถูกโกนทิ้งขอบคุณ @muru และ 2 ก่อนหน้านี้ต้องขอบคุณ @ 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

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
ไม่เคยแข็งแรงเล่นกอล์ฟในทุบตีก่อน แต่คุณสามารถลบช่องว่างในขณะนี้: while[1]?
caird coinheringaahing

จุดยุติธรรมตอนนี้ได้ลองแล้ว แต่มันline 1: [1]: command not foundผิดพลาด ช่องว่างเป็นข้อบังคับดูเหมือน :-(
steve

2
กำหนดให้3600กับตัวแปรเพื่อบันทึก 2 ไบต์หรือไม่ คุณอาจสามารถเปลี่ยนB=3600;A=86400เป็นB=3600;A=24*Bไบต์อื่นได้หรือไม่
caird coinheringaahing

เสร็จแล้ว 3600 ตัวแปรขอบคุณ 24 * B คงA=$[24*B]ไม่เป็นไปได้ที่นั่นเลย
สตีฟ

1
C=:%02d;printf "%03d$C$C$C\r"การบันทึก byte? และย้ายการมอบหมายไปที่ A และ B ในบริบททางคณิตศาสตร์: D=$[B=3600,A=24*B,1553990400-`date +%s`]เพื่อบันทึกอีกหรือไม่
muru

2

MATL, 45 ไบต์

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

TIO เห็นได้ชัดว่าไม่สนับสนุนการล้างเอาต์พุต แต่ต้องขอบคุณMATL Online !

ที่ 2 ไบต์ขึ้นไปอีกรุ่นที่เป็นมิตรกับ CPU มากขึ้นที่จะpause(หลับ) ทุกวินาที:

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

ลองสิ่งนี้ทาง MATL Online

737515คือ "วันที่ 31 มีนาคม 2019" แสดงถึงรูปแบบยุคเริ่มต้นของ MATLAB - จำนวนวันตั้งแต่วันที่ 0 มกราคม 0000 หรือไม่ก็ได้รวมถึงส่วนที่เป็นเศษส่วนเพื่อแสดงช่วงเวลาของวัน (ฉันพยายามย่อให้สั้นลงโดยการคำนวณอย่างใด แต่ปัจจัยเพียงอย่างเดียวคือ 5 และอีกหกหลัก (147503) และฉันไม่สามารถหาวิธีที่จะทำได้ในเวลาน้อยกว่า 6 ไบต์)

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

1

PHP, 64 ไบต์

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

สิ่งนี้จะนับอย่างแม่นยำจนกระทั่ง0:00:00:00จากนั้นแตก / ออก -rทำงานด้วย

-2 ไบต์ถ้าฉันไม่ต้องพิมพ์ 0


1

RPL, 83 78 ไบต์

สมมติว่า HP48 ของคุณหรือที่คล้ายกันมีการตั้งค่าด้วยเวลาและวันที่ที่ถูกต้อง (สหราชอาณาจักร) รูปแบบวันที่ mm / dd และรูปแบบเวลา 24 ชั่วโมง:

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

ฉันรู้สึกประหลาดใจที่จะสามารถที่จะบันทึก 2 ":"ไบต์โดยการเอาพื้นที่รอบ ๆ 1.1 SUBเป็นวันที่ถูกต้องที่สั้นที่สุดหลังจากนั้นทิ้ง ระวังอีมูเลเตอร์เวลาอาจทำงานเร็วขึ้นหรือช้าลง (หรือไม่เลย) กว่านาฬิกาแขวนผนังของคุณ ด้วย HP ที่แท้จริงคุณสามารถหยุดโปรแกรมนี้ได้โดยกดปุ่มเปิด ... หรือรอแบตเตอรี่ที่ว่างเปล่า


0

PHP, 102 95 90 ไบต์

บันทึกแล้ว 7 ไบต์ด้วย @TheLethalCoder & โดยไม่แยกตัวประกอบ

บันทึกอีก 5 ไบต์ด้วยการเชื่อมต่อ

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

นี่เป็นสนามกอล์ฟครั้งแรกของฉันดังนั้นฉันอาจจะพลาดกลอุบายบางอย่าง แต่ที่นี่คุณไม่สนใจ

สำหรับ @chocochaos 'คำตอบ PHP ที่จะดีกว่านี้ผมเชื่อว่ามันมีข้อบกพร่องด้วยเหตุผลที่ฉันได้อธิบายไว้ในความคิดเห็นของฉัน แต่เป็นฉันใหม่ที่นี่ฉันอาจจะผิด หรือฉันเป็นแค่มือใหม่ :)


คุณอาจต้องปิดแท็ก? (ไม่แน่ใจในเรื่องนั้น) คุณใช้เพียง$aครั้งเดียวดังนั้นอาจใช้หมายเลขที่ถูกต้องเช่นกัน ฉันไม่คุ้นเคยกับ php มากเกินไป แต่ดูเหมือนว่าจะมีการปรับปรุงเพิ่มเติม
TheLethalCoder

คุณหมายถึงflawed because of reasons stated in the commentsอะไร หากคุณหมายถึงความคิดเห็นในคำตอบของพวกเขาคุณเป็นคนเดียวที่แสดงความคิดเห็น
caird coinheringaahing

@TheLethalCoder ไม่จำเป็นต้องปิดแท็ก และหนึ่งที่ดี!
Sworrub Wehttam

1
คุณสามารถบันทึก ~ 7 ไบต์โดยใช้<?=แท็กเปิดและปล่อยเสียงก้องกำหนด$bในสถานที่ที่คุณใช้งานครั้งแรก นอกจากนี้คุณยังสามารถบันทึก 3 ไบต์ใช้แทน^0 floorมันเหมาะสมและเกี่ยวข้องกับนักแสดงถึง int มันเป็นวิธีที่สั้นที่สุดในการส่งนักแสดงไปยัง int ที่ฉันเคยเห็น
user59178

1
คำตอบของฉันทำงานได้ดี :) นอกจากนี้คุณอาจต้องการอ่านโพสต์ที่นี่: codegolf.meta.stackexchange.com/questions/tagged/php ไม่จำเป็นต้องเปิดแท็กเช่นกัน ฉันอยากจะแนะนำให้เขียนวิธีการแก้ปัญหาของคุณในลักษณะที่มันจะเรียกใช้จากบรรทัดคำสั่งแล้วคุณจะไม่ต้องยุ่งกับส่วนหัวเพื่อรีเฟรช การรีเฟรชนั้นจะทำให้โซลูชันของคุณ "พลาด" หนึ่งครั้งเพราะมันไม่คำนึงถึงเวลาที่หายไปในคำขอ
chocochaos

0

AWK , 78 ไบต์

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

ลองออนไลน์!

นานกว่าก่อนที่ฉันจะรู้ว่าฉันสามารถคำนวณเวลาสิ้นสุดได้ บางครั้งมันก็สายไปนิดหน่อยกับเกมและรับแนวคิดจากคนอื่น

FYI ลิงก์ TIO ทำงานได้ไม่ดีนักเนื่องจากมันใช้งานไม่\rได้


0

F #, 142 ไบต์

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

ฉันเติบโตขึ้นในไอร์แลนด์ประมาณครึ่งกิโลเมตรจากชายแดน นอกเหนือจากป้าย "ยินดีต้อนรับสู่ Fermanagh" และเครื่องหมายบนท้องถนนที่เปลี่ยนไปคุณจะไม่รู้ว่าคุณเข้าประเทศอื่นแล้ว เคยข้ามมันสองครั้งระหว่างทางไปโรงเรียน


0

c, gcc 114 ไบต์

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

ไม่มีโปรแกรมใดถูกละไว้ โปรแกรมรวบรวมเป็น gcc บน Ubuntu การนับถอยหลังจะไม่แสดงคำสั่งการพิมพ์ที่ยาวเนื่องจากการเรียกของระบบเพื่อล้างและหยุดเมื่อการนับถอยหลังถึง 0 วินาที

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();
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.