Pi Day, Pi Minute ou Pi Second?


16

Dans ce défi, vous devrez déterminer s'il s'agit de Pi Day, Pi Minute ou Pi Second.

Parce que Pi est irrationnel, il veut que votre code soit aussi court que possible.

Exemples

Aucune entrée n'est fournie , votre programme doit utiliser l'heure du système. Je viens de l'ajouter pour plus de clarté

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'est-ce que Pi Day / Minute / Second

  • Pi Day c'est quand le mois est mars, et la date est le 14
  • Pi Minute c'est quand l'heure est 3, et la minute est 14
  • Pi Second c'est quand la minute est 3, et la seconde est 14
  • Pi Daydevrait être préféré au lieu de Pi Minuteou Pi Second, et Pi Minutedevrait être préféré au lieu de Pi Second.
  • Pour ce défi, vous devez utiliser le temps de 12 heures (15:14 == 3:14). La date / heure utilisée pour déterminer le Pi Day/Minute/Seconddoit être basée sur l' heure du système .

Score et bonus

Bonus de -15 octets: Si vous imprimez "No Pi Time"quand ce n'est pas le temps Pi.


Comme toujours, les failles standard sont interdites. C'est le plus court de en octets gagne!


6
Je ne pense pas que Costco vous permette d'acheter la constante mathématique pi à tout moment de l'année.
Alex A.

2
Vous l'avez changé en tarte ordinaire. C'est également faux parce que vous pouvez obtenir une tarte de Costco toute l'année.
Alex A.

1
@AlexA. Hmm, bizarre, je ne peux jamais le trouver en été ...
Downgoat

1
Parce que pi est infiniment long et que vous voulez être passif-agressif?
Arcturus

8
Je suis allé à Costco aujourd'hui - ils étaient fermés.
Digital Trauma

Réponses:


4

CJam, 41 octets

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

Testez-le ici. Vous pouvez également utiliser ce lien pour bloquer le résultat de etpour un test plus facile.

Explication

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 octets

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

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

Merci pour -2 octets @ edc65


Pourrait être Date()au lieu denew Date
edc65

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

@ wizzwizz4 cela ne fonctionnera pas. Si ce n'est pas l'heure de Pi, il revient"Pi undefined"
nderscore

Un chèque pour undefined serait-il plus court que 6 caractères?
wizzwizz4

1
@nderscore C'est moins d'octets à dire nderscoreque underscore.
wizzwizz4

5

Ruby, 125 124 caractères

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]

Hélas, le plus intelligent %i[month day hour min sec].map{|x|Time.new.send x} est plus long.

La clé ici est l'utilisation de each_conspour éviter la répétition (voir les dernières lignes de l'explication ci-dessous).

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)

Vous pouvez enregistrer quelques caractères en vous retirant 'Pi'comme vous l'avez fait avec t, non?
Cole Johnson

@Cole Et que ferez-vous avec le deuxième élément?
nicael

Pourquoi Pi Hour n'est-il rien? Quel est le problème avec 2 dans l'après-midi, demain?
M. Lister

@ColeJohnson Non, [(p='Pi ')+Day','',p+'Minute',p+'Second']c'est plus long.
Poignée de porte

4

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

j'ai essayé

Non 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]

Golfé:

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()est plus court. En outre, il est inutile d'indexer dans un tableau lorsque vous imprimez des chaînes constantes.
Poignée de porte

@Doorknob 冰 C'est vrai :)
Zizouz212

Plus court encore: paste.ee/p/ebcSh
Rɪᴋᴇʀ

Fabriqué en échangeant if / elses avec [else, if] [instruction].
Rɪᴋᴇʀ

1
Les derniers chiffres sont faux (2:13 au lieu de 3:14), et l'exigence d'horloge de 12 heures n'est pas remplie. (Semble également s'appliquer à d'autres réponses) Vous pouvez également le raccourcir en indexant le résultat de time.localtime(); il revient à 148-15 octets (sans le correctif de 12 heures). La chose de 12 heures est regrettable cependant; sans elle, vous pourriez facilement la réduire à 129-15 octets: 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')(et 118-15 octets sur Python 3, en convertissant en octets et en utilisant find, ce qui simplifie les choses)
Aleksi Torhamo

4

Japt, 78 - 15 = 63 octets

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

Assez simple - vérifie simplement la date de chaque cas.

