13
\$\begingroup\$

SE will be down/read only today 2017-05-04 at 00:00 UTC until 00:20 UTC.

Your challenge is to output a truthy value if SE is down/read only and a falsy value if SE is not. You may not have any input, and you must use date builtins to determine if SE is down/read only (no actually querying the SE api!) Example output:

12:34 UTC 03 May 2017 -> false

00:00 UTC 04 May 2017 -> true

00:20 UTC 20 May 2017 -> undefined, see below

That's undefined behavior, because it's too far after the window of time. To be clear, you can assume your program will be run from UTC 8:00 today (5/3/17) to UTC 1:00 tomorrow (5/4/17).

00:21 UTC 04 May 2017 -> false

00:20 UTC 04 May 2017 -> true

00:10 UTC 04 May 2017 -> true

Note that any truthy or falsy values are allowed, not just true and false. You must be accurate to the nearest second, and no changing the system clock! You may assume that your program is being run on a machine on the +0 UTC time zone.

\$\endgroup\$
  • 8
    \$\begingroup\$ sudo time <insert time here> && echo true \$\endgroup\$ – Okx May 3 '17 at 10:47
  • 8
    \$\begingroup\$ I'd suggest updating the test cases to use a universal date format rather than American. \$\endgroup\$ – Shaggy May 3 '17 at 11:08
  • 12
    \$\begingroup\$ Step #1, trigger bot army to DDoS SE, Step #2, return "1" \$\endgroup\$ – user2023861 May 3 '17 at 15:06
  • 9
    \$\begingroup\$ First, as the SO SRE Manager, I want to say that I love this question. Good work! However, I do want to remind people that the site won't be hard down... just in read-only mode. That said, I will be selecting on answer to this question to help me determine when to start the procedure. \$\endgroup\$ – TomOnTime May 3 '17 at 15:19
  • 3
    \$\begingroup\$ That would mean your own answer is invalid, no? So would many other answers; neither your original revision nor the current test cases mention seconds. \$\endgroup\$ – Dennis May 4 '17 at 14:07

18 Answers 18

15
\$\begingroup\$

05AB1E, 32 26 11 9 8 bytes

žažb«21‹

Explanation:

ža          Is the current hour &
  žb        current minute
     «      concatenated
        ‹   less than
      21    twenty one?

Try it online!

\$\endgroup\$
16
\$\begingroup\$

JavaScript (ES6), 26 24 23 22 21 bytes

Saved 3 bytes thanks to Shaggy and 1 byte thanks to Luke.

_=>new Date/12e5%72<1

Checks if time passed in current day is less than 1200000ms (1200s or 20min). Assumes downtime to be 20 minutes not 21, which appears to be the case in the linked post. 00:20UTC is the exclusive upper bound.

\$\endgroup\$
  • \$\begingroup\$ Save 2 bytes by using new Date instead of new Date(). \$\endgroup\$ – Shaggy May 3 '17 at 11:10
  • \$\begingroup\$ <2 to save another byte. \$\endgroup\$ – Shaggy May 3 '17 at 11:14
  • 1
    \$\begingroup\$ You don't need the +; / automatically converts new Date to a Number. \$\endgroup\$ – Luke May 3 '17 at 12:00
  • \$\begingroup\$ Is the function declaration (_=>) needed? JavaScript can run globally. \$\endgroup\$ – Brilliand May 3 '17 at 20:32
  • \$\begingroup\$ @Brilliand Yes, otherwise output would be needed, the shortest being alert which is a lot longer \$\endgroup\$ – ASCII-only May 3 '17 at 21:37
9
\$\begingroup\$

Python 2, 41 39 bytes

Saved 2 bytes thanks to Erik the Outgolfer

import time
print time.time()/1200%72<1

Try it online!

Uses the same algorithm as my JS and Charcoal answers.

\$\endgroup\$
  • \$\begingroup\$ Is /72<1 different from <72? \$\endgroup\$ – xnor May 3 '17 at 21:02
  • \$\begingroup\$ @xnor whoops sorry copied it wrong, fixed now \$\endgroup\$ – ASCII-only May 3 '17 at 21:36
  • \$\begingroup\$ No, I mean that I think print time.time()/1200<72 would be a shorter way to express the same thing. \$\endgroup\$ – xnor May 4 '17 at 0:52
  • \$\begingroup\$ @xnor I'm pretty sure that only works on the first day of the epoch though \$\endgroup\$ – ASCII-only May 4 '17 at 1:26
  • \$\begingroup\$ Oops, I meant %1200/72<1 -> %1200<72. Your TIO links to the %1200/72<1 version -- is that a mistake? \$\endgroup\$ – xnor May 4 '17 at 1:28
7
\$\begingroup\$

Jelly, 9 bytes

6ŒT|0Ḍ<21

Requires TZ to be set to UTC, which is the case for TIO.

Try it online!

How it works

6ŒT|0Ḍ<21  Main link. No arguments.

