Pi Day, Pi Minute o Pi Second?

16

En este desafío, deberá determinar si es Pi Day, Pi Minute o Pi Second.

Como Pi es irracional, quiere que su código sea lo más breve posible.

Ejemplos

No se proporciona ninguna entrada , su programa debe usar la hora del sistema. Lo acabo de agregar para mayor claridad

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>

¿Qué es Pi Day / Minute / Second?

  • Pi Day es cuando el mes es marzo y la fecha es el 14
  • Pi Minute es cuando la hora es 3, y el minuto es 14
  • Pi Second es cuando el minuto es 3, y el segundo es 14
  • Pi Daydebería preferirse en lugar de Pi Minuteo Pi Second, y Pi Minutedebería preferirse en lugar de Pi Second.
  • Para este desafío, debe usar un tiempo de 12 horas (15:14 == 3:14). La fecha / hora utilizada para determinar el Pi Day/Minute/Seconddebe basarse en la hora del sistema .

Puntuación y bonificación

-15 bytes de bonificación: si imprime "No Pi Time"cuando no es hora de Pi.


Como siempre, las lagunas estándar no están permitidas. ¡Este es el más corto en bytes gana!

Downgoat
fuente
66
No creo que Costco le permita comprar la constante matemática pi en cualquier época del año.
Alex A.
2
Lo has cambiado a pastel normal. Eso también es falso porque puedes obtener pastel de Costco todo el año.
Alex A.
1
@AlexA. Hmm, raro, nunca lo puedo encontrar en el verano ...
Downgoat
1
¿Porque pi es infinitamente largo y quieres ser pasivo-agresivo?
Arcturus
8
Fui a Costco hoy, estaban cerrados.
Trauma digital el

Respuestas:

4

CJam, 41 bytes

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

Pruébalo aquí. Alternativamente, use este enlace para ocultar el resultado de etuna prueba más fácil.

Explicación

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
fuente
8

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

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

Sin golf:

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"

Gracias por -2 bytes @ edc65

nderscore
fuente
Podría ser en Date()lugar denew Date
edc65
'Pi '+['Day','Minute','Second'].find((x,i)=>................
wizzwizz4
@ wizzwizz4 esto no funcionará. Si no es hora de Pi, regresa"Pi undefined"
nderscore
¿Un cheque para indefinido sería más corto que 6 caracteres?
wizzwizz4
1
@nderscore Hay menos bytes que decir nderscoreque underscore.
wizzwizz4
5

Rubí, 125 124 caracteres

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]

Por desgracia, el más listo %i[month day hour min sec].map{|x|Time.new.send x}es más largo.

La clave aquí es el uso de each_conspara evitar la repetición (vea las últimas líneas de la explicación a continuación).

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)
Pomo de la puerta
fuente
Podrías ahorrar algunos caracteres al salir 'Pi'como lo hiciste con t, ¿no?
Cole Johnson el
@Cole ¿Y qué harás con el segundo elemento?
nicael
¿Por qué no es nada Pi Hour? ¿Qué pasa con las 2 de la tarde, mañana?
Sr. Lister el
@ColeJohnson No, [(p='Pi ')+Day','',p+'Minute',p+'Second']es más largo.
Pomo de la puerta
4

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

Lo intenté

Sin golf:

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]

Golfizado:

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
fuente
44
from datetime import*;n=datetime.now()Es más corto. Además, no tiene sentido indexar en una matriz cuando imprime cadenas constantes.
Pomo de la puerta
@Doorknob 冰 Eso es cierto :)
Zizouz212
Más corto incluso: paste.ee/p/ebcSh
Rɪᴋᴇʀ
Hecho intercambiando if / elses con [else, if] [instrucción].
Rɪᴋᴇʀ
1
Los últimos números están equivocados (2:13 en lugar de 3:14), y no se cumple el requisito de reloj de 12 horas. (Parece aplicarse también a algunas otras respuestas) También puede acortarlo indexando el resultado de time.localtime(); se reduce a 148-15 bytes (sin la corrección de 12 horas). Sin embargo, lo de 12 horas es desafortunado; sin él, podría reducirlo fácilmente a 129-15 bytes: 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')(y 118-15 bytes en Python 3, al convertir a bytes y usar find, lo que simplifica las cosas)
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

Bastante sencillo: solo verifica la fecha de cada caso.

