Виявити подорож у часі


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. Мітки часу можуть бути в будь-якому форматі, що включає щонайменше чотиризначний рік, місяць, день, годину, хвилину та секунду, розділені нецифровими цифрами.

Обмеження:

  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
Чому він не працює з онлайн-перекладачем (за винятком того, що він не дає вам поспішати з часом)?
ugoren

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 символи коротший для друку. Spam stdout Great Scott!для норм, які не подорожують часом, оскільки це зробити простіше і дешевше, ніж створити умовний друк.


Чи очікує він часу на вхід? Це не те, про що питають (можливо, це невиразно). Також, здається, друкуйте порожні рядки, коли час веде себе добре.
ugoren

Я мав на увазі запитати ОС, а не користувача. Я уточню.
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
Подорож у зворотному напрямку визначається як переміщення назад на будь-яку суму, а не на один день. Також через багаторазові now()дзвінки він може пропустити подію подорожі.
ugoren

Спроба гольфу це: n = дата, o = n.now (); setInterval ("d = новий n, s = d +` $ {new n (o)} `; f = d.getFullYear (); if ( n.now () - o> 8.64e + 7) console.log (s + f + `? Ви маєте на увазі, що ми в майбутньому?`); якщо (o> n.now ()) console.log (s + ` Назад у старий добрий $ {f} .`); o = n.now () ", 100);
Стефнотч

Я думаю, ви можете пограти в першу частину o=(n=Date).now().
Conor O'Brien

+ 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

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

Unolfolf (і набагато легше для читання):

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і спробуйте використовувати +для конкатенації рядків замість інтерполяції.
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

Це сильно грає проти «Timestamps може бути в будь-якому форматі» правила ... який я взяв на себе сміливість використовувати формат «секунд , що пройшли з 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.- що не дозволяє секунди з епохи.
Мего

4
Добре , що не "виключає" будь-які формати
thenumbernine

@ugoren Дійсно, ця вимога повинна бути більш конкретна щодо вашого наміру
Mego

Я не повністю знайомий з Луа, тому я можу помилятися, але це виглядає як такі відбитки, Back in good ol YYYYале він повинен друкувати Back in good old YYYY. (Зверніть увагу на d у старому)
Pokechu22

ні гарно ловити, я намагався голити байти куди б міг :-p
тодібюрт

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
Ми опублікували обидва наші відповіді Луа майже в той самий час. Це має щось сказати про подорож у часі.
тодішвидкісний

Аха, дякую @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

Мені вдалося написати ще коротший, можливо, ви захочете ознайомитись з цим і, можливо, зробити ваше краще. Також я думаю, що це чудово!
Стефнотч

Наскільки великим було ваше рішення, я хочу побачити, чи зможу його перемогти? ;)
мерМонті

Прокрутіть униз або натисніть на посилання: codegolf.stackexchange.com/a/61544/33160 Крім того, ви досить близько перемогли його! : D
Стефнотч

2

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

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

Ця проблема вирішувана в простій старій свинці, але була б необгрунтовано тривалими, оскільки 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 байт, якщо потрібна юзабіліті

ПОПЕРЕДЖЕННЯ ЦЕ МОЖЕ збільшити CPU і 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()+": ");}

Розширено:

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

Математика, 295 байт

Програма щосекунди просить ОС отримати нові ТС.

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

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());
} 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.