Pi-Tag, Pi-Minute oder Pi-Sekunde?

16

Bei dieser Herausforderung müssen Sie feststellen, ob es sich um Pi-Tag, Pi-Minute oder Pi-Sekunde handelt.

Da Pi irrational ist, soll Ihr Code so kurz wie möglich sein.

Beispiele

Es wird keine Eingabe gemacht , Ihr Programm sollte die Systemzeit verwenden. Ich habe es nur zur Klarheit hinzugefügt

March 14, 2016 0:00:00
Pi Day
December 25, 2015 3:14:45
Pi Minute
December 29, 2015 0:03:14
Pi Second
January 1, 2016 0:00:00
<No Output>

Was ist Pi Tag / Minute / Sekunde?

  • Pi Day ist, wenn der Monat März ist und das Datum der 14. ist
  • Pi Minute ist, wenn die Stunde 3 und die Minute 14 ist
  • Pi Second ist, wenn die Minute 3 ist und die Sekunde 14 ist
  • Pi Daysollte anstelle von Pi Minuteoder bevorzugt werden Pi Second, und Pi Minutesollte anstelle von bevorzugt werden Pi Second.
  • Für diese Herausforderung sollten Sie 12 Stunden verwenden (15:14 == 3:14). Das Datum und die Uhrzeit für die Ermittlung der Uhrzeit Pi Day/Minute/Secondsollten auf der Systemzeit basieren .

Wertung & Bonus

-15 Byte Bonus: Wenn Sie drucken, "No Pi Time"wenn es keine Pi-Zeit ist.


Standardlücken sind wie immer verboten. Dies ist kürzester Code in Bytes gewinnt!

Downgoat
quelle
6
Ich glaube nicht, dass Costco es Ihnen erlaubt, die mathematische Konstante pi zu jeder Jahreszeit zu kaufen.
Alex A.
2
Sie haben es in normalen Kuchen geändert. Das ist auch falsch, weil Sie das ganze Jahr über Kuchen von Costco bekommen können.
Alex A.
1
@AlexA. Hmm, komisch, ich kann es im Sommer nie finden ...
Downgoat
1
Weil pi unendlich lang ist und du passiv-aggressiv sein willst?
Arcturus
8
Ich bin heute zu Costco gegangen - sie waren geschlossen.
Digital Trauma

Antworten:

4

CJam, 41 Bytes

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

Teste es hier. Alternativ können Sie diesen Link verwenden, um das Ergebnis etfür einfachere Tests zu speichern.

Erläuterung

et   e# Get the current datetime as an array with the following elements:
     e#   - Year
     e#   - Month
     e#   - Day
     e#   - Hour
     e#   - Minute
     e#   - Second
     e#   - Millisecond
     e#   - Weekday
     e#   - Tickrate or something.
[3E] e# Push the array [3 14].
#    e# Find the position of this subarray in the current datetime array. Let's see
     e# what results we can get:
     e#   - Year 3 is in the past and there is no 14th month, so we can't get 0.
     e#   - Pi day will give result 1.
     e#   - Day 3, hour 14 would give 2.
     e#   - Pi minute will give result 3.
     e#   - Pi second will give result 4.
     e#   - Second 3, millisecond 14 would give 5.
     e#   - Weekday and tickrate won't be 14, so we'll never get 6 or 7.
     e#   - If [3 14] isn't found at all we get -1.
"\Pi Day\\Pi Minute\Pi Second\"
     e# Push this string (with linefeeds instead of backslashes.
N/   e# Split into lines.
=    e# Select the corresponding element. The non-existent "pi hour" and "pi millisecond"
     e# would map to empty strings as well as the -1.
Martin Ender
quelle
8

Javascript (ES6), 114 112 - 15 = 97 Byte

x=>['Pi Day','Pi Minute','Pi Second'].find((x,i)=>[/ar 14/,/(03|15):14:/,/03:14/][i].test(Date()))||'No Pi Time'

Ungolfed:

x=>
['Pi Day', 'Pi Minute', 'Pi Second']  // array of outputs
.find(                                // find first element in the array
    (x, i)=>                          // which returns truthy for this function
    [/ar 14/, /(03|15):14:/, /03:14/] // array of regex patterns
    [i]                               // get corresponding regex based on index
    .test(Date())                     // test it against current date, date is automatically cast to string
) || 'No Pi Time'                     // if no result, then return "No Pi Time"

Danke für -2 Bytes @ edc65

