Pi Day, Pi Minute o Pi Second?


16

In questa sfida dovrai determinare se si tratta di Pi Day, Pi Minute o Pi Second.

Poiché Pi è irrazionale, vuole che il tuo codice sia il più breve possibile.

Esempi

Non viene fornito alcun input , il programma dovrebbe utilizzare l'ora di sistema. L'ho appena aggiunto per chiarezza

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>

Cos'è Pi Day / Minute / Second

  • Pi Day è quando il mese è marzo e la data è il 14
  • Pi Minute è quando l'ora è 3 e il minuto è 14
  • Pi Second è quando il minuto è 3 e il secondo è 14
  • Pi Daydovrebbe essere preferito invece di Pi Minuteo Pi Second, e Pi Minutedovrebbe essere preferito invece di Pi Second.
  • Per questa sfida è necessario utilizzare 12 ore (15:14 == 3:14). La data / ora utilizzata per determinare Pi Day/Minute/Seconddovrebbe essere basata sull'ora di sistema .

Punteggio e bonus

Bonus di -15 byte: se si stampa "No Pi Time"quando non è Pi time.


Come sempre, le scappatoie standard sono vietate. Questo è il più breve di in byte vince!


6
Non credo che Costco ti consenta di acquistare la costante matematica pi in qualsiasi momento dell'anno.
Alex A.

2
L'hai cambiato in una torta normale. Questo è anche falso perché puoi ottenere la torta da Costco tutto l'anno.
Alex A.

1
@AlexA. Hmm, strano che non riesco mai a trovarlo in estate ...
Downgoat

1
Perché pi è infinitamente lungo e vuoi essere passivo-aggressivo?
Arcturus,

8
Sono andato a Costco oggi - erano chiusi.
Trauma digitale

Risposte:


4

CJam, 41 byte

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

Provalo qui. In alternativa, utilizzare questo collegamento per bloccare il risultato etper un test più semplice.

Spiegazione

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.

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"

Grazie per -2 byte @ edc65


Potrebbe essere Date()invece dinew Date
edc65,

'Pi '+['Day','Minute','Second'].find((x,i)=>................
wizzwizz4,

@ wizzwizz4 questo non funzionerà. Se non è il momento Pi, ritorna"Pi undefined"
nderscore

Un controllo per indefinito sarebbe inferiore a 6 caratteri?
wizzwizz4,

1
@nderscore Ci sono meno byte da dire nderscorerispetto a underscore.
wizzwizz4,

5

Rubino, 125 124 caratteri

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]

Ahimè, il più intelligente %i[month day hour min sec].map{|x|Time.new.send x}è più lungo.

La chiave qui è l'uso di each_consper evitare la ripetizione (vedere le ultime righe della spiegazione di seguito).

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)

Potresti risparmiare qualche carattere tirandolo fuori 'Pi'come hai fatto tu t, no?
Cole Johnson,

@Cole E cosa farai con il secondo elemento?
nicael,

Perché Pi Hour non è niente. Cosa c'è che non va con le 2 del pomeriggio, domani?
Lister

@ColeJohnson No, [(p='Pi ')+Day','',p+'Minute',p+'Second']è più lungo.
Maniglia della porta

4

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

Provai

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]

golfed:

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'

4
from datetime import*;n=datetime.now()è più corto. Inoltre, non ha senso indicizzare un array quando si stampano stringhe costanti.
Maniglia della porta

@Doorknob 冰 È vero :)
Zizouz212,


Realizzato scambiando if / elses con [else, if] [istruzione].
Rɪᴋᴇʀ

1
Questi ultimi numeri sono errati (2:13 anziché 3:14) e il requisito dell'orologio a 12 ore non è soddisfatto. (Sembra applicarsi anche ad altre risposte) Puoi anche accorciarlo indicizzando il risultato di time.localtime(); scende a 148-15 byte (senza la correzione di 12 ore). La cosa di 12 ore è sfortunata però; senza di essa potresti facilmente ridurlo a 129-15 byte: 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')(e 118-15 byte su Python 3, convertendo in byte e usando find, il che rende le cose più semplici)
Aleksi Torhamo

4

Japt, 78-15 = 63 byte

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

Abbastanza semplice: controlla solo la data per ogni caso.

Spiegazione:

  • D=Ð)gottenere la data corrente ( Ð), memorizzarla nella variabile De ottenere il mese ( g). Perché archiviarlo nella variabile, se è già composto da una lettera? Perché da allora puoi vestire qualsiasi parte della data Da, dov'è ala funzione, tornare anno, mese, data, ecc. Ma altrimenti dovresti fare Ð a, vedi lo spazio.

  • ¥3è ==3, controllando se il mese è marzo.

  • ©è &&, cioè "e".
  • Df è il giorno del mese.
  • E è 14
  • ?...:... - insiemi tipici di operatori ternari
  • Dd %Cil promemoria di dividere l'ora ( Dd) per 12 ( C)
  • Dc sono i minuti
  • Db sono secondi