Explication:

  • D=Ð)gobtenir la date actuelle ( Ð), la stocker dans la variable Det obtenir le mois ( g). Pourquoi le stocker dans la variable, si c'est déjà une lettre? Parce que depuis lors, vous pouvez habiller n'importe quelle partie de la date avec Da, où aest la fonction, retourner l'année, le mois, la date, etc. Mais sinon, vous devriez faire Ð a, voir l'espace.

  • ¥3est de ==3vérifier si le mois est mars.

  • ©est &&, c'est-à-dire "et".
  • Df est le jour du mois.
  • E a 14 ans
  • ?...:... - ensembles typiques d'opérateurs ternaires
  • Dd %Cle rappel de diviser l'heure ( Dd) par 12 ( C)
  • Dc est les minutes
  • Db sont des secondes

Essayez-le en ligne!


Pour émuler 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

Pour émuler 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

Pour émuler 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 octets

Merci à FlagAsSpam d'avoir rasé quelques octets.

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

Utilisez-vous i(unité imaginaire) et e(constante d'Euler) comme raccourcis? Sinon, cela pourrait également vous faire économiser quelques octets.
Addison Crump

@FlagAsSpam J'ai pensé à les utiliser, mais je ne savais pas si cela comptait.
Conor O'Brien

@FlagAsSpam Qu'ils soient valides ou non ici, ec'est en fait deux octets!
lirtosiast

@ThomasKwa Oh, c'est vrai.
Conor O'Brien

@FlagAsSpam Il n'est plus invalide. ^ _ ^
Conor O'Brien

3

Perl, 80 - 15 = 65 octets

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

Prenez 2, en analysant la représentation sous forme de chaîne de localtime. À l'heure actuelle, cela ressemble à ceci:

Sun Jan  3 15:14:15 2016

La position de la chaîne correspondante est utilisée pour déterminer le temps Pi correct.


Perl, 100 octets

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

localtimerenvoie les mois zéro indexés, d'où la nécessité de 3-/3/.


2

Python 3, 137 - 15 = 122 octets

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

L'exigence de 12 heures était regrettable, car cela aurait été de 118 à 15 = 103 octets sans cela:

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 181 octets

Hé, ce n'est pas si mal après tout.

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

J'ai en fait trouvé une utilisation pour l'appel de méthode d'AppleScript. Allez comprendre.Nan. Il s'avère queI'm an idiot . La définition d'une variable est plus courte.

(pour ceux qui se demandent, la commande date actuelle renvoie un type de date avec le contenu "Saturday, January 2, 2016 at 2:46:01 PM"ou similaire)


1

PHP, 85 - 15 = 70 octets

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

La principale astuce utilisée ici est le Ymdhi_is format de la date , au moment de la rédaction,date('Ymdhi_is') retours 201501030258_5828.

  • md, hi et issont les valeurs qui seront remplacées par0314 si c'est Pi-quelque chose. Notez que toutes ces chaînes seront toujours remplacées par une chaîne longue de 4 caractères.
  • Ils sont placés dans cet ordre spécifique car strposils arrêteront la recherche à la première occurrence de l'aiguille, nous les mettons donc dans l'ordre de priorité.
  • Un séparateur entre hiet isest nécessaire car nous ne voulons pas strposfaire correspondre une valeur qui chevaucherait les deux (grâce à primo pour avoir économisé des octets ici).
  • L'aiguille est 0314parce que314 qu'elle correspondrait à tort à 10:31:42 comme Pi-Second.

La partie Y est la plus délicate. Nous avons besoin d'un préfixe pour compenser la première occurrence de Pi-quelque chose, nous permettant de distinguer strposles valeurs de retour defalse (non trouvé, Pi-rien) et0 (trouvé à l'index 0, Pi-jour).

Et nous voulons que ce préfixe soit long de 4 ou 5 caractères, car nous prévoyons de diviser strpos la valeur de retour par 4.

Y est composé de 4 caractères, mais:

  • il sera un jour composé de 5 caractères, ce qui cassera le programme (pensez à l'année 10314): la documentation PHP dit que Ycela sera remplacé par 4 chiffres, mais ce n'est pas vrai .
  • si vous revenez dans le temps, à l'année 314, cela interrompra le programme.

Puisque PHP n'existait pas en 314 et n'existera probablement plus en 10314, je suppose que ces bogues peuvent être ignorés en toute sécurité.

Notez que cela 0314peut se chevaucher Ymdpuisque:

  • Ymmd configuration: il n'y a pas de 31ème mois.
  • YYmm configuration: il n'y a pas de 14ème mois.
  • YYYm configuration: il y a moins de 40 mois.

En outre, il existe une version sans les bogues liés à l'année, qui est de 86 à 15 = 71 octets :

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

Très bonne réponse. Si vous utilisez des traits de soulignement plutôt que des points, vous pouvez supprimer les guillemets Ymd_hi_is. De plus, je ne pense pas qu'un séparateur soit nécessaire entre mdet hi, comme les 12 heures hne peuvent jamais être 14, et ne commencent jamais par 3 ou 4.
primo

0

Python 3, 179 octets

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(" "))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.