タイムトラベルの検出


51

車、電車、スケートボード、原子炉など、コンピューターは現在どこにでもあります。ソフトウェアがタイムトラベルデバイスで実行される可能性は時間の問題です。対処できますか?少なくとも検出できますか?

あなたのタスク:

  1. タイムトラベルを検出するために、ループしてシステム時間を照会し続けるプログラムを作成します。
  2. 2つの連続するクエリ間で時間が1日以上進む場合、それはタイムトラベルです。この場合、プログラムは次を印刷する必要があります。
    TS TS: YYYY? You mean we're in the future?
  3. 2つの連続するクエリ間で時間が少しでも戻った場合、それは逆方向のタイムトラベルです。この場合、プログラムは次を印刷する必要があります。
    TS TS: Back in good old YYYY.
  4. TS TSタイムトラベルの前後のタイムスタンプです。YYYY宛先年です。
  5. タイムスタンプは、非数字で区切られた少なくとも4桁の年、月、日、時間、分、秒を含む任意の形式にすることができます。

制限事項:

  1. 少なくとも19、20、21世紀の日付をサポートする必要があります。
  2. このチャレンジが投稿される前に存在していた言語を使用する必要があります。
  3. このチャレンジが投稿された後にのみ回答を投稿する必要があります。
  4. 回答が投稿される前に存在していた言語を使用する必要があります。
  5. 回答は、投稿した後にのみ編集できます。
  6. プログラムは、必要な出力以外の出力を印刷してはなりません。時々「グレートスコット!」許可されています。

これはコードゴルフです。最短の答えが勝ちです。
関連する映画の参照は、おそらくあなたの答えを長すぎますが、あなたに賛成を得るかもしれません。



4
#5についてもう少し詳しく教えてください。
メゴ

4
非数字で区切られていますか?ブー。YYYYMMDDHHmmSSは私のお気に入りのタイムスタンプ形式です。
スパー

3
@Aequitasどうやって知っていますか?多分、システムクロックは実際には不変であり、「設定」は実際には時間旅行です
ルーンFS

5
制限2、3、4、5は本当に厳しいものです。それを処理できるかどうかはわかりません。
スルト

回答:


4

CJam、118バイト

