Dia do Pi, Minuto do Pi ou Segundo do Pi?

16

Nesse desafio, você precisará determinar se é Pi Day, Pi Minute ou Pi Second.

Como o Pi é irracional, ele deseja que seu código seja o mais curto possível.

Exemplos

Nenhuma entrada é fornecida , seu programa deve usar a hora do sistema. Acabei de adicionar para maior clareza

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>

O que é Pi Dia / Minuto / Segundo

  • Pi Day é quando o mês é março e a data é 14
  • Pi Minute é quando a hora é 3 e o minuto é 14
  • Pi Second é quando o minuto é 3 e o segundo é 14
  • Pi Daydeve ser preferido em vez de Pi Minuteou Pi Seconde Pi Minutedeve ser preferido em vez de Pi Second.
  • Para esse desafio, você deve usar o tempo de 12 horas (15:14 == 3:14). A data / hora usada para determinar a data Pi Day/Minute/Seconddeve ser baseada na hora do sistema .

Pontuação e bônus

Bônus de 15 bytes: se você imprimir "No Pi Time"quando não for a hora do Pi.


Como sempre, as brechas padrão não são permitidas. Este é o mais curto do em bytes ganhos!

Downgoat
fonte
6
Não acho que o Costco permita que você compre a constante matemática pi em qualquer época do ano.
Alex A.
2
Você mudou para torta normal. Isso também é falso, porque você pode obter torta da Costco o ano todo.
Alex A.
1
@AlexA. Hmm, estranho eu nunca pode encontrá-lo no verão ...
Downgoat
1
Porque pi é infinitamente longo e você quer ser passivo-agressivo?
Arcturus
8
Eu fui a Costco hoje - eles estavam fechados.
Digital Trauma

Respostas:

4

CJam, 41 bytes

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

Teste aqui. Como alternativa, use esse link para stub o resultado etpara um teste mais fácil.

Explicação

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

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"

Obrigado por -2 bytes @ edc65

nderscore
fonte
Pode ser em Date()vez denew Date
edc65 2/16
'Pi '+['Day','Minute','Second'].find((x,i)=>................
wizzwizz4
@ wizzwizz4 isso não vai funcionar. Se não é hora do Pi, ele retorna"Pi undefined"
nderscore
Um cheque indefinido seria menor que 6 caracteres?
precisa saber é o seguinte
1
@nderscore É menos bytes para dizer nderscoreque underscore.
Wizzwizz4
5

Ruby, 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]

Infelizmente, o mais inteligente %i[month day hour min sec].map{|x|Time.new.send x}é mais longo.

A chave aqui é o uso de each_conspara evitar repetições (veja as últimas linhas da explicação abaixo).

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)
Maçaneta da porta
fonte
Você poderia economizar alguns caracteres puxando para fora 'Pi'como fez t, não?
Cole Johnson
@Cole E o que você fará com o segundo elemento?
Nicael
Por que Pi Hour não é nada. O que há de errado com 2 da tarde amanhã?
Lister
@ColeJohnson Não, [(p='Pi ')+Day','',p+'Minute',p+'Second']é mais longo.
Maçaneta
4

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

eu tentei

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]

Golfe:

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
fonte
4
from datetime import*;n=datetime.now()é mais curto. Além disso, não faz sentido indexar em uma matriz quando você estiver imprimindo seqüências constantes.
Maçaneta
@Doorknob冰Isso é verdade :)
Zizouz212
Mais curto ainda: paste.ee/p/ebcSh
#
Feito trocando if / elses com [else, if] [instrução].
Rɪᴋᴇʀ
1
Os últimos números estão errados (2:13 em vez de 3:14) e o requisito de relógio de 12 horas não é atendido. (Parece aplicar-se a outras respostas também) Você também pode reduzi-lo indexando o resultado de time.localtime(); ele se reduz a 148 a 15 bytes (sem a correção de 12 horas). A coisa de 12 horas é lamentável; sem ele você pode facilmente obtê-lo para baixo para 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')(e 118-15 bytes em Python 3, através da conversão de bytes e usando find, o que torna as coisas mais simples)
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

Bem simples - basta verificar a data de cada caso.

