Обнаружить путешествие во времени


51

Компьютеры сейчас повсюду - в автомобилях, поездах, скейтбордах, даже в ядерных реакторах. Возможность того, что ваше программное обеспечение будет работать на устройстве, путешествующем во времени, - это вопрос времени. Вы можете справиться с этим? Вы можете по крайней мере обнаружить это?

Твое задание:

  1. Напишите программу, которая зацикливается и продолжает запрашивать системное время, чтобы обнаружить путешествие во времени.
  2. Если время перемещается вперед на день или более между двумя последовательными запросами, это перемещение во времени вперед. В этом случае ваша программа должна напечатать:
    TS TS: YYYY? You mean we're in the future?
  3. Если время перемещается назад на любую величину между двумя последовательными запросами, это обратное путешествие во времени. В этом случае ваша программа должна напечатать:
    TS TS: Back in good old YYYY.
  4. TS TSявляются временными метками до и после путешествия во времени. YYYYгод назначения.
  5. Метки времени могут быть в любом формате, который включает в себя как минимум год, месяц, день, час, минуту и ​​секунду, состоящие из 4 цифр, разделенных не цифрами.

Ограничения:

  1. Вы должны поддержать даты в 19, 20 и 21 веках, по крайней мере.
  2. Вы должны использовать язык, который существовал до публикации этого задания.
  3. Вы должны оставлять свои ответы только после того, как этот вызов был опубликован.
  4. Вы должны использовать язык, существовавший до публикации вашего ответа.
  5. Вы можете редактировать свой ответ только после публикации.
  6. Ваша программа не должна печатать какие-либо выходные данные, кроме требуемого. Случайный "Великий Скотт!" разрешено.

Это код-гольф. Самый короткий ответ выигрывает.
Соответствующие ссылки на фильмы, вероятно, сделают ваш ответ слишком длинным, но, возможно, вы получите положительные отзывы.



4
Не могли бы вы поподробнее рассказать о # 5?
Mego

4
разделены нецифрами? бу. YYYYMMDDHHmmSS - мой любимый формат меток времени.
Спарр

3
@Aequitas откуда ты знаешь? может быть, системные часы на самом деле неизменны и «устанавливают» их на самом деле во времени
Rune FS

5
Ограничения 2,3,4,5 действительно жесткие, я не знаю, смогу ли я справиться с этим.
Surt

Ответы:


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

Это не работает с онлайн-переводчиком.

Пример вывода после настройки времени моего компьютера дважды:

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
Почему он не работает с онлайн-переводчиком (за исключением того, что он не позволяет вам тратить время)?
Угорен

1
Потому что это бесконечный цикл, и онлайн-интерпретатор показывает вывод только после завершения программы.
Деннис

1
Итак, как вы проверяете, что это работает?
Угорен

1
Использование интерпретатора Java .
Деннис

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формате, разделенном точкой с запятой. Переключился на Python 2 с 3, так как он на 2 буквы короче для печати. Спам вымогает Great Scott!для тех, кто не путешествует во времени, так как это проще и дешевле сделать, чем создать условную печать.


Ожидается ли время в качестве ввода? Это не то, что спрашивают (может быть, это неопределенно). Кроме того, кажется, печатать пустые строки, когда время ведет себя хорошо.
Угорен

Я имел в виду спрашивать ОС, а не пользователя. Я уточню.
Угорен

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
Путешествие в обратном направлении определяется как перемещение назад на любую сумму, а не на один день. Кроме того, из-за нескольких now()звонков он может пропустить событие путешествия.
Угорен

Попытка игры в гольф это: 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на два символа длиннее, чем 86400.
Флорри

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ой! Мне было интересно, почему это не сработало.
Флорри

5

Питон 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

Баш + 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

Изменить: исправлено, чтобы спросить у ОС время, а не человека.


