Brexitはいつ発生しますか?


27

まあ、Brexit が起こった。そして、Sky Newsは天才であるため、バスの横にカウントダウンを作成することにしました。

ここに画像の説明を入力してください

あなたの仕事は似たようなことをすることです。英国は2019年3月31日にEUを離脱します。これには、毎秒変化するデジタルカウントダウンを作成する必要があります(0.05秒の偏差が許可されます)。

入力

あなたのプログラムはまったく入力を受け付けません。禁止されています!

出力

Brexitまでの時間をフォーマットで出力する必要がありますddd:hh:mm:ss。先頭と末尾の改行は許可されますが、表示は毎回同じ場所に留まる必要があります。実際には所定の位置で減少しているように見えるはずです。@AnthonyPhamが指摘したように、これは画面を「クリア」するのに十分な改行を印刷することを意味するものではなく、実際に画面をクリアする必要があることを意味します。

このような出力は許可されていません。

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

これも

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

彼らは複数の行にいるので。

Brexitの後に心配する必要はありません。あなたのプログラムは31/3/2019までしか動作しません

ルール

  • 標準的な抜け穴は許可されていません
  • これはので、バイト単位の最短コードが優先さます
  • エラーメッセージ(方法は思いつきませんが)は許可されません
  • コードは2年後(英国がEUを離れるとき)に実行でき、実際の時刻を表示する必要があり、730から再び開始することはできません(以下を参照)

カウントダウンルール

カウントダウンはハードコードされてはならず、Brexitが終了する前にいつでも実行でき、正しい結果を生成できるはずです。新しい日が始まると、時間は次の形式に従う必要があります

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

繰り返しますが、Brexitが終了する日付は、便宜上深夜31/31/2019です(31:3:19 00:00:00または31:3:2019 00:00:00またはその他の任意の形式)

NB:私はすべてを持っていると思いますが、私はこれをサンドボックスに投稿しませんでした。さもなければ、タイミングがずれていたかもしれません。完璧ではないため、改善のための提案を自由に投稿してください。


ミリ秒ごとに実行できますが、毎秒更新するように見せることはできますか?これは単にコードを短くするためです。
デビッドアーチボルド

@DavidArchibaldは、ディスプレイを毎秒変更する必要があるとだけ言っています。ほとんどの答えは、毎秒実行する方が簡単だということです。
ケアニアンコヒーリングアーイング

ああ。まあ1000、1秒に1回変更したい場合は、配置する必要があります。ありがとう
デビッドアーチボルド

先行ゼロは必要ですか?
シャギー

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)

編集:@Shaggyのおかげで2バイト保存されました。@ l4m2のおかげで11バイト節約されました。


@Neil ...を数バイト倒しました。
デビッドアーチボルド

なぜ使用しないの<a id=0>ですか?またはそのような何か?
ソロモンウッコ

3
またはdocument.body.innerHTML代わりにo.innerHTML
cloudfeet

1
ディスプレイが同じ場所にとどまるようにするために、モノスペースにしたかったのですが、バイトを保存してを使用できると思います<tt>
ニール

3
ミリ秒(または2、3 ...)ごとにコードを実行することで2バイトを節約できます。
シャギー

11

PowerShell、70 63 55 53バイト

二重引用符を除外、@ Joeyのおかげで簡単に-2

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

これをスリープ状態で実行すると8バイトが追加されますが、入力なしで実行すると、入力はほとんど見えなくなります。スリープ状態のバージョン(63バイト):

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

for() 無限ループであり、そのループ内で..

cls 画面をクリアするには、

オブジェクト31/3/19として取得し、そこから現在の日付を取得して、残りの時間を指定し、正しい形式で()DateTime-.ToString()|% T*

これは、brexitの後に負の時間を表示します。


これは、ローカルの日付形式にも依存します。英国のdd / m / yy形式が適切ですが、imo、米国のマシンではそのままでは実行されません。どのようにT*動作するのか興味があります。私はそれをよく知らない。
ジョエルCoehoorn

@JoelCoehoornこれは素晴らしいトリックです。foreachは%実際にToStringオブジェクトを取得し、次の文字列を引数として受け入れます。日時形式に関して、なぜ米国のマシンで実行されないのですか?ddなどは文化に依存しないと思いました。
-colsw

私のマシンで31か月目を見つけようとしています。に変更すると正常に動作し3/31/19ます。2019-03-31どこでも動作しますが、それには数バイトかかります。
ジョエルCoehoorn