6ŒT        Get the current time as a string, in the format HH:MM.
   |0      Bitwise OR each character with 0. This casts the characters to int and
           maps the non-digit character : to 0.
     Ḍ     Undecimal; convert from base 10 to integer.
      <21  Compare the result with 21, so 00:00 to 00:20 return 1, all others
           return 0.
\$\endgroup\$
  • \$\begingroup\$ (Everyone was) Outgolfed by Dennis! Nice job! \$\endgroup\$ – programmer5000 May 3 '17 at 12:24
  • 1
    \$\begingroup\$ Not everyone... \$\endgroup\$ – Dennis May 3 '17 at 12:37
  • \$\begingroup\$ If the downtime latest 'til 00:21, I could save a byte... \$\endgroup\$ – Dennis May 3 '17 at 12:56
6
\$\begingroup\$

Japt, 32 11 bytes

K/12e5%72<1

Try it online!

\$\endgroup\$
4
\$\begingroup\$

zsh, 38 37 bytes:

date +%H\ %M|read h m;((h==0&&m<21))
\$\endgroup\$
4
\$\begingroup\$

bash, 40 bytes:

read h m< <(date +%H\ %M);((h==0&&m<21))
\$\endgroup\$
3
\$\begingroup\$

JS (ES6), 52 50 49 bytes

y=>(x=new Date).getUTCMinutes()<21&&!x.getUTCHours()

Why is Date so long? Just gets the minutes past 00:00 and returns true if they are < 21, and false otherwise.

\$\endgroup\$
  • \$\begingroup\$ Save 2 bytes by using new Date instead of new Date(). \$\endgroup\$ – Shaggy May 3 '17 at 10:56
  • 2
    \$\begingroup\$ -1 this doesn't check the date \$\endgroup\$ – ASCII-only May 3 '17 at 10:57
  • \$\begingroup\$ @ASCII-only the question says it dosen't have to. \$\endgroup\$ – programmer5000 May 3 '17 at 10:58
  • \$\begingroup\$ Save another byte with y=>(x=new Date).getUTCMinutes()<21&&!x.getUTCHours(). \$\endgroup\$ – Shaggy May 3 '17 at 10:58
  • 1
    \$\begingroup\$ Save another 6 bytes by using local time instead of UTC - the question says you may assume local time is UTC. \$\endgroup\$ – Brilliand May 3 '17 at 20:15
3
\$\begingroup\$

APL (Dyalog), 14 bytes

∧/1 20>2↑3↓⎕TS

∧/ is it all-true (AND reduction) that

1 20> these numbers are greater than

2↑ the first two elements of

3↓⎕TS the current Time Stamp with three elements dropped

\$\endgroup\$
  • \$\begingroup\$ What character is the ? \$\endgroup\$ – programmer5000 May 3 '17 at 11:24
  • \$\begingroup\$ @programmer5000 (Quad) is a prefix for system names in APL. It is supposed to be an empty rectangle. \$\endgroup\$ – Adám May 3 '17 at 11:26
3
\$\begingroup\$

Charcoal, 25 bytes

‹﹪÷UPtime.time⟦⟧¹²⁰⁰¦⁷²¦¹

Prints - for truthy, nothing for falsy.

Explanation

    UPtime.time⟦⟧          Python function time.time()
   ÷               ¹²⁰⁰      Divided by 1200
 ﹪                    ¦⁷²   Modulo 72
‹                         ¦¹ Less than 1

Try it online!

\$\endgroup\$
  • \$\begingroup\$ What does the ⟦⟧ do here? Do you need a list or arrowlist literal? \$\endgroup\$ – Erik the Outgolfer May 3 '17 at 11:59
  • \$\begingroup\$ Yeah, a list is required here, but now that I think about it I should make it optional \$\endgroup\$ – ASCII-only May 3 '17 at 11:59
  • \$\begingroup\$ Oh, so it's a list of arguments? Yeah, you should make it optional, calling the function without arguments by default. \$\endgroup\$ – Erik the Outgolfer May 3 '17 at 12:00
  • \$\begingroup\$ @EriktheOutgolfer Done \$\endgroup\$ – ASCII-only May 3 '17 at 21:36
3
\$\begingroup\$

Alice, 17 bytes

/o
\T@/4&;'-.C+n

Try it online!

Assumes to be run on a machine whose timezone is set to UTC (like the TIO server).

Explanation

While in Ordinal mode, the IP bounces diagonally up and down through the program. While in Cardinal mode, the IP wraps around the edges like most other Fungeoids.

/   Reflect to SE. Switch to Ordinal.
T   Push a string representing the current date and time, in the format:
    YYYY-MM-DDTHH:MM:SS.mmm±AA:BB
/   Reflect to E. Switch to Cardinal.
4&  Run the next command 4 times.
;   Discard four elements from the top of the stack. Since we're in Cardinal mode,
    this attempts to discard four integers. But the top stack value is a string so
    it gets implicitly converted to all the integers contained in the string. So
    year, month, day, hour, minute, seconds, milliseconds, timezone hour,
    timezone minute will be pushed separately. Then the last four of these
    will be discarded, so that we end up with the minute and the hour on
    top of the stack.