Explicação:

  • D=Ð)gobtenha a data atual ( Ð), armazene-a na variável De obtenha o mês ( g). Por que armazená-lo na variável, se já é uma letra? Porque, desde então, você pode vestir qualquer parte da data com Da, onde aestá a função, retornar ano, mês, data etc. Mas, caso contrário, você precisaria fazer isso Ð a, veja o espaço.

  • ¥3ou seja ==3, verificar se o mês é março.

  • ©é &&, ou seja, "e".
  • Df é o dia do mês.
  • E é 14
  • ?...:... - conjuntos típicos de operadores ternários
  • Dd %Co lembrete de dividir a hora ( Dd) por 12 ( C)
  • Dc são os minutos
  • Db são segundos

Experimente online!


Para emular o 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 o 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 o 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
fonte
3

TI-BASIC, 124 bytes

Agradecimentos a FlagAsSpam por remover alguns 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
fonte
Você está usando i(unidade imaginária) e e(constante de Euler) como atalhos? Caso contrário, isso também poderá economizar alguns bytes.
Addison Crump
@FlagAsSpam Pensei em usá-los, mas não tinha certeza se isso conta.
Conor O'Brien
@FlagAsSpam Seja válido ou não aqui, ena verdade são dois bytes!
lirtosiast
@ThomasKwa Oh, certo.
Conor O'Brien
@FlagAsSpam Não é mais 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, analisando a representação em cadeia de localtime. No momento, isso se parece com isso:

Sun Jan  3 15:14:15 2016

A posição da sequência correspondente é usada para determinar o tempo do Pi correto.


Perl, 100 bytes

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

localtimeretorna os meses zero indexados, daí a necessidade de 3-/3/.

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

O requisito de 12 horas foi lamentável, pois teria sido de 118 a 15 = 103 bytes sem ele:

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

AppleScript, 202 190 187 183 181 bytes

Ei, isso não é tão ruim, afinal.

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

Na verdade, eu achei um uso para a chamada de método do AppleScript. Vai saber.Não. Acontece que sim I'm an idiot. Definir uma variável é mais curto.

(para quem está se perguntando, o comando date atual retorna um tipo de data com o conteúdo "Saturday, January 2, 2016 at 2:46:01 PM"ou algo parecido)

Addison Crump
fonte
1

PHP, 85 - 15 = 70 bytes

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

O principal truque usado aqui é o Ymdhi_is formato da data , no momento da redação, date('Ymdhi_is')retorna 201501030258_5828.

  • md, hiE issão os valores que serão substituídos por0314 se for algo Pi. Observe que todas essas cadeias sempre serão substituídas por uma cadeia longa de 4 caracteres.
  • Eles são colocados nessa ordem específica, pois strposinterromperão a pesquisa na primeira ocorrência da agulha; portanto, os colocamos na ordem de prioridade.
  • Um separador entre hie isé necessário porque não queremos strposcombinar um valor que se sobreponha a ambos (graças ao primo para salvar bytes aqui).
  • A agulha é 0314porque 314corresponderia incorretamente às 10:31:42 como Pi-Second.

A parte Y é a mais complicada. Precisamos de um prefixo para compensar a primeira ocorrência de Pi-something, permitindo distinguir strposos valores de retorno entre false(não encontrado, Pi-nothing) e 0(encontrado no índice 0, Pi-dia).

E queremos que esse prefixo tenha 4 ou 5 caracteres, pois estamos planejando dividir strposo valor de retorno por 4.

Y tem 4 caracteres, mas:

  • um dia terá 5 caracteres e isso interromperá o programa (pense no ano 10314): a documentação do PHP diz que Yserá substituído por 4 dígitos, mas não é verdade .
  • se você voltar no tempo, no ano 314, ele interromperá o programa.

Como o PHP não existia no ano 314 e provavelmente não existirá mais no ano 10314, acho que esses erros podem ser ignorados com segurança.

Observe que 0314pode se sobrepor, Ymdpois:

  • Ymmd configuração: não há 31º mês.
  • YYmm configuração: não há 14 meses.
  • YYYm configuração: há menos de 40 meses.

Além disso, há uma versão sem os bugs relacionados ao ano, que é 86 - 15 = 71 bytes :

<?=['No Pi Time','Pi Day','Pi Minute','Pi Second'][strpos(@date(D_mdhi_is),'0314')/4];
Benoit Esnard
fonte
Ótima resposta. Se você usar sublinhados em vez de pontos, poderá soltar as aspas Ymd_hi_is. Além disso, eu não acho que um separador é necessário entre mde hi, como o de 12 horas hnunca pode ser 14, e nunca começar com 3 ou 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(" "))
Zach Gates
fonte