nderscore
quelle
Könnte Date()stattnew Date
edc65
'Pi '+['Day','Minute','Second'].find((x,i)=>................
wizzwizz4
@ wizzwizz4 das geht nicht. Wenn es nicht Pi-Zeit ist, wird"Pi undefined"
nderscore zurückgegeben
Wäre ein Check für undefined kürzer als 6 Zeichen?
wizzwizz4
1
@nderscore Es sind weniger Bytes zu sagen nderscoreals underscore.
wizzwizz4
5

Ruby, 125 124 Zeichen

i=[*[(t=Time.new).month,t.day,t.hour,t.min,t.sec].each_cons(2)].index [3,14];i&&$><<['Pi Day','','Pi Minute','Pi Second'][i]

Ach, desto klüger %i[month day hour min sec].map{|x|Time.new.send x} länger.

Der Schlüssel hier ist die Verwendung von each_cons, um Wiederholungen zu vermeiden (siehe die letzten Zeilen der folgenden Erklärung).

i=                          # send i (index) to...
[*                          # convert to array (splat)...
 [
  (t=Time.new).month,       # the current month...
  t.day,t.hour,t.min,t.sec  # etc... (duh)
 ]
 .each_cons(2)              # each consecutive two elements
]                           # [[month, day], [day, hour], [hour, min], etc]
.index [3,14];              # first occurrence of [3, 14]
i&&                         # shorthand for "if i"...
$><<                        # output...
[
 'Pi Day',                  # [month=3, day=14] is Pi Day
 '',                        # [day=3, hour=14] isn't anything
 'Pi Minute',               # [hour=3, min=14] is Pi Minute
 'Pi Second'                # [min=3, sec=14] is Pi Second
][i]                        # index by index (obviously)
Türknauf
quelle
Sie könnten ein paar Zeichen sparen, wenn 'Pi'Sie wie bisher herausziehen t, nein?
Cole Johnson
@Cole Und was machst du mit dem zweiten Element?
Nicoleel
Warum ist Pi Hour nichts. Was ist los mit 2 Uhr nachmittags, morgen?
Mr Lister
@ColeJohnson Nein, [(p='Pi ')+Day','',p+'Minute',p+'Second']ist länger.
Türklinke
4

Python 2, 219 186 183 Bytes (198-15)

Ich habe es versucht

Ungolfed:

from datetime import datetime

now = datetime.now()
output = ['Pi Day', 'Pi Minute', 'Pi Second', 'No Pi Time']

if now.month == 3 and now.day == 14:
    print output[0]
elif now.hour == 2 and now.minute == 13:
    print output[1]
elif now.minute = 2 and now.second == 13:
    print output[2]
else:
    print output[3]

Golf gespielt:

from datetime import *
n=datetime.now()
a=n.minute
if n.month==3and n.day==14:print'Pi Day'
elif n.hour==2and a==13:print'Pi Minute'
elif a==2and n.second==13:print'Pi Second'
else:print'No Pi Time'
Zizouz212
quelle
4
from datetime import*;n=datetime.now()ist kürzer. Außerdem macht es keinen Sinn, in ein Array zu indizieren, wenn Sie konstante Zeichenfolgen drucken.
Türklinke
@Doorknob 冰 Das ist wahr :)
Zizouz212
Kürzere sogar: paste.ee/p/ebcSh
Rɪᴋᴇʀ
Hergestellt durch Tauschen von if / elses mit [else, if] [statement].
2.
1
Die letzteren Zahlen sind falsch (2:13 statt 3:14) und die 12-Stunden-Uhr-Bedingung ist nicht erfüllt. (Scheint auch auf einige andere Antworten zuzutreffen.) Sie können es auch kürzer machen, indem Sie das Ergebnis von time.localtime()indexieren. Es kommt auf 148-15 Bytes (ohne die 12-Stunden-Korrektur). Die 12-Stunden-Sache ist jedoch unglücklich; ohne könnte man es leicht auf 129-15 Bytes bringen: import time;x=3,14;T=time.localtime();print{1:'Pi Day',3:'Pi Minute',4:'Pi Second'}.get((zip(T,T[1:])+[x]).index(x),'No Pi Time')(und 118-15 Bytes auf Python 3, indem man in Bytes konvertiert und find verwendet, was die Sache einfacher macht)
Aleksi Torhamo
4

Japt, 78-15 = 63 Bytes

D=Ð)g ¥3©Df ¥E?"Pi Day":Dd %C¥3©Dc ¥E?`Pi M©e`:Dc ¥3©Db ¥E?`Pi SeÖ:No Pi Te

Ziemlich einfach - prüft nur das Datum für jeden Fall.

Erläuterung:

  • D=Ð)gHolen Sie sich das aktuelle Datum ( Ð), speichern Sie es in der Variablen Dund erhalten Sie den Monat ( g). Warum in der Variablen speichern, wenn es sich bereits um einen Buchstaben handelt? Denn seitdem können Sie jeden Teil des Datums mit Da, wo aist die Funktion, Rückkehr Jahr, Monat, Datum, etc. Aber sonst müssten Sie tunÐ a , um das Leerzeichen zu sehen.

  • ¥3 ist ==3 , wenn der Monat, die Überprüfung März.

  • © ist && , dh "und".
  • Df ist der Tag des Monats.
  • E ist 14
  • ?...:... - Typische Mengen von ternären Operatoren
  • Dd %Cdie Erinnerung daran, die Stunde ( Dd) durch 12 zu teilen (C ) zu
  • Dc ist die Minuten
  • Db sind Sekunden

Probieren Sie es online!


So emulieren Sie Pi Day:

D=Ð"3/14/11 11:11:11";
Dg ¥2©Df ¥E?"Pi Day":Dd %C¥3©Dc ¥E?`Pi M©e`:Dc ¥3©Db ¥E?`Pi SeÖ:No Pi Te

