วันปี่, นาทีพี่หรือปี่ที่สอง


16

ในการท้าทายนี้คุณจะต้องตรวจสอบว่าเป็นวัน Pi, นาทีนาทีหรือ Pi วินาที

เนื่องจาก 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 คือเมื่อเดือนมีนาคมและวันที่คือวันที่ 14
  • Pi Minute คือเมื่อชั่วโมงคือ 3 และนาทีคือ 14
  • Pi Second คือเมื่อนาทีคือ 3 และวินาทีคือ 14
  • Pi Dayควรเป็นที่ต้องการแทนPi MinuteหรือPi 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

1
เพราะ pi นั้นมีความยาวและคุณต้องการที่จะก้าวร้าวแบบพาสซีฟหรือไม่?
Arcturus

8
ฉันไปที่ Costco วันนี้ - พวกเขาถูกปิด
บาดเจ็บทางดิจิตอล

คำตอบ:


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'

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"

ขอบคุณสำหรับ -2 bytes @ edc65


อาจDate()แทนnew Date
edc65

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

@ wizzwizz4 สิ่งนี้จะไม่ทำงาน หากไม่ใช่เวลา Pi ก็จะส่งกลับ"Pi undefined"
ขีดล่าง

เช็คที่ไม่ได้กำหนดจะสั้นกว่า 6 ตัวอักษรหรือไม่
wizzwizz4

1
@nderscore มันไบต์น้อยลงที่จะพูดมากกว่าnderscore underscore
wizzwizz4

5

ทับทิม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]

อนิจจาฉลาด%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ใช่ไหม?
โคลจอห์นสัน

@ เสาและคุณจะทำอย่างไรกับองค์ประกอบที่สอง?
nicael

ทำไม Pi Hour ถึงไม่ได้อะไรเลย เกิดอะไรขึ้นกับ 2 ในตอนบ่ายพรุ่งนี้
Mr Lister

@ColeJohnson ไม่[(p='Pi ')+Day','',p+'Minute',p+'Second']นานกว่านี้
Doorknob

4

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

ฉันเหนื่อย

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]

แข็งแรงเล่นกอล์ฟ:

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

@Doorknob冰ที่จริง :)
Zizouz212

ให้สั้นลง: paste.ee/p/ebcSh
Rɪᴋᴇʀ

ทำโดยการแลกเปลี่ยนถ้า / 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')(และ 118-15 bytes บน Python 3 โดยแปลงเป็น bytes และใช้ 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 นาที :

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 ที่สอง :

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 ฉันคิดเกี่ยวกับการใช้สิ่งเหล่านั้น แต่ฉันไม่แน่ใจว่าจะนับหรือไม่
Conor O'Brien

@FlagAsSpam ไม่ว่าพวกเขาจะถูกต้องที่นี่หรือไม่eเป็นจริงสองไบต์!
lirtosiast

@ThomasKwa โอ้ใช่แล้ว
Conor O'Brien

@FlagAsSpam มันไม่ถูกต้องอีกต่อไป ^ _ ^
Conor O'Brien

3

Perl, 80 - 15 = 65 ไบต์

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

Take 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

localtime3-/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 จริงๆแล้ว ไปคิด Nope เพิ่งจะเปิดออกว่าI'm an idiotเพียงแค่ปรากฎว่าการตั้งค่าตัวแปรจะสั้นกว่า

(สำหรับผู้ที่สงสัยคำสั่ง date ปัจจุบันจะคืนค่าวันที่ด้วยเนื้อหา"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

  • md, hiและisเป็นค่าที่จะถูกแทนที่ด้วย0314ถ้าหากมันเป็นชิ้นบางสิ่งบางอย่าง โปรดทราบว่าสตริงเหล่านั้นทั้งหมดจะถูกแทนที่ด้วยสตริงยาว 4 อักขระเสมอ
  • พวกเขาจะถูกจัดเรียงตามลำดับเฉพาะนั้นเนื่องจากstrposจะหยุดค้นหาที่การเกิดขึ้นครั้งแรกของเข็มดังนั้นเราจึงจัดลำดับตามความสำคัญ
  • ตัวคั่นระหว่างhiและisจำเป็นเนื่องจากเราไม่ต้องการstrposจับคู่ค่าที่จะซ้อนทับทั้งคู่ (ขอบคุณprimoสำหรับการบันทึกไบต์ที่นี่)
  • เข็มเป็น0314เพราะ314ผิดจะตรงกับ 10:31:42 เป็น Pi-Second

ส่วน Y เป็นเล่ห์เหลี่ยมที่สุด เราต้องการคำนำหน้าเพื่อชดเชยสิ่งที่เกิดขึ้นครั้งแรกของ Pi- บางสิ่งบางอย่างช่วยให้เราสามารถแยกแยะความแตกต่าง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ถ้าคุณใช้ขีดมากกว่าจุดคุณสามารถวางคำพูดที่อยู่รอบ ๆ นอกจากนี้ผมไม่คิดว่าเป็นสิ่งจำเป็นที่คั่นระหว่างmdและhiเป็น 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(" "))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.