@JoelCoehoornああ右-申し訳ありませんが、出力を考えていましたが、31Mar19代わりに更新され、31/3/19うまくいけば修正する必要がありますか?
-colsw

1
コマンド引数の解析が適用されるため、フォーマット文字列を囲む引用符を失う可能性があります。
ジョーイ

7

Excel VBA、91 84 82バイト

JoeMalpassがExcelが日付を数値として認識していることを指摘したおかげで、7バイト節約されました。
JoeMalpassのおかげで2バイト節約

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

出力はA1、アクティブなExcelシートのセルになります。


で交換("2019-3-31")することにより、-6バイト(43555)。ただし、Excelでこれを実行しようとすると、約5〜6秒後にフリーズします
...-CactusCake

1
@JoeMalpassありがとう、それは良い点です。私にとっても数秒後に調べます。なぜなら、それは1秒よりもずっと速く計算しているからです。ただし、遅延を追加するとバイトが追加されるため、OPは何も設定せずにBrexitまでカウントダウンし続ける必要があるとは言いません。
エンジニアトースト

どうやらNowなくて()も動作します
...-CactusCake

6

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

@Bobのおかげで16バイトを節約 @SørenD.Ptæusのおかげで6バイトを節約

フォーマット済みバージョン:

using System;

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

できますか(TimeSpan)0?電話では、今はテストできません。キャリッジリターンがそれを処理するので、まだクリアをドロップできます。カーソルを行の先頭に戻します。
ボブ

2
考え:長さが変化すると(100日未満)、CRに依存することに失敗する可能性があります。修正:最後に2つの余分なスペースを追加します。
ボブ

@Bobを削除するのを忘れたClear!愚かな私。そして、私はすでにそれを試してみたに変換intすることはできません TimeSpan
TheLethalCoder

6バイトの書き込みを節約できます(t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0
ソーレンD.プテウス

@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参照するために、@dgrcodeconsole

ゴルフをしていない

setInterval(function() {

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

  var leadings = "00";

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

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

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

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

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

  // what's left is seconds

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

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

});


2
あなたは私のように数学の名前を変更するビットを保存することができますg=Math;
フェルス

エイリアス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は、UTCの31-3-2019 00:00:00のタイムスタンプです。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オブジェクトではなくechoを呼び出しています。3.とにかく、エコーは括弧なしで機能します。4.これを修正した後でも、これは私にとってはうまくいきませんが、私はゴルフをするのが初めてなので、それはちょうど私がばかである可能性があります。
スウォラブウェッタム

1
それを実行して見るだけで、要件に従って正常に動作します。コマンドラインからPHPを実行するときにフラッシュする必要はありません。文字列の先頭にカーソルを行の先頭に移動するための\ rがあり、以前に出力された時間を上書きし続けます。他の多くの回答が使用しているのと同じ方法です。
chocochaos

1
申し訳ありませんが、最初のコメントを逃しました。はい、完全なプログラムを提供する必要がない限り、開始タグを省略することができます。括弧はそのままで問題ありません。はい、エコーはそれなしでも機能しますが、DateTimeオブジェクトでdiffを呼び出すことはエコーなしでは機能しません。ここで問題なく動作します。どのバージョンのPHPを使用しており、どのようにプログラムを実行していますか?:)
chocochaos

1
ここでいくつかの投稿をチェックアウトすることをお勧めします:codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos

1
洞察力に感謝します:)
Sworrub Wehttam

4

CJam、69 62 59 57バイト

時刻形式に異なる方法で変換することで7バイトを節約

Martin Enderの提案のおかげで3バイト節約

バックスペースの代わりにキャリッジリターンを使用して2バイトを節約

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

明らかな理由でTIOで実行できません。

実際には1秒に1回しか時間を更新しませんが、無限ループで絶えずディスプレイを書き換えて、テキストの種類が点滅します(少なくとも私のコンソールでは)。

この70バイトバージョンは、1秒間に1回しか印刷されません。

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

今はテストできませんが、おそらくに置き換えAbs1e3/最初に実行してから逆の順序で分割することでバイトを保存できます60md\60md\24md\]W%
マーティンエンダー

@MartinEnderうん、両方とも動作します。ありがとう
ビジネスキャット

ああ、{60md\}2*別のものを保存します。
マーティンエンダー

3

Python 3.5(118バイト)

import datetime as d,os
d=d.datetime
while 1:os.system("cls");e=str(d(2019,3,31)-d.today());print(e[:3]+':'+e[-15:-7])

3

C#6、149バイト

57バイトを節約してくれたBobに感謝します!

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