et:Tes{es_@-[TS*Set:TS*':S]\_864e5<{[1$et0="? You mean we're in the future?"N]o}|0<{[_"Back in good old "et0='.N]o}&}g

これはオンライン通訳では機能しません。

コンピューターの時間を2回調整した後のサンプル出力:

2015 10 21 11 2 45 1 3 -10800000 2015 10 23 11 2 45 0 5 -10800000: 2015? You mean we're in the future?
2015 10 23 11 2 53 448 5 -10800000 2015 10 21 11 2 52 0 3 -10800000: Back in good old 2015.

1
オンライン通訳では動作しないのはなぜですか(時間をいじることができないことを除いて)。
-ugoren

1
これは無限ループであり、オンラインインタープリターはプログラムの終了後にのみ出力を表示するためです。
デニス

1
それで、それがどのように機能するかをどのようにテストしますか?
-ugoren


9

Python 2、210バイト

from datetime import*
o=0
while 1:n=datetime.now();o=o or n;print"%s;%s: %s? You mean we're in the future?"%(o,n,n.year)if(n-o).days>=1else"%s;%s: Back in good old %s."%(n,o,n.year)if(n<o)else"Great Scott!";o=n

タイムスタンプはYYYY-MM-DD HH:MM:SS、セミコロンで区切られた形式で印刷されます。印刷が2文字短くなったため、3からPython 2に切り替えました。条件付き印刷を設定するよりも簡単で安価なため、スパムは標準的な非時間旅行者Great Scott!向けの標準出力です。


入力として時間を期待しますか?これは尋ねられたものではありません(多分あいまいです)。また、時間がうまく動作すると、空白行を印刷するようです。
ウゴレン

ユーザーではなく、OSに尋ねることを意味しました。明確にします。
-ugoren

8

JavaScript(ES6)、263バイト

n=Date;o=n.now();(function g(){k=new n;j=new n(o);s=`${k} ${o} `;if(n.now()-o>86400)console.log(`${s}${k.getFullYear()}? You mean we're in the future?`);if(o-n.now()>84600){console.log(`${s}Back in good old ${k.getFullYear()}.`);}o=n.now();setTimeout(g,100);}());

これはおそらく、より効率的/小さくするためにいくつかの書き換えを行うことができます。

ソース:

n=Date;
o=n.now();

(function go() {
   k=new n;
   j=new n(o);
   s=`${k} ${o} `;
   if (n.now() - o > 86400) {
      console.log(`${s}${k.getFullYear()}? You mean we're in the future?`);
   }
   if (o - n.now() > 84600) {
      console.log(`${s}Back in good old ${k.getFullYear()}.`);
   }
   o=n.now()
   setTimeout(go,100);
}());

1
後方への移動は、1日ではなく、任意の量だけ戻ることと定義されます。また、複数のnow()呼び出しのために、旅行イベントを見逃す可能性があります。
-ugoren

このゴルフの試み:n = Date、o = n.now(); setInterval( "d = new n、s = d +` $ {new n(o)} `; f = d.getFullYear(); if( n.now()-o> 8.64e + 7)console.log(s + f + `?私たちは未来にいるのですか?`); if(o> n.now())console.log(s + `古き良き$ {f} .`); o = n.now() "、100);に戻ります。
Stefnotch

最初の部分はゴルフできると思いますo=(n=Date).now()
コナーオブライエン

+ Stefnotch 8.64e+7は、より2文字長いです86400
フローリー

1
@CᴏɴᴏʀO'Bʀɪᴇɴおっと!なぜ機能しなかったのかと思っていました。
フローリー

5

Python 3、195

from datetime import*
n=datetime.now
p=n()
while 1:
 c=n();f=(p,c,p.year);s=(0,("%s %s: %s? You mean we're in the future?"%f,"%s %s: Back in good old %s."%f)[p.day>c.day])[p>c];p=c
 if s:print(s)

現時点では、グレートスコットを印刷しません。これは、たまにしか作成できない良い方法が見つからないためです。


5

Bash + coreutils、177

d()(date -d@"$@")
for((b=`date +%s`;a=`date +%s`;b=a)){
t=`d $a`\ `d $b`
((a<b))&&d $b "+$t: Back in good old %Y."
((a>b+86400))&&d $b "+$t: %Y? You mean we're in the future?"
}

3

ルビー、194バイト

私はまだこれを実際にサイズに削減する時間がありませんでした。いくつかの最適化が隠れていると確信しています。

require 'time';t=nil;while 1;n=Time.now;if t;s="#{t} #{n}: ";y=n.year;puts t>n ? "#{s}Back in good old #{y}" : (n>t+86400 ? "#{s}#{y}? You mean we're in the future?": "Great Scott!");end;t=n;end

Ungolfed(およびはるかに読みやすい):

require 'time'
t=nil
while 1
  n=Time.now
  if t                                             # on second or later pass
    s="#{t} #{n}: "                                # prepare the timestamp
    y=n.year
    puts t>n ?                                     # if we go back
      "#{s}Back in good old #{y}" :                # timestamp + phrase
      (n>t+86400 ?                                 # else, more than one day forward
        "#{s}#{y}? You mean we're in the future?": # timestamp + future
        "Great Scott!")                            # Great Scott!
  end
  t=n                                              # set a new jump point
end

編集:OSに人間ではなく時間を要求するように修正。


2
いくつかの推奨事項:のloop{}代わりにwhile 1...end使用+し、補間の代わりに文字列の連結に使用してみてください。
voikya

3

Lua 5.3、174バイト

T=os.time P=print l=T()::a::t=T()b=l.." "..t..": "y=os.date('%Y',t)_=t<l and
P(b.."Back in good old "..y)or t>l+86399 and
P(b..y.."? You mean we're in the future?")l=t goto a

これは、「タイムスタンプは任意の形式である可能性があります」という規則に大きく


反しています。 MeepDarknessMeepの構造、私は(誤って)これを絞ることができます...

155バイト

T=os.time::G::l=t or T()t=T()_=(t>l+86399or t<l)and
print(l.." "..t..": "..os.date(t<l
and"Back in good old %Y"or"%Y? You mean we're in the future?"))goto G

3
Timestamps may be in any format, that includes at least the 4-digit year, month, day, hour, minute and second, separated by non-digits.-エポックからの秒数は許可されません。
メゴ

4
良いことは、それがどんなフォーマットを「除外」しませんでした
thenumbernine

@ugoren本当にその要件はあなたの意図に関してより具体的であるべきです
Mego

私はluaに完全に精通していないので、間違っているかもしれませんが、この印刷のように見えますが、印刷さBack in good ol YYYYれるはずBack in good old YYYYです。(古いdに注意してください)
ポケチュウ

大漁いや、私はひげをそるにしようとしていたことは、私が:-P可能性がどこバイト
thenumbernine

2

LUA 5.3、179の 178 173 171 169 168 163バイト

q="%Y %c: "c=os.date::a::d=f f=os.time()_=d and(f-d>86399or f<d)and print(c(q,d)..c(q..(f<d and"Back in good old %Y."or"%Y? You mean we're in the future?")))goto a

サイドノート:通年の番号を必要としない場合は、6バイトを引きます。その理由は、lua(またはwindowsまたは誰かの!)%cが1年を出力しないからです。このため、タイムスタンプは奇妙に見えるかもしれません!

これは、数字以外の文字で区切ることができるタイムスタンプも利用します!

古いmath.absのリファレンスとその他の改善点を教えてくれてありがとう@thenumbernine :)

Lua 5.3、151バイト

これは、実際の日付の代わりにタイムスタンプを表示するだけで、@ thenumbernineの時間表示方法の「コピー」です。これはちょっとした不正行為だと思うので競争的ではありません。ここに投稿して私の作品を表示するだけです:)

