Ngày Pi, phút Pi, hay giây Pi?


16

Trong thử thách này, bạn sẽ cần xác định xem đó là Ngày số Pi, Số phút hay Số giây.

Bởi vì Pi là không hợp lý, nó muốn mã của bạn càng ngắn càng tốt.

Ví dụ

Không có đầu vào được cung cấp , chương trình của bạn nên sử dụng thời gian hệ thống. Tôi vừa thêm nó cho rõ ràng

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>

Ngày Pi / phút / giây là gì

  • Pi Day là khi tháng là tháng ba và ngày là ngày 14
  • Pi Minute là khi giờ là 3 và phút là 14
  • Pi Second là khi phút là 3 và giây là 14
  • Pi Daynên được ưu tiên thay vì Pi Minutehoặc Pi Second, và Pi Minutenên được ưu tiên thay vì Pi Second.
  • Đối với thử thách này, bạn nên sử dụng thời gian 12 giờ (15:14 == 3:14). Ngày / giờ được sử dụng để xác định Pi Day/Minute/Secondnên dựa trên thời gian hệ thống .

Chấm điểm & thưởng

Tiền thưởng -15 byte: Nếu bạn in "No Pi Time"khi không phải là thời gian Pi.


Như mọi khi, sơ hở tiêu chuẩn là không được phép. Đây là code ngắn nhất tính theo byte thắng!


6
Tôi không nghĩ Costco cho phép bạn mua pi hằng số toán học bất cứ lúc nào trong năm.
Alex A.

2
Bạn đã thay đổi nó thành chiếc bánh thông thường. Điều đó cũng sai vì bạn có thể nhận được chiếc bánh từ Costco cả năm.
Alex A.

1
@AlexA. Hmm, kỳ lạ, tôi không bao giờ có thể tìm thấy nó vào mùa hè ...
Downgoat

1
Bởi vì pi là vô cùng dài và bạn muốn trở nên thụ động-tích cực?
Arcturus

8
Tôi đã đến Costco hôm nay - họ đã đóng cửa.
Chấn thương kỹ thuật số

Câu trả lời:


4

CJam, 41 byte

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

Kiểm tra nó ở đây. Hoặc sử dụng liên kết này để khai thác kết quả của etthử nghiệm dễ dàng hơn.

Giải trình

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'

Ung dung:

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"

Cảm ơn -2 byte @ edc65


Có thể Date()thay vìnew Date
edc65

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

@ wizzwizz4 điều này sẽ không hoạt động. Nếu không phải là giờ Pi, nó sẽ quay trở lại"Pi undefined"
nderscore

Một kiểm tra cho không xác định sẽ ngắn hơn 6 ký tự?
wizzwizz4

1
@nderscore Đó là ít byte hơn để nói nderscorehơn underscore.
wizzwizz4

5

Ruby, 125 124 ký tự

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]

Than ôi, thông minh hơn %i[month day hour min sec].map{|x|Time.new.send x}là lâu hơn.

Chìa khóa ở đây là việc sử dụng each_consđể tránh sự lặp lại (xem vài dòng cuối cùng của lời giải thích bên dưới).

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)

Bạn có thể tiết kiệm một vài ký tự bằng cách rút ra 'Pi'như bạn đã làm với t, phải không?
Cole Johnson

@Cole Và bạn sẽ làm gì với yếu tố thứ hai?
nicael

Tại sao không phải là Pi Giờ. Có gì sai với 2 giờ chiều, ngày mai?
Ông Lister

@ColeJohnson Không, [(p='Pi ')+Day','',p+'Minute',p+'Second']dài hơn.
Doorknob

4

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

Tôi đã thử

Ung dung:

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]

Chơi gôn

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()ngắn hơn Ngoài ra, không có điểm nào trong việc lập chỉ mục thành một mảng khi bạn in các chuỗi không đổi.
Doorknob

@Doorknob 冰 Điều đó đúng :)
Zizouz212

Thậm chí ngắn hơn: paste.ee/p/ebcSh
Rɪᴋᴇʀ

Được thực hiện bằng cách hoán đổi if / elses với [other, if] [statement].
R

1
Các số sau sai (2:13 thay vì 3:14) và yêu cầu đồng hồ 12 giờ không được đáp ứng. (Có vẻ cũng áp dụng cho một số câu trả lời khác) Bạn cũng có thể rút ngắn nó bằng cách lập chỉ mục kết quả của time.localtime(); nó giảm xuống còn 148-15 byte (không cần sửa 12 giờ). Điều 12 giờ là không may mặc dù; không có nó, bạn có thể dễ dàng lấy nó xuống 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')(và 118-15 byte trên Python 3, bằng cách chuyển đổi thành byte và sử dụng find, điều này làm cho mọi thứ đơn giản hơn)
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

Khá đơn giản - chỉ cần kiểm tra ngày cho mọi trường hợp.