Provalo online!


Per emulare 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

Per emulare Pi Minute :

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

Per emulare 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

3

TI-BASIC, 124 byte

Grazie a FlagAsSpam per la rasatura di pochi byte.

"→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

Stai usando i(unità immaginaria) e e(costante di Eulero) come scorciatoie? In caso contrario, ciò potrebbe anche farti risparmiare qualche byte.
Addison Crump,

@FlagAsSpam Ho pensato di usarli, ma non ero sicuro che contasse.
Conor O'Brien,

@FlagAsSpam Indipendentemente dal fatto che siano validi qui, in erealtà sono due byte!
lirtosiast,

@ThomasKwa Oh, giusto.
Conor O'Brien,

@FlagAsSpam Non è più valido. ^ _ ^
Conor O'Brien,

3

Perl, 80-15 = 65 byte

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

Prendi 2, analizzando la rappresentazione in formato stringa di localtime. Al momento, sembra qualcosa del genere:

Sun Jan  3 15:14:15 2016

La posizione della stringa corrispondente viene utilizzata per determinare il Pi Time corretto.


Perl, 100 byte

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

localtimerestituisce i mesi zero indicizzati, quindi la necessità di 3-/3/.


2

Python 3, 137-15 = 122 byte

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'))

Il requisito di 12 ore è stato sfortunato, in quanto sarebbe stato 118-15 = 103 byte senza:

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'))

2

AppleScript, 202 190 187 183 181 byte

Ehi, non è poi così male.

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

In realtà ho trovato un uso per il metodo di chiamata di AppleScript. Vai a capire. No. È solo quello I'm an idiot. L'impostazione di una variabile è più breve.

(per chi si chiede, il comando di data corrente restituisce un tipo di data con i contenuti "Saturday, January 2, 2016 at 2:46:01 PM"o simili)


1

PHP, 85-15 = 70 byte

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

Il trucco principale usato qui è il Ymdhi_is formato della data , al momento della scrittura, date('Ymdhi_is')restituisce 201501030258_5828.

  • md, hieis sono i valori che saranno sostituiti da 0314se si tratta di Pi-qualcosa. Nota che tutte quelle stringhe saranno sempre sostituite da una stringa lunga di 4 caratteri.
  • Sono messi in quell'ordine specifico da allora strpos smetteranno di cercare alla prima occorrenza dell'ago, quindi li mettiamo nell'ordine di priorità.
  • Un separatore tra hied isè necessario perché non vogliamo strposabbinare un valore che si sovrapponga ad entrambi (grazie a primo per il salvataggio di byte qui).
  • L'ago è 0314perché314 corrisponderebbe erroneamente alle 10:31:42 come Pi-Second.

La parte Y è la più complicata. Abbiamo bisogno di un prefisso per compensare la prima occorrenza di Pi-qualcosa, permettendoci di distinguere strposi valori di ritorno trafalse (non trovato, Pi-niente) e 0(trovato nell'indice 0, Pi-day).

E vogliamo che questo prefisso sia lungo 4 o 5 caratteri, poiché stiamo pianificando di dividere strpos il valore restituito per 4.

Y è lungo 4 caratteri, ma:

  • un giorno avrà una lunghezza di 5 caratteri e questo interromperà il programma (pensate all'anno 10314): la documentazione di PHP dice che Ysarà sostituita da 4 cifre, ma non è vero .
  • se torni indietro nel tempo, al 314, interromperà il programma.

Poiché PHP non esisteva nell'anno 314 e probabilmente non esisterà più nell'anno 10314, suppongo che questi bug possano essere tranquillamente ignorati.

Nota che 0314può sovrapporsi Ymdpoiché:

  • Ymmd configurazione: non c'è il 31 ° mese.
  • YYmm configurazione: non c'è il 14 ° mese.
  • YYYm configurazione: ci sono meno di 40 mesi.

Inoltre, esiste una versione senza i bug relativi all'anno, che è 86-15 = 71 byte :

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

Bella risposta. Se si utilizzano i trattini bassi anziché i punti, è possibile rilasciare le virgolette Ymd_hi_is. Inoltre, non credo sia necessario un separatore tra mde hi, poiché le 12 ore hnon possono mai essere 14 e non iniziare mai con 3 o 4.
primo

0

Python 3, 179 byte

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(" "))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.