::a::d=f f=os.time()_=d and(f-d>86399or f<d)and print(d.." "..f..os.date(f<d and": Back in good old %Y."or": %Y? You mean we're in the future?"))goto a

1
Luaの回答をほぼ同時に掲載しました。それはタイムトラベルについて何かを言わなければなりません。
番号9

ああ、@ thenumbernineありがとう!ついにコメントできるようになりました:)
MeepDarknessMeep

2

C:363バイト

この便利なスクリプトを使用し縮小:

#include<stdio.h>
#include<time.h>
void p(time_t*t){char b[64];strftime(b,64,"%FT%T",localtime(t));printf("%s ",b);}int main(void){time_t a,b,d=60*60*24;int y;time(&a);while(1){time(&b);y=localtime(&b)->tm_year+1900;if(b<a){p(&a);p(&b);printf("Back in good old %d\n",y);}else if(b>a+d){p(&a);p(&b);printf("%d? You mean we're in the future?\n",y);}a=b;sleep(1);}}

元の:

#include <stdio.h>
#include <time.h>

void p(time_t * t) {
  char b[64];
  strftime(b, 64, "%FT%T", localtime(t));
  printf("%s ", b);
}

int main(void) {
  time_t a, b, d = 60*60*24;
  int y;

  time(&a);
  while(1) {
    time(&b);
    y = localtime(&b)->tm_year+1900;
    if (b < a) {
      p(&a); p(&b); printf("Back in good old %d\n", y);

    } else if (b > a + d) {
      p(&a); p(&b); printf("%d? You mean we're in the future?\n", y);
    }
    a = b;
    sleep(1);
  }
}

実行例:

2015-10-23T23:30:03 1985-06-14T16:27:00 Back in good old 1985   
1985-06-14T16:27:07 1999-02-09T14:15:00 1999? You mean we're in the future?
1999-02-09T14:15:09 2015-02-09T14:15:00 2015? You mean we're in the future?
2015-02-09T14:15:36 2015-10-21T07:28:00 2015? You mean we're in the future?
2015-10-21T07:29:06 1985-10-26T09:00:00 Back in good old 1985
1985-10-26T09:00:28 2055-11-12T06:38:00 2055? You mean we're in the future?
2055-11-12T06:38:12 1919-10-07T00:09:57 Back in good old 1919
1919-10-07T00:09:57 2055-11-12T06:38:14 2055? You mean we're in the future?  # tried to go to 1955 - fail.
2055-11-12T06:39:09 2015-10-23T23:32:03 Back in good old 2015  # auto-time back to 2015 because my laptop didn't like the jump to 2055!