Giải trình:

  • D=Ð)glấy ngày hiện tại ( Ð), lưu trữ trong biếnD và lấy tháng ( g). Tại sao lưu nó trong biến, nếu nó đã là một chữ cái? Bởi vì kể từ đó, bạn có thể mặc bất kỳ phần nào của ngày Da, achức năng, năm trở lại, tháng, ngày, v.v. Nhưng nếu không, bạn phải làm Ð a, hãy xem khoảng trắng.

  • ¥3==3, kiểm tra nếu tháng là tháng ba.

  • ©&&, tức là "và".
  • Df là ngày trong tháng.
  • E là 14
  • ?...:... - bộ điển hình của toán tử ternary
  • Dd %Clời nhắc chia giờ ( Dd) cho 12 (C )
  • Dc là phút
  • Db là giây

Hãy thử trực tuyến!


Để thi đua Ngày Pi:

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

Để mô phỏng phút Pi :

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

Để mô phỏng Pi thứ hai :

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

Cảm ơn FlagAsSpam đã cạo một vài 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

Bạn có đang sử dụng i(đơn vị tưởng tượng) và e(hằng số Euler) làm phím tắt không? Nếu không, điều đó cũng có thể giúp bạn tiết kiệm một số byte.
Addison Crump

@FlagAsSpam Tôi đã nghĩ về việc sử dụng chúng, nhưng tôi không chắc là nó có được không.
Conor O'Brien

@FlagAsSpam Dù chúng có hợp lệ ở đây hay không, ethực ra là hai byte!
lirtosiast

@ThomasKwa ơi, đúng rồi.
Conor O'Brien

@FlagAsSpam Nó không còn hợp lệ. ^ _ ^
Conor O'Brien

3

Perl, 80 - 15 = 65 byte

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

Lấy 2, phân tích cú pháp đại diện chuỗi localtime. Hiện tại, nó trông giống như thế này:

Sun Jan  3 15:14:15 2016

Vị trí của chuỗi khớp được sử dụng để xác định Thời gian Pi chính xác.


Perl, 100 byte

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

localtimetrả về các tháng không được lập chỉ mục, do đó cần 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'))

Yêu cầu 12 giờ là không may, vì điều này sẽ là 118-15 = 103 byte nếu không có nó:

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

Này, điều này không tệ lắm đâu.

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

Tôi thực sự tìm thấy một cách sử dụng để gọi phương thức của AppleScript. Đi hình.Không. Chỉ cần ra rằng I'm an idiot. Đặt một biến là ngắn hơn.

(đối với những người thắc mắc, lệnh ngày hiện tại trả về loại ngày có nội dung "Saturday, January 2, 2016 at 2:46:01 PM"hoặc tương tự)


1

PHP, 85 - 15 = 70 byte

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

Thủ thuật chính sử dụng ở đây là Ymdhi_is định dạng ngày , tại thời điểm viết, date('Ymdhi_is')trả về 201501030258_5828.

  • md, hiislà những giá trị, những người sẽ được thay thế bằng0314 nếu đó là Pi-một cái gì đó. Lưu ý rằng tất cả các chuỗi đó sẽ luôn được thay thế bằng chuỗi dài 4 ký tự.
  • Chúng được đặt theo thứ tự cụ thể vì strpossẽ ngừng tìm kiếm ở lần xuất hiện đầu tiên của kim, vì vậy chúng tôi đặt chúng theo thứ tự ưu tiên.
  • Một dấu tách giữa hiislà cần thiết bởi vì chúng tôi không muốn strposkhớp với một giá trị sẽ chồng lấp cả hai (nhờ vào primo để lưu byte ở đây).
  • Kim là 0314314sẽ khớp sai 10:31:42 là Pi-Second.

Phần Y là khó nhất. Chúng ta cần một tiền tố để bù cho lần xuất hiện đầu tiên của Pi-Something, cho phép chúng ta phân biệt strposcác giá trị trả về giữa false(không tìm thấy, Pi-nothing) và 0(tìm thấy tại chỉ số 0, Pi-day).

Và chúng tôi muốn tiền tố này dài 4 hoặc 5 ký tự, vì chúng tôi dự định chia strposgiá trị trả về cho 4.

Y dài 4 ký tự, nhưng:

  • nó sẽ dài 5 ký tự vào một ngày nào đó và điều này sẽ phá vỡ chương trình (nghĩ về năm 10314): tài liệu PHP nói rằng nó Ysẽ được thay thế bằng 4 chữ số, nhưng điều đó không đúng .
  • nếu bạn quay ngược thời gian, vào năm 314, nó sẽ phá vỡ chương trình.

Vì PHP không tồn tại vào năm 314 và có khả năng sẽ không tồn tại nữa vào năm 10314, tôi đoán những lỗi này có thể được bỏ qua một cách an toàn.

Lưu ý rằng 0314có thể chồng lấp Ymdkể từ:

  • Ymmd cấu hình: không có tháng thứ 31
  • YYmm cấu hình: không có tháng thứ 14.
  • YYYm cấu hình: có ít hơn 40 tháng.

Ngoài ra, có một phiên bản không có lỗi liên quan đến năm, đó là 86 - 15 = 71 byte :

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

Câu trả lời chính xác. Nếu bạn sử dụng dấu gạch dưới thay vì dấu chấm, bạn có thể thả dấu ngoặc kép xung quanh Ymd_hi_is. Ngoài ra, tôi không nghĩ rằng một dải phân cách là cần thiết giữa mdhi, vì 12 giờ hkhông bao giờ có thể là 14 và không bao giờ bắt đầu bằng 3 hoặc 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(" "))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.