Pi Minute emulieren :

D=Ð"11/11/11 3:14:11";
Dg ¥2©Df ¥E?"Pi Day":Dd %C¥3©Dc ¥E?`Pi M©e`:Dc ¥3©Db ¥E?`Pi SeÖ:No Pi Te

So emulieren Sie Pi Second :

D=Ð"11/11/11 00:3:14";
Dg ¥2©Df ¥E?"Pi Day":Dd %C¥3©Dc ¥E?`Pi M©e`:Dc ¥3©Db ¥E?`Pi SeÖ:No Pi Te
nicael
quelle
3

TI-BASIC, 124 Bytes

Vielen Dank an FlagAsSpam für das Rasieren einiger Bytes.

"→Str1
getTime
If min({3,14}={Ans(2),Ans(3
"Pi Second→Str1
getTime
If Ans(2)=14 and max(Ans(1)={3,14
"Pi Minute→Str1
getDate
If min({3,14}={Ans(2),Ans(3)
"Pi Day→Str1
Str1
Conor O'Brien
quelle
Verwenden Sie i(imaginäre Einheit) und e(Eulers Konstante) als Abkürzungen? Wenn nicht, können Sie dadurch auch einige Bytes einsparen.
Addison Crump
@FlagAsSpam Ich habe darüber nachgedacht, diese zu verwenden, aber ich war mir nicht sicher, ob es zählt.
Conor O'Brien
@FlagAsSpam Ob sie hier gültig sind oder nicht, eist eigentlich zwei Bytes!
Lirtosiast
@ ThomasKwa Oh, richtig.
Conor O'Brien
@FlagAsSpam Es ist nicht länger ungültig. ^ _ ^
Conor O'Brien
3

Perl, 80-15 = 65 Bytes

print'No 'x localtime!~/(ar | 15:|03:)14/,'Pi ',(Time,Day,Minute,Second)["@-"/4]

Nehmen Sie 2 und analysieren Sie die Zeichenfolgendarstellung von localtime. Gegenwärtig sieht das ungefähr so ​​aus:

Sun Jan  3 15:14:15 2016

Die Position der übereinstimmenden Zeichenfolge wird verwendet, um die richtige Pi-Zeit zu bestimmen.


Perl, 100 Bytes

@t=localtime;$t[2]%=12;3-/3/^{@t[$_,$_+1]}->{14}||exit!print'Pi ',(Second,Minute,_,Day)[$_]for 3,1,0

localtimeGibt die mit Null indizierten Monate zurück, daher die Notwendigkeit für 3-/3/.

primo
quelle
2

Python 3, 137-15 = 122 Bytes

import time
T=list(time.localtime())
T[3]%=12
print({1:'Pi Day',3:'Pi Minute',4:'Pi Second'}.get(bytes(T[1:6]).find(b'\x03\x0e'),'No Pi Time'))

Die 12-Stunden-Anforderung war unglücklich, da dies ohne 118-15 = 103 Bytes gewesen wäre:

import time
print({1:'Pi Day',3:'Pi Minute',4:'Pi Second'}.get(bytes(time.localtime()[1:6]).find(b'\x03\x0e'),'No Pi Time'))
Aleksi Torhamo
quelle
2

AppleScript, 202 190 187 183 181 Bytes

Hey, das ist doch nicht so schlimm.

set n to current date
set b to n's time string
if n's date string contains"March 14"
log"Pi Day"
else if b contains"3:14:"
log"Pi Minute"
else if b contains"3:14"
log"Pi Second"
end

Ich habe tatsächlich eine Verwendung für den Methodenaufruf von AppleScript gefunden. Stelle dir das vor.Nee. Stellt sich nur heraus, dassI'm an idiot . Das Setzen einer Variablen ist kürzer.

(Für diejenigen, die sich fragen, gibt der Befehl current date einen Datumstyp mit dem Inhalt "Saturday, January 2, 2016 at 2:46:01 PM"oder dergleichen zurück.)

Addison Crump
quelle
1

PHP, 85-15 = 70 Bytes

<?=['No Pi Time','Pi Day','Pi Minute','Pi Second'][strpos(@date(Ymdhi_is),'0314')/4];

Der wichtigste Trick Einsatz ist hier das Ymdhi_is Datumsformat , die zum Zeitpunkt des Schreibens, date('Ymdhi_is')kehrt 201501030258_5828.

  • md, hiUnd issind die Werte , die durch ersetzt werden0314 wenn es Pi-etwas ist. Beachten Sie, dass alle diese Zeichenfolgen immer durch eine 4-stellige Zeichenfolge ersetzt werden.
  • Sie werden in dieser bestimmten Reihenfolge abgelegt, da strposdie Suche beim ersten Auftreten der Nadel beendet wird. Daher werden sie in der Prioritätsreihenfolge abgelegt.
  • Ein Trennzeichen zwischen hiundis ist erforderlich, da wir keinen strposWert angeben möchten, der beide überlappt (danke an primo für das Speichern von Bytes hier).
  • Die Nadel ist 0314 da314 fälschlicherweise mit 10:31:42 als Pi-Sekunde abgeglichen.

Der Y-Teil ist der schwierigste. Wir benötigen ein Präfix, um das erste Vorkommen von Pi-etwas auszugleichen und zu unterscheidenstrpos Rückgabewerte vonfalse (nicht gefunden, Pi-nichts) und 0(gefunden bei Index 0, Pi-Tag) zu unterscheiden.

Und wir möchten, dass dieses Präfix 4 oder 5 Zeichen lang ist, da wir eine Teilung planen strpos den Rückgabewert durch 4 .

Y ist 4 Zeichen lang, aber:

  • Es wird eines Tages 5 Zeichen lang sein und dies wird das Programm zerstören (denken Sie an das Jahr 10314): Die PHP-Dokumentation sagt, dass Ydies durch 4 Ziffern ersetzt wird, aber es ist nicht wahr .
  • Wenn Sie rechtzeitig im Jahr 314 zurückkehren, wird das Programm unterbrochen.

Da PHP im Jahr 314 nicht existierte und im Jahr 10314 wahrscheinlich nicht mehr existieren wird, kann man diese Bugs sicher ignorieren.

Beachten Sie, dass 0314sich Folgendes überschneiden kann Ymd:

  • Ymmd Konfiguration: Es gibt keinen 31. Monat.
  • YYmm Konfiguration: Es gibt keinen 14. Monat.
  • YYYm Konfiguration: Es gibt weniger als 40 Monate.

Es gibt auch eine Version ohne die auf das Jahr bezogenen Fehler, die 86 - 15 = 71 Bytes beträgt :

<?=['No Pi Time','Pi Day','Pi Minute','Pi Second'][strpos(@date(D_mdhi_is),'0314')/4];
Benoit Esnard
quelle
Gute Antwort. Wenn Sie anstelle von Punkten Unterstriche verwenden, können Sie die Anführungszeichen in Umlauf bringen Ymd_hi_is. Auch ich glaube nicht , ein Separator ist zwischen mdund hi, wie die 12-Stunden hnie 14 sein können, und nie mit 3 oder 4 beginnen
primo
0

Python 3, 179 Bytes

import functools as F,datetime as D
T,G=D.datetime.now(),getattr
F.reduce(lambda i,j:print("Pi "+i.title())if G(T,i)/G(T,j)==3/14else j,"month day hour minute second".split(" "))
Zach Gates
quelle