私がsleep推測するものを削除することで10バイトを取り除くことができました。

ちなみに、Mac / Linuxでの時間の浪費は次のとおりです。

sudo date 1026090085  # Sat 26 Oct 1985 09:00:00
sudo date 1021072815  # Wed 21 Oct 2015 07:28:00
sudo date 1112063855  # Intended to be 1955 but is 2055. Don't use!

気軽にドロップしてくださいsleep
-ugoren

2

JavaScriptの(ES6)181の 174 170バイト

for(a=Date;c=b||a.now(),b=d();e=new a(b).getFullYear(),f=`${a(c)} ${a(b):`})b>c+864e5?(g=alert)`${f} ${e}? You mean we're in the future?`:c>b&&g`${f} Back in good old `+e

注:リアルタイムマシンではテストされていません。

このコードは、Firefox、Chrome、Edge、Node.js Harmony(またはそれに関するio.js)で実行されます。しかし、私が使用しalert、そのためには置き換えられなければならないであろうconsole.logためのノードイオセンターサポート:(187バイト)

for(a=Date,b=0;c=b||(d=a.now)(),b=d();e=new a(b).getFullYear(),f=`${a(c)} ${a(b):`})b>c+864e5?(g=console.log)`${f} ${e}? You mean we're in the future?`:c>b&&g`${f} Back in good old ${e}.`

説明:

// Using for like a while loop, defining relevant variables:
  for (a = Date, b = 0;
// Defing b and c: c becomes b, b becomes now. Also defining a shorthand for Date.now:                                
  c = b || a.now(),
  b = d();
// Defining Variables Relevant to this loop: e is the year according to b, f is the "TS TS:" string:                        
  e = new a(b).getFullYear(),
  f = `${a(c)} ${a(b):`
  )
// If b is greater than c plus a day (in milliseconds):
  b > c + 864e5 ?
  // Alert Time Forwand String: 
    (g = alert)
    `${f} ${e}? You mean we're in the future?`:
// else if c is greater than b:
  c > b &&
  // Alert Time Back String: 
    g `${f} Back in good old `+e

私はなんとか短いものを書くことができました。あなたはそれを見たいと思うかもしれません。また、素晴らしいと思います!
-Stefnotch

あなたのソリューションはどれくらいの大きさでしたか、私はそれを打ち負かすことができるかどうかを見たいですか?;)
MayorMonty

下にスクロールするか、リンクをクリックしてください。:D
Stefnotch

2

Python、170 165バイト

from datetime import*
n=datetime.now
c=n()
while 1:
 p=c;c=n()
 if(c-p).days:print p,"%s:"%c,["%s? You mean we're in the future?","Back in good old %s."][c<p]%c.year

これは、Morgan Thrappの答え​​に大きく依存しています。ここでの主なトリックはtimedelta正規化です。これは、過去に少しでも移動する場合はtimedelta.daysを負に、1日未満を未来に移動する場合は0にすると便利です。


プレフィックスimport*が不要になった後datetime.
-ugoren

@ugoren:の代わりimport*に書くことができます。この種類作る感覚の、道で...datetime.now()datetime.datetime.now()
ハン

紛らわしい方法で、そうします。
-ugoren

1

CachéObjectScript、199バイト

l s k=86400 f  s e=+$H,t=$P($H,",",2) s:'d d=e,s=t s z=$ZDT(h)_" "_$ZDT($H)_": ",y=h\365+1841 w:e>d !,z,y,"? You mean we're in the future?" w:(k*t+e)<(k*s+d) !,z,"Back in good old ",y s h=$H,d=e,s=t

この問題は単純な古いMUMPSで解決できますが、ANSI MUMPSには日付を人間が読めるタイムスタンプにフォーマットするため$ZD[ATE]T[IME]組み込み関数がないため、不当に長くなります。