Explicación:

  • D=Ð)gobtener la fecha actual ( Ð), almacenarla en la variable Dy obtener el mes ( g). ¿Por qué almacenarlo en la variable, si ya es de una letra? Porque desde entonces puedes vestir cualquier parte de la fecha Da, dónde aestá la función, regresar año, mes, fecha, etc. Pero de lo contrario tendrías que hacerlo Ð a, ver el espacio.

  • ¥3es ==3comprobar si el mes es marzo.

  • ©es &&decir, "y".
  • Df Es el día del mes.
  • E es 14
  • ?...:... - conjuntos típicos de operadores ternarios
  • Dd %Cel recordatorio de dividir la hora ( Dd) por 12 ( C)
  • Dc son los minutos
  • Db son segundos

Pruébalo en línea!


Para emular 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

Para emular 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

Para emular 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
fuente
3

TI-BASIC, 124 bytes

Gracias a FlagAsSpam por reducir algunos 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
fuente
¿Estás usando i(unidad imaginaria) y e(constante de Euler) como atajos? Si no, eso también podría ahorrarle algunos bytes.
Addison Crump
@FlagAsSpam Pensé en usarlos, pero no estaba seguro de si cuenta.
Conor O'Brien el
@FlagAsSpam Ya sea que sean válidos aquí o no, ¡en erealidad son dos bytes!
lirtosiast el
@ThomasKwa Oh, cierto.
Conor O'Brien
@FlagAsSpam Ya no es inválido. ^ _ ^
Conor O'Brien
3

Perl, 80-15 = 65 bytes

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

Tome 2, analizando la representación de cadena de localtime. En la actualidad, esto se parece a esto:

Sun Jan  3 15:14:15 2016

La posición de la cadena coincidente se utiliza para determinar el tiempo Pi correcto.


Perl, 100 bytes

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

localtimedevuelve los meses cero indexados, de ahí la necesidad de 3-/3/.

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

El requisito de 12 horas fue desafortunado, ya que esto hubiera sido 118-15 = 103 bytes sin él:

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
fuente
2

AppleScript, 202 190 187 183 181 bytes

Oye, esto no es tan malo después de todo.

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

En realidad encontré un uso para la llamada al método AppleScript. Imagínate.No Resulta que eso I'm an idiot. Establecer una variable es más corto.

(para aquellos que se preguntan, el comando de fecha actual devuelve un tipo de fecha con el contenido "Saturday, January 2, 2016 at 2:46:01 PM"o similar)

Addison Crump
fuente
1

PHP, 85-15 = 70 bytes

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

El truco principal que se usa aquí es el Ymdhi_is formato de fecha , al momento de escribir, las date('Ymdhi_is')devoluciones 201501030258_5828.

  • md, hiy isson los valores que serán reemplazados por0314 si es Pi-something. Tenga en cuenta que todas esas cadenas siempre serán reemplazadas por una cadena larga de 4 caracteres.
  • Se ponen en ese orden específico ya strposque dejarán de buscar en la primera aparición de la aguja, por lo que los colocamos en el orden de prioridad.
  • Es necesario un separador entre hiy isporque no queremos strposhacer coincidir un valor que se superponga a ambos (gracias a primo por guardar bytes aquí).
  • La aguja es 0314porque 314coincidiría erróneamente 10:31:42 como Pi-Second.

La parte Y es la más complicada. Necesitamos un prefijo para compensar la primera aparición de Pi-something, lo que nos permite distinguir strposlos valores de retorno entre false(no encontrado, Pi-nothing) y0 (encontrado en el índice 0, Pi-día).

Y queremos que este prefijo tenga 4 o 5 caracteres, ya que planeamos dividir strposel valor de retorno entre 4.

Y tiene 4 caracteres, pero:

  • algún día tendrá 5 caracteres y esto interrumpirá el programa (piense en el año 10314): la documentación de PHP dice que Yserá reemplazado por 4 dígitos, pero no es cierto .
  • si regresas a tiempo, en el año 314, se interrumpirá el programa.

Como PHP no existía en el año 314, y probablemente ya no existirá en el año 10314, supongo que estos errores se pueden ignorar de forma segura.

Tenga en cuenta que 0314puede superponerse Ymdya que:

  • Ymmd configuración: no hay 31 meses.
  • YYmm configuración: no hay 14 meses.
  • YYYm configuración: hay menos de 40 meses.

Además, hay una versión sin los errores relacionados con el año, que es 86-15 = 71 bytes :

<?=['No Pi Time','Pi Day','Pi Minute','Pi Second'][strpos(@date(D_mdhi_is),'0314')/4];
Benoit Esnard
fuente
Gran respuesta. Si usa guiones bajos en lugar de puntos, puede descartar las comillas Ymd_hi_is. Además, no creo que sea necesario un separador entre mdy hi, ya que las 12 horas hnunca pueden ser 14, y nunca comienzan con 3 o 4.
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(" "))
Puertas de Zach
fuente