파이의 날, 파이 분, 또는 파이 초?


16

이 챌린지에서 파이 데이, 파이 미닛 또는 파이 세컨인지 여부를 결정해야합니다.

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 Day / Minute / Second 란 무엇입니까

  • Pi Day 월이 3 월이고 날짜가 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
코스트코는 일년 중 언제든지 수학 상수 파이를 구입할 수 있다고 생각하지 않습니다.
— Alex A.

2
일반 파이로 변경했습니다. 일년 내내 코스트코에서 파이를 얻을 수 있기 때문에 그것은 거짓입니다.
— Alex A.

1
@AlexA. 흠, 나는 여름에 결코 그것을 찾을 수 없습니다 ...
— Downgoat

1
파이가 무한히 길고 수동적 공격을 원하기 때문에?
— Arcturus

8
나는 오늘 코스트코에 갔다.
— 디지털 외상

답변:


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

자바 (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

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

@ wizzwizz4이 작동하지 않습니다. Pi 시간이 아닌 경우 반환"Pi undefined"
— nderscore

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.
— Cole Johnson

@Cole 그리고 두 번째 요소로 무엇을 하시겠습니까?
— nicael

왜 파이 아워가 아닌가. 내일 오후 2시에 무슨 문제가 있습니까?
— Mr Lister

@ColeJohnson 아니오, [(p='Pi ')+Day','',p+'Minute',p+'Second']더 이상입니다.
— Doorknob

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

@Doorknob 冰 그건 사실입니다 :)
— Zizouz212

더 짧은 짝 : paste.ee/p/ebcSh
— Rɪᴋᴇʀ

if / eles를 [else, if] [statement]와 바꾸어 만듭니다.
— Rɪᴋᴇʀ

1
후자의 숫자가 잘못되어 (3:14 대신 2:13) 12 시간 시계 요구 사항이 충족되지 않습니다. (다른 답변에도 적용되는 것으로 보입니다) time.localtime(); 의 결과를 색인화하여 더 짧게 얻을 수도 있습니다 . 12 시간의 수정없이 148-15 바이트로 줄어 듭니다. 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')(그리고 파이썬 3에서는 118-15 바이트로 바이트로 변환하고 find를 사용하여 일을 더 간단하게 만듭니다)
— Aleksi Torhamo

4

apt, 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 초

온라인으로 사용해보십시오!


파이의 날을 흉내 내려면 :

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

파이 분을 에뮬레이션하려면 :

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는 실제로 2 바이트입니다!
— lirtosiast 2016 년

@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

일치하는 문자열의 위치는 올바른 파이 시간을 결정하는 데 사용됩니다.


펄, 100 바이트

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

localtime인덱스 된 월을 0으로 반환하므로에 대한 필요가 3-/3/있습니다.


2

파이썬 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

애플 스크립트, 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입니다.

  • md, hi및 is대체 될 값은0314 그것은 파이 - 뭔가 경우는. 이러한 모든 문자열은 항상 4 자 길이의 문자열로 대체됩니다.
  • strpos바늘이 처음 나타날 때 검색을 중지 하므로 특정 순서로 배치되므로 우선 순위에 따라 정렬합니다.
  • 사이의 구분 hi과는 is우리가 원하지 않기 때문에 필요하다 strpos(하는 덕분에 모두 겹치는 것 값과 일치하는 프리모 여기 바이트를 저장하기위한 참조).
  • 바늘은 Pi-Second와 10:31:42와 잘못 일치 0314하기 때문 314입니다.

Y 부분이 가장 까다 롭습니다. 우리는 우리가 구별 할 수 있도록, 파이 - 뭔가의 첫 번째 발생을 상쇄하는 접두사를 필요 strpos의 사이의 반환 값 false(찾을 수 없음, 파이 - 아무것도) 및0 (index 0, Pi-day에서 찾은 있습니다.

그리고 우리는이 접두어가 4 자 또는 5 자 길이가되기를 원합니다. 왜냐하면 우리는 strpos의 반환 값을 4 로 나눌 계획이기 때문 입니다.

Y는 4 자 길이이지만 다음과 같습니다.

  • 언젠가 5 자 길이로 프로그램이 중단 될 것입니다 (10314 년을 생각하십시오). PHP 문서 는 Y4 자리 숫자로 대체 될 것이라고 말하지만 사실 이 아닙니다 .
  • 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. 또한 12 시간 은 14 일 수 없으며 3 또는 4로 시작하지 않기 때문에 md와 사이에 구분 기호가 필요하다고 생각하지 않습니다 .hih
— primo

0

파이썬 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.