Pi Day, Pi Minute, atau Pi Second?

16

Dalam tantangan ini, Anda perlu menentukan apakah itu Hari Pi, Pi Menit, atau Pi Kedua.

Karena Pi tidak rasional, ia ingin kode Anda sesingkat mungkin.

Contohnya

Tidak ada input yang diberikan , program Anda harus menggunakan waktu sistem. Saya baru saja menambahkannya untuk kejelasan

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>

Apa itu Pi Day / Minute / Second

  • Pi Day adalah ketika bulan Maret, dan tanggal 14
  • Pi Minute adalah ketika jam adalah 3, dan menit adalah 14
  • Pi Second adalah ketika menit adalah 3, dan yang kedua adalah 14
  • Pi Dayharus lebih disukai daripada Pi Minuteatau Pi Second, dan Pi Minuteharus lebih disukai daripada Pi Second.
  • Untuk tantangan ini, Anda harus menggunakan waktu 12 jam (15:14 == 3:14). Tanggal / waktu yang digunakan untuk menentukan Pi Day/Minute/Secondharus berdasarkan waktu sistem .

Penilaian & Bonus

-15 byte Bonus: Jika Anda mencetak "No Pi Time"saat ini bukan waktu Pi.


Seperti biasa, celah standar tidak diizinkan. Ini adalah kode terpendek dalam bytes menang!

Downgoat
sumber
6
Saya tidak berpikir Costco memungkinkan Anda untuk membeli pi konstan matematika setiap saat sepanjang tahun.
Alex A.
2
Anda telah mengubahnya menjadi pie biasa. Itu juga salah karena Anda bisa mendapatkan pie dari Costco sepanjang tahun.
Alex A.
1
@AlexA. Hmm, aneh aku tidak pernah bisa menemukannya di musim panas ...
Downgoat
1
Karena pi panjangnya tak terhingga dan Anda ingin menjadi agresif-pasif?
Arcturus
8
Saya pergi ke Costco hari ini - mereka tutup.
Trauma Digital

Jawaban:

4

CJam, 41 byte

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

Uji di sini. Atau gunakan tautan ini untuk mematikan hasil etpengujian yang lebih mudah.

Penjelasan

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.
Martin Ender
sumber
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'

Tidak Terkumpul:

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"

Terima kasih untuk -2 byte @ edc65

nderscore
sumber
Bisa jadi Date()bukannyanew Date
edc65
'Pi '+['Day','Minute','Second'].find((x,i)=>................
wizzwizz4
@ wizzwizz4 ini tidak akan berfungsi. Jika ini bukan waktu Pi, ia kembali"Pi undefined"
nderscore
Apakah cek untuk undefined lebih pendek dari 6 karakter?
wizzwizz4
1
@nderscore Ini lebih sedikit byte untuk dikatakan nderscoredaripada underscore.
wizzwizz4
5

Ruby, 125 124 karakter

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]

Sayangnya, si pintar lebih %i[month day hour min sec].map{|x|Time.new.send x}panjang.

Kuncinya di sini adalah penggunaan each_consuntuk menghindari pengulangan (lihat beberapa baris terakhir dari penjelasan di bawah).

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)
Gagang pintu
sumber
Anda bisa menghemat beberapa karakter dengan menarik 'Pi'seperti yang Anda lakukan t, bukan?
Cole Johnson
@Cole Dan apa yang akan Anda lakukan dengan elemen kedua?
nicael
Mengapa tidak Pi Hour apa pun. Ada apa dengan 2 di sore hari, besok?
Tuan Lister
@ColeJohnson Tidak, [(p='Pi ')+Day','',p+'Minute',p+'Second']lebih lama.
Gagang Pintu
4

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

Saya mencoba

Tidak Terkumpul:

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]

Golf:

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'
Zizouz212
sumber
4
from datetime import*;n=datetime.now()lebih pendek. Juga, tidak ada gunanya mengindeks ke dalam array ketika Anda mencetak string konstan.
Gagang Pintu
@Doorknob 冰 Itu benar :)
Zizouz212
Bahkan lebih pendek: paste.ee/p/ebcSh
R
Dibuat dengan bertukar if / elses dengan [else, if] [statement].
Rɪᴋᴇʀ
1
Angka terakhir salah (2:13 bukannya 3:14), dan persyaratan jam 12 tidak terpenuhi. (Tampaknya berlaku untuk beberapa jawaban lain juga) Anda juga bisa mendapatkannya lebih pendek dengan mengindeks hasil time.localtime(); turun ke 148-15 byte (tanpa perbaikan 12 jam). Masalah 12 jam sangat disayangkan; tanpanya Anda dapat dengan mudah menurunkannya menjadi 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')(dan 118-15 byte pada Python 3, dengan mengonversikannya menjadi byte dan menggunakan find, yang membuat semuanya lebih sederhana)
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

Cukup mudah - cukup periksa tanggal untuk setiap kasus.

Penjelasan:

  • D=Ð)gdapatkan tanggal saat ini ( Ð), simpan dalam variabel Ddan dapatkan bulan ( g). Mengapa menyimpannya dalam variabel, jika sudah satu huruf? Karena sejak itu Anda dapat berpakaian dengan bagian mana pun dari tanggal Da, di mana afungsinya, tahun kembali, bulan, tanggal, dll. Tetapi jika tidak, Anda harus melakukannya Ð a, lihat ruangnya.

  • ¥3adalah ==3, memeriksa apakah bulannya bulan Maret.

  • ©adalah &&, yaitu "dan".
  • Df adalah hari dalam sebulan.
  • E adalah 14
  • ?...:... - set khas operator ternary
  • Dd %Cpengingat membagi jam ( Dd) dengan 12 ( C)
  • Dc adalah menit
  • Db detik

