Pi Day,Pi Minute或Pi Second?


16

在此挑战中,您需要确定是Pi Day,Pi Minute还是Pi Second。

因为Pi是不合理的,所以它希望您的代码尽可能短。

例子

没有提供任何输入,您的程序应使用系统时间。我只是为了清楚起见添加了它

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>

什么是Pi日/分钟/秒

  • Pi Day 是月份是三月,日期是第十四天
  • Pi Minute 是小时是3,分钟是14
  • Pi Second 是当分钟是3,第二秒是14
  • Pi Day应该首选代替Pi MinutePi Second,并且Pi Minute应该首选代替Pi Second
  • 对于这个挑战,您应该使用12个小时的时间(15:14 == 3:14)。用于确定日期的时间Pi Day/Minute/Second应基于系统时间

得分与奖金

-15字节奖金:如果您"No Pi Time"在非Pi时间打印,则为。


与往常一样,不允许出现标准漏洞。这是最短的代码,以字节为单位!


6
我认为Costco不允许您在一年中的任何时候购买数学常数pi。
Alex A.

2
您已将其更改为常规派。这也是错误的,因为您一年四季都可以从Costco获得蛋糕。
Alex A.

1
@AlexA。嗯,很奇怪,我在夏天永远找不到它
Downgoat '16

1
因为pi无限长,并且您想变得被动进取?
Arcturus

8
我今天去了好市多-他们关门了。
Digital Trauma'1

Answers:


4

CJam,41个字节

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

在这里测试。或者,使用此链接对结果进行存根et以便于测试。

说明

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个字节

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

取消高尔夫:

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"

感谢-2个字节@ edc65


可以Date()代替new Date
edc65 '16

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

@ wizzwizz4这将无法工作。如果不是Pi时间,则返回"Pi undefined"
nderscore

未定义的支票会少于6个字符吗?
wizzwizz4 2016年

1
@nderscore它的字节少于说nderscore不是underscore
wizzwizz4

5

Ruby,125 124个字符

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]

las,聪明%i[month day hour min sec].map{|x|Time.new.send x}的人更长。

这里的关键是使用 each_cons避免重复(请参阅下面的解释的最后几行)。

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)

您可以'Pi'像撤消操作一样退出,以节省一些字符t,不是吗?
科尔·约翰逊

@Cole您将如何处理第二个元素?
nicael

为什么Pi Hour什么都没有。明天下午2点有什么问题?
李斯特先生,2016年

@ColeJohnson不,[(p='Pi ')+Day','',p+'Minute',p+'Second']更长。
门把手

4

蟒蛇2,219 186 183个字节(198-15)

我试过了

取消高尔夫:

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]

打高尔夫球:

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()更短。另外,在打印常量字符串时,索引到数组中没有意义。
门把手

@Doorknob冰是真的:)
Zizouz212 '16

甚至更短:paste.ee/p/ebcSh
Rɪᴋᴇʀ

通过将if / elses与[else,if] [statement]交换而制成。
Rɪᴋᴇʀ

1
后面的数字是错误的(2:13而不是3:14),并且不能满足12小时时钟的要求。(似乎也适用于其他一些答案),您也可以通过索引time.localtime(); 的结果来使其更短 它减少到148-15字节(没有12小时修复)。不过,这12小时的工作很不幸;没有它,您可以轻松地将其压缩为129-15字节:(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')在Python 3上为118-15字节,通过转换为字节并使用find可以使事情变得更简单)
Aleksi Torhamo

4

Japt,78-15 = 63字节

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

非常简单-只需检查每种情况的日期。

说明:

  • D=Ð)g获取当前日期(Ð),将其存储在变量中,D然后获取月份(g)。如果它已经是一个字母,为什么还要将其存储在变量中?因为从那时起,您可以使用来修饰日期的任何部分,函数Da在哪里a,返回年,月,日等。但是否则,您必须要做的是Ð a,查看空格。

  • ¥3==3,检查月份是否为三月。

  • ©&&,即“和”。
  • Df 是一个月中的一天。
  • E 是14
  • ?...:... -典型的三元运算符集
  • Dd %C提醒将小时(Dd)除以12(C
  • Dc 是分钟
  • Db 是秒

在线尝试!


模拟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

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

模拟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字节

感谢FlagAsSpam节省了几个字节。

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

您是否正在使用i(虚数单位)和e(欧拉常数)作为快捷方式?如果没有,那也可以节省一些字节。
Addison Crump

我曾考虑过使用@FlagAsSpam,但不确定是否有价值。
科纳·奥布莱恩

@FlagAsSpam无论它们在这里是否有效,e实际上是两个字节!
lirtosiast

@ThomasKwa哦,对。
科纳·奥布莱恩

@FlagAsSpam不再无效。^ _ ^
科纳·奥布莱恩

3

Perl,80-15 = 65字节

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

取2,解析的字符串表示形式localtime。目前,这看起来像这样:

Sun Jan  3 15:14:15 2016

匹配的字符串的位置用于确定正确的Pi时间。


Perl,100字节

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

localtime返回零索引的月份,因此需要3-/3/


2

Python 3,137-15 = 122字节

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

不幸的是12小时的要求,因为如果没有它,这将是118-15 = 103字节:

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字节

嘿,毕竟还算不错。

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

实际上,我发现AppleScript的方法调用有用。去搞清楚。不。事实证明I'm an idiot。设置变量更短。

(对于那些想知道的人,当前日期命令返回带有内容"Saturday, January 2, 2016 at 2:46:01 PM"等的日期类型)


1

PHP,85-15 = 70字节

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

此处主要的技巧是Ymdhi_is 日期格式,在撰写本文时,date('Ymdhi_is')返回201501030258_5828

  • mdhi以及is是谁都会被替换的值0314,如果它是丕东西。请注意,所有这些字符串将始终被4个字符长的字符串替换。
  • 它们以该特定顺序放置,因为strpos它将在首次出现针时停止搜索,因此我们将它们置于优先顺序。
  • hi和之间的分隔符is是必需的,因为我们不希望strpos匹配将两者重叠的值(感谢primo此处保存了字节)。
  • 针是0314因为314会错误地匹配Pi-Second 10:31:42。

Y部分最棘手。我们需要一个前缀来抵消Pi-something的首次出现,从而使我们能够区分strpos的返回值false(未找到,Pi-nothing)和0(在索引0,Pi-day找到。

而且我们希望此前缀的长度为4个或5个字符,因为我们计划进行除法 strpos返回值除以4。

Y长4个字符,但是:

  • 总有一天会是5个字符,这会破坏程序(想想10314年):PHP文档Y它将替换为4位数字,但事实并非如此。
  • 如果您及时返回,则在314年,它将中断程序。

由于PHP在314年不存在,并且很可能在10314年将不存在,因此我认为可以安全地忽略这些错误。

请注意,这0314可能会重叠,Ymd因为:

  • Ymmd 配置:没有第31个月。
  • YYmm 配置:没有第14个月。
  • YYYm 配置:不到40个月。

此外,还有一个没有与年份相关的错误的版本,即86-15 = 71字节

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

好答案。如果您使用下划线而不是点,则可以将引号引起来Ymd_hi_is。另外,我不认为一个分离器之间是必要的mdhi,如12小时h永远是14,与3或4从未开始
普里莫

0

Python 3,179个字节

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(" "))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.