このプログラムは、おそらく1841年1月1日までのタイムトラベルも、9999年12月31日以降のタイムトラベルも検出しません。これらはタイムキーピング組み込みの境界であるため$H[OROLOG]です。このプログラムには、第2レベルの精度しかありません。サブセカンドレベルの逆方向のタイムグリッチは、通知を逃れる可能性があります。


1

TSQL、355バイト

作業中は、SQL Serverの運用サーバーに派手でクールな言語は付きません=)

ゴルフバージョン

declare @a datetime=getdate(),@b datetime,@d float,@ char(99),@y char(4)while 0=0begin select @b=getdate(),@d=cast(@b as float)-cast(@a as float),@y=' '+DATEPART(y,@b),@=cast(@a as char(20))+' '+cast(@a as char(20))+': 'if @d>=1set @=@+@y+'? You mean we''re in the future?'if @d<0set @=@+'Back in good old '+@y+'.'print @ set @a=@b end

マイナーな変更を加えた読みやすいバージョン。

declare @t0 datetime = getdate(), @t1 datetime, @d float, @m varchar(99), @y char(4)

while 0=0
begin

    set @t1 = getdate()
    set @d = cast(@t1 as float) - cast(@t0 as float)
    set @y = ' ' + DATEPART(yy, @t1)
    set @m = cast(@t0 as varchar(30)) + ' ' + cast(@t0 as varchar(30)) + ': '

    if @d >= 1 set @m = @m + @y + '? You mean we''re in the future?'
    if @d < 0 set @m = @m +  'Back in good old ' + @y + '.'

    print @m

    set @t0 = @t1
end

SQLはファーストクラスのデータ型であるため、タイムスタンプに関してそれほど悪くはありません。

ゴルフのために、3ミリ秒の精度を持つタイプを使用しています。ループ自体は(サーバーに応じて)反復するのに必要な時間よりも少なくなります。ここで重要なのは、タイムスタンプが浮動小数点数であり、整数型が経過した日数をカウントするという内部的なことです。1753年1月1日から9999年12月31日までは正常に機能しません。


1

VBA、258バイト

実行:Windows 7のExcel 2007

ユーザビリティが必要な場合は305バイト

警告これは、シングルスレッドシングルコアコンピューターを使用している場合、CPUを最大化し、Excel / Windowsをクラッシュさせる可能性があります(1985年に発見される可能性が高い)

Sub q()
h=CDbl(Now())
While 1
t=CDbl(Now())
If t>h+1 Then Debug.Print (CDate(t) & " " & CDate(h) & ":" & Year(t) & "? You mean we're in the future?")
If t<h Then Debug.Print (CDate(t) & " " & CDate(h) & ": Back in good old " & Year(t) & ".")
h=t
Wend
End Sub

このコードを「テスト可能」にしたい場合は、Application.Wait (Now() + TimeValue("0:00:01"))後に追加しますh=t

出力

10/22/2015 3:04:45 PM 10/22/2015 3:04:43 PM:2015?You mean we're in the future?
10/22/2015 3:06:48 PM 10/22/2015 3:06:46 PM: Back in good old 2015.

以下は、私が使用したテストファイルです。私は、Windowsのセキュリティがときどきどれほど低いかに正直に驚いています。すべてのコンピューターで期待どおりに実行されない場合があります

自己責任で実行すると、重大な永続的な副作用が生じる可能性があります!!!!
Sub DOC() t = 31346.6868055556 Date = DateSerial(Year(t), Month(t), Day(t)) Time = TimeSerial(Hour(t), Minute(t), Second(t)) q End Sub


1

Javascriptを173 169 162バイト

Javascriptはかなり人気があります...

for(e=Date,n=e.now;o=n(a=alert);)d=new e,f=d.getFullYear(n(o>n(s=d+` ${e(o)}:`)&&a(s+`Back in good old ${f}.`))-o>864e5&&a(s+f+`? You mean we're in the future?`))

説明(コードの旧バージョン):