Cobalah online!


Untuk meniru Hari 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

Untuk meniru 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

Untuk meniru Pi Kedua :

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
nicael
sumber
3

TI-BASIC, 124 byte

Terima kasih kepada FlagAsSpam untuk mencukur beberapa 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
Conor O'Brien
sumber
Apakah Anda menggunakan i(unit imajiner) dan e(konstanta Euler) sebagai pintasan? Jika tidak, itu juga bisa menghemat beberapa byte.
Addison Crump
@ FlagAsSpam Saya berpikir untuk menggunakan itu, tapi saya tidak yakin apakah itu penting.
Conor O'Brien
@ FlagAsSpam Apakah mereka valid atau tidak di sini, esebenarnya adalah dua byte!
lirtosiast
@ ThomasKwa Oh, benar.
Conor O'Brien
@FlagAsSpam Tidak lagi tidak valid. ^ _ ^
Conor O'Brien
3

Perl, 80 - 15 = 65 byte

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

Ambil 2, parsing representasi string localtime. Saat ini, ini terlihat seperti ini:

Sun Jan  3 15:14:15 2016

Posisi string yang cocok digunakan untuk menentukan Waktu Pi yang benar.


Perl, 100 byte

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

localtimemengembalikan bulan nol diindeks, maka kebutuhan untuk 3-/3/.

primo
sumber
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'))

Persyaratan 12 jam sangat disayangkan, karena ini akan menjadi 118-15 = 103 byte tanpa itu:

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'))
Aleksi Torhamo
sumber
2

AppleScript, 202 190 187 183 181 byte

Hei, ini tidak terlalu buruk.

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

Saya benar-benar menemukan penggunaan untuk pemanggilan metode AppleScript. Sosok pergi. Nggak. Ternyata itu I'm an idiot. Pengaturan variabel lebih pendek.

(bagi mereka yang bertanya-tanya, perintah tanggal saat ini mengembalikan tipe tanggal dengan konten "Saturday, January 2, 2016 at 2:46:01 PM"atau sejenisnya)

Addison Crump
sumber
1

PHP, 85 - 15 = 70 byte

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

Trik utama yang digunakan di sini adalah Ymdhi_is format tanggal , pada saat penulisan, date('Ymdhi_is')kembali 201501030258_5828.

  • md, hidan isadalah nilai-nilai yang akan digantikan oleh 0314jika itu Pi-sesuatu. Perhatikan bahwa semua string itu akan selalu diganti dengan string panjang 4-karakter.
  • Mereka dimasukkan ke dalam urutan tertentu karena strposakan berhenti mencari pada saat pertama kali jarum, jadi kami menempatkannya dalam urutan prioritas.
  • Pemisah antara hidan isdiperlukan karena kami tidak ingin strposmencocokkan nilai yang akan tumpang tindih keduanya (berkat primo untuk menyimpan byte di sini).
  • Jarumnya adalah 0314karena 314salah mencocokkan 10:31:42 dengan Pi-Second.

Bagian Y adalah yang paling sulit. Kita perlu awalan untuk mengimbangi kemunculan pertama dari Pi-sesuatu, yang memungkinkan kita untuk membedakan strposnilai-nilai pengembalian antara false(tidak ditemukan, Pi-tidak ada) dan 0(ditemukan pada indeks 0, hari-Pi).

Dan kami ingin awalan ini panjangnya 4 atau 5 karakter, karena kami berencana untuk membagi strposnilai pengembalian dengan 4.

Y adalah 4 karakter, tetapi:

  • itu akan menjadi 5 karakter lama suatu hari, dan ini akan merusak program (pikirkan sekitar tahun 10314): dokumentasi PHP mengatakan bahwa Yakan diganti dengan 4 digit, tetapi itu tidak benar .
  • jika Anda kembali ke masa lalu, pada tahun 314, itu akan merusak program.

Karena PHP tidak ada di tahun 314, dan kemungkinan tidak akan ada lagi di tahun 10314, saya kira bug ini dapat diabaikan dengan aman.

Catatan yang 0314dapat tumpang tindih Ymdsejak:

  • Ymmd konfigurasi: tidak ada bulan ke-31.
  • YYmm konfigurasi: tidak ada bulan ke-14.
  • YYYm konfigurasi: ada kurang dari 40 bulan.

Juga, ada versi tanpa bug yang terkait dengan tahun ini, yaitu 86 - 15 = 71 byte :

<?=['No Pi Time','Pi Day','Pi Minute','Pi Second'][strpos(@date(D_mdhi_is),'0314')/4];
Benoit Esnard
sumber
Jawaban yang bagus Jika Anda menggunakan garis bawah dan bukannya titik, Anda dapat menjatuhkan tanda kutip Ymd_hi_is. Juga, saya tidak berpikir pemisah diperlukan antara mddan hi, karena 12 jam htidak pernah bisa menjadi 14, dan tidak pernah mulai dengan 3 atau 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(" "))
Zach Gates
sumber