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


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, hiis대체 될 값은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.