2
Несколько рекомендаций: используйте loop{}вместо while 1...endи попробуйте использовать +для конкатенации строк вместо интерполяции.
Войкя

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

Это сильно противоречит правилу «Временные метки могут быть в любом формате» ... которое я позволил себе использовать в формате «секунд с 1 января 1970 года».


Если я оставлю свое дрянное толкование печати временных меток и приму структура 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.- это не позволяет секунды с эпохи.
Mego

4
хорошо, что он не «исключил» какие-либо форматы
thenumbernine

@ugoren Действительно, это требование должно быть более конкретным относительно вашего намерения
Mego

Я не полностью знаком с Луа, поэтому я могу ошибаться, но похоже, что это печатает, Back in good ol YYYYно он должен печатать Back in good old YYYY. (Обратите внимание на d в ​​старом)
Pokechu22

Нету хороший улов, я пытался бриться байт , где бы я мог :-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

Примечание: если вы откажетесь от необходимости полного номера года, вычтите шесть байтов. Причина в том, что lua (или windows или чей-то!)% C не выводит полный год. Из-за этого временные метки могут выглядеть странно!

Это также позволяет использовать метки времени, которые могут быть разделены любыми нецифровыми символами!

Спасибо, что сообщили мне о моей старой ссылке на 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 практически в одно и то же время. Это должно что-то сказать о путешествиях во времени.
тогдашний день

Ахах, спасибо @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!

Я мог бы избавиться от 10 байтов, удалив, sleepя думаю.

Кстати, некоторые удобные для 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.
Угорен

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на Node и Io Suport: (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

Мне удалось написать еще короче, вы можете взглянуть на это и, возможно, сделать ваш лучше. Кроме того, я думаю, что это здорово!
Стефнотч

Насколько велико было ваше решение, я хочу посмотреть, смогу ли я победить его? ;)
MayorMonty

Прокрутите вниз или нажмите на ссылку: codegolf.stackexchange.com/a/61544/33160 Кроме того, вы очень близки к победе! : 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

Это во многом связано с ответом Моргана Треппа. Основной трюк здесь - это нормализация timedelta, которая удобно делает timedelta.days отрицательным при движении даже немного в сторону прошлого, и 0 при перемещении менее чем на день в будущее.


После import*того, как вам не нужен datetime.префикс.
Угорен

@ugoren: import*позволяет писать datetime.now()вместо datetime.datetime.now(). Это имеет смысл, в некотором смысле ...
хан

Это сбивает с толку.
Угорен

1

Cache 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

Эта проблема разрешима в простой старой свинке, но была бы необоснованно длительными, поскольку ANSI MUMPS не хватает на $ZD[ATE]T[IME]внутреннюю функции для форматирования даты в человек считываемых метки времени.

Эта программа будет , вероятно , не обнаружить путешествие во времени , чтобы до 1 января 1841 года , ни времени поездки после 31 декабря 9999, так как эти границы в $H[OROLOG]хронометраж собственной потенциирующей . Эта программа также имеет только точность второго уровня; обратные временные сбои на уровне ниже второго, скорее всего, останутся незамеченными.


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 миллисекунд. Сам цикл занимает итерацию меньше (в зависимости от вашего сервера). Ключевым моментом здесь является то, что отметка времени является плавающей точкой, а целочисленный тип подсчитывает, сколько дней прошло. Он работал нормально с 1 января 1753 года по 31 декабря 9999 года.


1

VBA, 258 байт

Работал с: Excel 2007 в Windows 7

305 байт, если требуется юзабилити

ПРЕДУПРЕЖДЕНИЕ Это МОЖЕТ увеличить ваш ЦП и Crash 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()+": ");}

Expanded:

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.

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[]? Это появляется только один раз в следующем коде.
Майкл Стерн

В какой-то момент я использовал его дважды. Хороший улов, хотя.
Потерянный в Знании

Удалите его, и вы сохраните три символа.
Майкл Стерн

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

Ява, 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());
} 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.