ゴルフされていないプログラム:

using System;

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

C位、210の 206 159バイト

さらに47バイトを節約してくれたBobに感謝します!

4バイトを節約してくれたMartin Smithに感謝します!

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

ゴルフされていないプログラム:

using System;

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

1
new DateTime(2019,3,31)短いです。
マーティンスミス

1
また、文字列を削除してConsole.Clear、代わり"\r"に文字列の先頭に追加することもできます。たとえば、"\r"+(x-a)...
ボブ

1
その他の改善:(x-a).ToString(@"d\:hh\:mm\:ss")`String.Format(" \ r {0:d \\:hh \\:mm \\:ss} "、xa)`と同等です$@"{x-a:d\:hh\:mm\:ss}"(C#6.0の短い、補間された文字列)。その場合は、さらに全体"\r"+$@"{x-a:d\:hh\:mm\:ss}"をに短縮できます$"\r{x-a:d\\:hh\\:mm\\:ss}"
ボブ

1
@TheLethalCoder私はそれを単に「偽の」マルチ改行アプローチを許可していないと考えました。キャリッジリターンは、画面上の唯一のものを上書きします。少なくとも1つの他の回答もこのアプローチを使用しています。また、表示 1秒に1回だけ変更されることが重要であるため、不変の更新が許可されているため、スリープを解除できます(質問のコメントを参照)。編集:実際には、質問コメントも明示的にCRを許可します
ボブ

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 1日以降の秒数を返すことにていますが、これは(macOSでClang / GCCを使用して)私の場合であり、ほとんどのUNIXの場合に当てはまります。

bashターミナルエスケープシーケンスを使用して、カーソルを移動します(<esc>[1Aカーソルを1行上に移動します)。単に使用できることがよりよいだろう\rが、printfそれは改行を見て、それを手動でフラッシュすることは、より多く取るまでフラッシュしません。

おそらく私が今まで見た中で最もCPU集約的なカウントダウンです。ホットループで実行して、常に可能な限り正確であることを確認します。締め切り後に実行すると、かなり奇妙なものが生成されます(どこでもマイナス!)


@TobySpeight確かに、修正されました。私は常に次のリファレンスページを使用しているため、それらをbashと考えています。tldp.org
Dave

Cのmainの形式にルールはありますか?C90:主からの戻り値を省略すると、呼び出し元(OS)が戻り値を使用する場合にUBが発生します。標準C:main(x)は有効な形式のmainではなく、暗黙のintは言語から削除されました。最小限の安全なバージョンはであると信じていint main(){}ます。
ランディン

コードゴルフの@Lundinでは、言語は実装によって定義されます(つまり、コードを必要に応じてコンパイルする公開コンパイラを見つけることができれば、それを行うことができますが、非標準のフラグ設定が必要な場合、それらのフラグはバイトカウント)。これは標準に近いものではないことは間違いありません(また、気づいたことと同様に、インポートがなく、1970年1月1日から数秒を返す時間に依存しているため、暗黙的に定義された関数があります)。ここで人々が従う(むしろ分散する)ルールのメタを見てください。
デイブ

コードゴルフチャレンジの楽しさの一部は、奇妙な言語のハッキングと時代遅れの機能を発見することです!
デイブ

3

AHK、145バイト

これは最短の答えではありませんが、結果は運命の非常に良い感じを与えると思います。私はもともと、キーストローク送信しようとしたCtrl+ Aが続いDELた時間だったが、リフレッシュレートが遅すぎたものは何でも当時とを、それはあなたがしていたものは何でも、環境を破壊してしまうであろう。その代わり、それから、私はGUIと一緒に行きました。ウィンドウを完全に破壊して再作成するために必要なバイト数が少なくて、コントロールを何度も更新するよりも多くなったので、私はそれを使いました。それは素晴らしい効果です。

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

私は運命の歌を歌うつもりです!


3

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#の回答からの助けがなければ、私は\ rトリックを理解できなかったでしょう。

さらなる改善を探している人のために、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へようこそ!
マーティンエンダー

補間された文字列を使用することで、1文字を保存できます;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
ボブ

よく遊んで、可能な限り短いコードでwhile(true)ループを持つ方法を見つけようとしました!そのトリックを覚えています。あなたは日が3桁から2桁になるとそうでない場合、それはあなたの時間文字列の最後の文字を上書きしません、あなたは奇妙な出力を得るでしょう、私はあなたの書き込みにかかわらず行ったように、スペースのカップルを追加する必要があるかもしれません
NibblyPig

私の答えのように、補間された文字列を使用してバイトを保存できます。あなたのフォーマットはdddゼロを埋め、2つのスペースの方法よりも良く見えます。
TheLethalCoder

補間された文字列用に更新されました。
ジョエルCoehoorn

3

ルビー(83バイト)

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

非ゴルフ

loop do
  seconds = 1553990400 - Time.now.to_r

  print (["%02d"] * 4).join(':') % [
    seconds / 24 / 60 / 60     ,
    seconds      / 60 / 60 % 24,
    seconds           / 60 % 60,
    seconds                % 60,
  ] + "\r"
end

基本的に、いくつかの改良を加えたPythonサブミッションの1つ。再レンダリングする前に、文字列の先頭に移動するために「\ r」を出力するだけです。の文字列形式では"%03d:%02d:%02d:%02d"、最初の指定子の幅を実際に気にしません...のように"%02d"*4、バックスペースと余分なコロンをクリアするためのスペースを出力します。

また、私は2つの文字の短いましたprint$><<$>はの省略形のグローバルで$defout、はの出力ストリームでprintありprintf、デフォルトはSTDOUTです。IO#<<その右側をストリームに書き込みます。その2文字はどのように短くなっていますか?さて、書式文字列を囲む括弧の前にあるスペースを省略できます。

この時点では、Rubyでこのプログラムをさらに短縮する方法はないと考えています。

編集:私は間違っていました。最初の代わりに、Time.new(2019,3,31)生のUNIX時間を使用できます1553990400

編集2:私は分を因数分解し、UNIXタイムスタンプをその定数で割って遊んでみましたが、実際にはバイトを節約しません。:(

編集3:キャッシングはh=3600実際に私を2バイト傷つけたことが判明しました。おっと。

編集4:@EricDuminillのおかげで3バイト保存されました。彼はフロートを使用しましたが、合理性は精度を損なうことなく機能します!

編集5:Array#*のエイリアスとしてArray#join?個々の文字にRubyの構文を使用!


秒ではなく時間を使用すると、3バイト節約できます。loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}ただし、丸めにより、秒が1ずれる場合があります。
エリックドゥミニル

ありがとう!現在はPHPと関連付けられています。:) 精度を維持するto_r代わりに使用しましたto_f
スティーブンTouset

どういたしまして。このクロックはまだ1秒早いかもしれませんが、.to_r代わりに.to_f
エリックドゥミニル

@StephenTouset +"\r"配列の右側に移動できます。これにより、['%02d']*4*?:代わりに使用'%02d:'*4+"\b "できるようになり、括弧を失う可能性があります。これにより、1バイトがネット化されます。の+?\r代わりに書き込むことで、さらに別のバイトを保存します+"\r"
Synoli

素晴らしい発見!
スティーブンTouset


2

C#、142バイト

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

ゴルフされていないプログラム:

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

これは、brexitに達しても印刷を停止しません。それが問題かどうかはわかりません
-TheLethalCoder

@TheLethalCoderそれは合法です。命令は、コードが31/3/2019まで動作する必要があることを明確に示しており、その後に何が起こるかは問題ではありません。その日以降に奇妙な出力や例外を追加することでバイトを節約できる場合は、さらに強力になります。
ジョエルCoehoorn

また、私はそれをスキップして、このさえも短絡を取得することが可能となります疑いToString()バイト、代わりに書き込みに書式設定()メソッド、または多分補間文字列を構築する
ジョエルCoehoorn

さて...それは間違いなく可能です。私は127バイトにそれを持っています。オリジナルの下に追加しているので、基本的なgotoアイデアに対する信用が得られます。
ジョエルCoehoorn

私の編集、外出先で拭い:(私は自分の答えを投稿する必要がありますね。
ジョエルCoehoornを

2

Bash + GNU日付、128バイト

@muruのおかげで2バイト削られ、@ This Guyのおかげで2バイト削られました。

C=:%02d;while sleep 1;do D=$[B=3600,A=24*B,1553990400-`date +%s`];printf "%03d$C$C$C\r" $[D/A] $[D%A/B] $[D%A%B/60] $[D%60];done

非ゴルフ

DAY=86400
HOUR=3600
while sleep 1 ; do
 DIFF=$[1553990400-`date +%s`]
 printf "%03d:%02d:%02d:%02d\r" \
         $[DIFF/DAY] \
         $[DIFF%DAY/HOUR] \
         $[DIFF%DAY%HOUR/60] \
         $[DIFF%60]
done

1
前にBashでゴルフしたことはありませんが、その間にスペースを削除できますwhile[1]か?
コヒーリングケアリング

公正な点、今では試してみましたが、line 1: [1]: command not foundエラーが生じます。スペースは必須のようです:
スティーブ

2
3600変数に割り当てて2バイトを節約しますか?別のバイトに変更B=3600;A=86400することもできB=3600;A=24*Bますか?
ケアニコインヘリング

3600変数が完了しました、thx。A=$[24*B]ただし、24 * Bでは必要ないので、
スティーブし

1
C=:%02d;printf "%03d$C$C$C\r"バイトを保存するには?そして、算術コンテキストでAとBへの割り当てを移動D=$[B=3600,A=24*B,1553990400-`date +%s`]します。別の割り当てを保存しますか?
ムル

2

MATL、45バイト

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

TIOは出力のクリアをサポートしていないようですが、ありがたいことにMATL Onlineはサポートしてます!

2バイト以上、pause1秒ごとに(スリープ)するCPUにやさしいバージョン:

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

MATL Onlineでこれを試してください

737515「2019年3月31日」は、MATLABのデフォルトのエポック形式-0000年1月0日からの日数を表し、オプションで時刻を表す小数部を含みます。(何らかの方法で計算してこれを短くしようとしましたが、その要因は5と6桁の数字(147503)だけであり、6バイト未満でそれを行う方法がわかりませんでした。)

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

1

PHP、64バイト

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

これは0:00:00:00、ブレーク/終了まで正確にカウントされます。で実行し-rます。

0を出力する必要がない場合は-2バイト。


1

RPL、83 78バイト

HP48などが正しい(英国)時刻と日付、mm / dd日付形式、および24時間形式でセットアップされていると仮定します。

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

スペースを取り除いて2バイト節約できたことに驚きました":"。1.1は最も短い有効な日付で、後にダンプされSUBます。エミュレーターには注意してください。時間は、壁時計よりも速くなったり遅くなったりする場合があります。本物のHPでは、ONキーを押すことでこのプログラムを停止するか、空のバッテリーを待つことができます。


0

PHP、102 95 90バイト

@TheLethalCoderのおかげで、ファクタリングを行わないことで7バイト節約

連結してさらに5バイトを保存しました

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

これは私の最初のゴルフですので、おそらくいくつかのトリックが欠けていますが、ここでは関係ありません。

@chocochaosのPHPの回答はこれに勝るものではありませんが、コメントで説明した理由により欠陥があると思いますが、ここで私は新しいので間違っているかもしれません。または私はただの初心者です:)


終了タグが必要な場合がありますか?(それについてはわかりません)。$a一度だけ使用するので、同じ番号を使用することもできます。より多くの改善点があるかもしれないように私はPHPとあまり慣れていないんだけどルックス
TheLethalCoder

どういう意味flawed because of reasons stated in the commentsですか?あなたが彼らの答えに対するコメントを意味するなら、あなたはコメントした唯一の人です。
コイナーリンガーアーイング

@TheLethalCoder終了タグは必要ありません。そして素敵なもの!
スウォラブウェッタム

1
<?=開始タグを使用してエコーをドロップし、$b最初に使用する場所に割り当てることで、最大7バイトを節約できます。さらに、の^0代わりに3バイトを保存できますfloor。それはビット単位であるか、intへのキャストを伴います。これは、私が見たintへの最短のキャスト方法です。
user59178

1
私の答えは問題なく動作します:)また、次のいくつかの投稿を読むこともできます:codegolf.meta.stackexchange.com/questions/tagged/php タグを開く必要もありません。ソリューションをコマンドラインから実行できるように作成することをお勧めします。そうすれば、更新するためにヘッダーをいじる必要はありません。また、その更新は、要求自体で失われた時間を考慮しないため、ソリューションが時々1秒を「ミス」する原因になります。
チョコカオス

0

AWK、78バイト

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

オンラインでお試しください!

終了時間を事前に計算できることに気付くまでに時間がかかりました。ゲームに少し遅れて、他の人からアイデアを得るのにお金がかかることもあります。

参考までに、TIOリンクは\r適切に実装されていないため、うまく機能しません。


0

F#、142バイト

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

私はアイルランドで国境から約0.5キロで育ちました。「ファーマナへようこそ」の標識と道路標識の変化は別として、あなたが他の国に入国したことを知りません。学校へ行く途中で二度渡るのに使用しました。


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

省略されていない、完全なプログラム。プログラムはUbuntuのgccでコンパイルされます。カウントダウンが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.