for(e=Date,n=e.now,a=alert,o=n();;o=n()) //Set up the variables and update o, the previous time

d=new e,s=d+` ${e(o)} `,f=d.getFullYear(), //d is the date, s is a string with the 2 timestamps, f is the year
n()-o>8.64e7&&a(s+f+`? You mean we're in the future?`), //Future check
o>n()&&a(s+`Back in good old ${f}.`) //Past check

0

処理、270バイト

int p;long x=System.currentTimeMillis();void draw(){int q=millis(),y=year();if(q<p){t(p);print("Back in good old "+y+".");}if(q>p+86400000){t(p);print(y+"? You mean we're in the future?");}p=q;}void t(int m){print(new java.util.Date(x+m)+" "+new java.util.Date()+": ");}

拡張:

int p;
long x=System.currentTimeMillis();
void draw() {
  int q=millis(), y=year();
  if (q<p) {
    t(p);
    print("Back in good old "+y+".");
  }
  if (q>p+86400000) {
    t(p);
    print(y+"? You mean we're in the future?");
  }
  p=q;
}
void t(int m) {
  print(new java.util.Date(x+m)+" "+new java.util.Date()+": ");
}

サンプル出力:

Wed Oct 21 13:21:59 EDT 2015 Mon Oct 19 13:21:59 EDT 2015: Back in good old 2015.
Mon Oct 19 13:22:08 EDT 2015 Wed Oct 21 13:22:08 EDT 2015: 2015? You mean we're in the future

0

ルビー、160の 157 155 154バイト

ここでゴルフすることがたくさんあります

a=Time.new;loop{b,s,y=Time.new,"#{a} #{b}: ",b.year;$><<(a>b ? s+"Back in good old #{y}.\n":b>a+86400 ? s+"#{y}? You mean we're in the future?\n":"");a=b}

0

Mathematica、295バイト

プログラムは、新しいTSを毎秒OSに要求します。

f:=LocalTime[]
p=Print;
y:=DateString[#,"Year"]&
s:=ToString[#]<>" "&
d:=QuantityMagnitude@DateDifference[a,b]
j=StringJoin;
While[True,
  a=b;
  b=f;
  Pause@1;
  Which[d>=0,
   p@(j@@{s@a,s@b,": ",y@b, 
       "? You mean we are in the future?"}),
   d<0,
   p@(j@@{s@a,s@b," Back in good old ",y@b,"."})]];

出力

手動で日付/時刻を入力してテストしました。

DateObject[{2015, 10, 23}, TimeObject[{18, 36, 17.9618}], TimeZone -> \
-4.] DateObject[{2015, 10, 25}, TimeObject[{18, 42, 0.264913}], \
TimeZone -> -4.] : 2015? You mean we are in the future?

DateObject[{2015, 10, 23}, TimeObject[{18, 43, 0.141572}], TimeZone -> -4.] DateObject[{2015, 10, 23}, TimeObject[{18, 42, 3.30681}], TimeZone -> -4.]  Back in good old 2015.

間違いなく、出力をより適切にフォーマットできます。前述の要件を満たします。


なぜショートカットするのLocalTime[]ですか?次のコードで1回だけ表示されます。
マイケルスターン

ある時点で、私はそれを2回使用していました。よくキャッチ。
失われた知識

削除して、3文字を保存します。
マイケルスターン

0

Groovy、244バイト

def s=9999,d={new Date()},y={it.year+1900},f={t,n->"$t $n: ${y(n)}? You mean we're in the future?"},p={t,n->"$t $n: Back in good old ${y(n)}."},t=d()
while(!sleep(s)){n=d()
c=n.time-t.time
println c<0?p(t,n):c>s*2?f(t,n):'Great Scott!'
t=n}

0

Java、378バイト。

function detect()
{
int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) 
                 / (1000 * 60 * 60 * 24) );
if(diffInDays>0) 
System.out.println(olderDate+" "+newerDate+": "+newerDate.getYear()+"? You mean we're in the future?");
else if(diffInDays<0) 
System.out.println(olderDate+" "+newerDate+": "+"Back in good old "+newerDate.getYear());
} 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.