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 月は3月で、日付は14日です
  • Pi Minute 時は3で、分は14です
  • Pi Second 分が3で、秒が14の場合
  • Pi DayPi Minuteまたはの代わりに優先されるべきでありPi Second、のPi Minute代わりに優先されるべきですPi Second
  • このチャレンジでは、12時間(15:14 == 3:14)を使用する必要があります。決定に使用される日付/時刻はPi Day/Minute/Secondシステム時刻に基づいている必要があります。

得点とボーナス

-15バイトボーナス:"No Pi Time" Pi時間でないときに印刷する場合。


いつものように、標準の抜け穴は許可されていません。これは、バイト単位のコード最短コードです。


6
Costcoでは、一年中いつでも数学定数piを購入できるとは思いません。
アレックスA.

2
これを通常のパイに変更しました。コストコから一年中パイを手に入れることができるので、それも間違っています。
アレックスA.

1
@AlexA。うーん、変な夏にそれを見つけることはできません...
Downgoat

1
円周率は無限に長く、受動的かつ積極的になりたいのですか?
アークトゥルス

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

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

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

@ wizzwizz4これは機能しません。Pi時間ではない場合、戻ります"Pi undefined"
-nderscore

未定義のチェックは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そして、2番目の要素で何をしますか?
ニカエル

なぜPi Hourは何もありません。明日の午後の2の何が問題になっていますか?
リスター氏

@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

短いさえ:paste.ee/p/ebcSh
Rɪᴋᴇʀ

if / elsesを[else、if] [statement]と交換することにより作成されます。
Rɪᴋᴇʀ

1
後者の数値は間違っており(3:14ではなく2:13)、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では、バイトに変換してfindを使用すると118〜15バイトになり、物事が簡単になります)
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)を取得します。既に1文字の場合、なぜ変数に格納するのですか?それ以来、あなたと日付の任意の部分に服を着せることができますのでDa、どこaなど、年、月、日を返す。しかしそうでない場合、あなたがしなければならないだろう機能れÐ a、スペースを参照してください。

  • ¥3==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ショートカットとして(オイラーの定数を)?そうでなければ、それはあなたにいくつかのバイトを節約することもできます。
アディソンクランプ

@FlagAsSpamこれらを使用することを考えましたが、それが重要かどうかはわかりませんでした。
コナーオブライエン

@FlagAsSpamここで有効であるかどうかにかかわらず、e実際には2バイトです!
リルトジアスト

@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

一致した文字列の位置は、正しいパイ時間を決定するために使用されます。


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

アップルスクリプト、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 Piである場合にです。これらのすべての文字列は、常に4文字の長い文字列に置き換えられることに注意してください。
  • それらはその特定の順序で配置されます strpos針の最初の出現で検索を停止で配置されます。したがって、優先順位の順に配置します。
  • 間の区切りhiとはis、我々が望んでいないので、必要であるstrposとの両方(おかげで重なってしまう値と一致するようにプリモをここでバイトを保存するために)。
  • 針は 0314314、Pi-Secondとして10:31:42と誤って一致するためです。

Yの部分が最もトリッキーです。Pi何かの最初の出現を相殺するために接頭辞が必要です。strposです。これにより、false(見つからない、Piなし)と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。また、私は、セパレータが間に必要なだとは思わないmdhi、12時間のようにh14になることはありませんし、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.