'  Push 21.
-   Subtract it from the minutes. Gives something negative for minutes 0 to 20.
.C  Compute the binomial coefficient n-choose-n. This gives 0 for negative
    results and 1 for non-negative ones. SE is down if both this value and
    the current hour are zero.
+   Add the two values. Iff they are both zero, we still get a zero.
n   Logical NOT of the value. Turns 0 into 1 and everything else into 0.
\   Reflect to NE. Switch to Ordinal.
o   Implicitly convert the result to a string and print it.
@   Terminate the program.
\$\endgroup\$
3
\$\begingroup\$

MATL, 10 bytes

Thanks to Dennis for several corrections

Z'1\480*7<

Try it online!

Explanation

Z'    % Push current date and time as a float. Integer part is day, decimal part is time
1\    % Modulo 1. This gives the time, in units of one day
480*  % Multiply by 480
7<    % Less than 7? Note that 21 minutes / one day equals 7 / 480. Implicitly display. 
\$\endgroup\$
  • \$\begingroup\$ Should that be l72 rather than 171 in your explanation? \$\endgroup\$ – Dennis May 3 '17 at 13:38
  • \$\begingroup\$ @Dennis Yes, thanks for catching that! \$\endgroup\$ – Luis Mendo May 3 '17 at 13:39
  • \$\begingroup\$ It's still 72 vs 71. Also wouldn't this return 0 at 00:20? \$\endgroup\$ – Dennis May 3 '17 at 13:42
  • \$\begingroup\$ @Dennis Yes, this would return 0 at 00:20, but would return 1 at 00:20 minus a small fraction of a second (given by the machine epsilon for double data type times 86400). The challenge says "you must be accurate to the nearest minute", so I understand it's acceptable \$\endgroup\$ – Luis Mendo May 3 '17 at 13:47
  • \$\begingroup\$ That's probably what the post on Mother Meta meant, but the challenge has 00:20 -> true as a test case. Left a comment on the question. \$\endgroup\$ – Dennis May 3 '17 at 13:50
3
\$\begingroup\$

Python 3 (NON-REPL) + time, 81 77 bytes

-4 bytes thanks to Bahrom

import time;e=str(time.strftime('%H:%M'));print(e[:2]=='00'and int(e[3:])<21)

A naïve approach, turning the current date to string and analysing its characters.

\$\endgroup\$
  • \$\begingroup\$ You can save a whole bunch of bytes by using a different format string, and if you're using the shell, you don't need the print function: import time;e=str(time.strftime('%H:%M'));e[:2]=='00'and int(e[2:])<21. This can probably be golfed even further too. \$\endgroup\$ – Bahrom May 3 '17 at 21:02
  • \$\begingroup\$ (pretty new to golfing and the rules) but in the shell this also seems to output the correct results: import time;time.localtime();_.tm_hour==0 and _.tm_min<21. We're not beating ASCII-only anyway lol \$\endgroup\$ – Bahrom May 3 '17 at 21:11
  • \$\begingroup\$ Ok, I cannot edit now, maybe later \$\endgroup\$ – Mr. Xcoder May 4 '17 at 4:44
2
\$\begingroup\$

Pyth, 11 bytes

&g20.d7!.d6

Online interpreter link

\$\endgroup\$
2
\$\begingroup\$

Bash, 55 53 51 50 bytes

-1 byte from @robbie0630's comment.

a=`date +%s`;echo $[1493856000<a&a<1493857200?1:0]

Try it online!

The advantage of this solution is that it works for any date (so will return 1 only for the period defined in the challenge, as it uses epoch time).

\$\endgroup\$
  • 2
    \$\begingroup\$ Shave off a byte by replacing $(...) with `...` \$\endgroup\$ – robbie May 4 '17 at 0:53
1
\$\begingroup\$

Swift + Foundation, 178 bytes

import Foundation;var d=String(describing:Date());func g(_ s:Int)->String{return String(d[d.index(d.startIndex,offsetBy:s)])};print(g(11)+g(12)=="00" ?Int(g(14)+g(15))!<21:false)

Quite short by swift standards. Check it out!

As in my Python answer, I basically converted the current Date to a string and have analysed its digits, depending on which I printed the bool.

\$\endgroup\$
1
\$\begingroup\$

R, 65 bytes

library(lubridate)
x=Sys.time()
print(all(!hour(x)&minute(x)<21))

Checks if the hour == 0 and the minute < 21.

\$\endgroup\$
1
\$\begingroup\$

PostgreSQL, 43 characters

select now()between'170503'and'170503 0:20'

Just because I prefer SQL for date/time calculations.

Sample run:

bash-4.3$ psql -c "select now()between'170503'and'170503 0:20'"
 ?column? 
----------
 f
(1 row)
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.