День пі, хвилина пі, або пі секунда?


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 це коли місяць березень, а дата - 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"коли не пі час.


Як завжди, стандартні лазівки заборонені. Це найкоротший код у перемозі у коді!


6
Я не думаю, що Costco дозволяє купувати математичну константу pi в будь-який час року.
Олексій А.

2
Ви змінили його на звичайний пиріг. Це також помилково, оскільки ви можете отримувати пиріг від Costco цілий рік.
Олексій А.

1
@AlexA. Хм, дивно, що я його ніколи не можу знайти влітку ...
Пуховик

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 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 А що ви будете робити з другим елементом?
nicael

Чому Пі-Час нічого. Що не так з другої половини дня, завтра?
Містер Лістер

@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] [заяву].
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 байт на Python 3, перетворившись на байти та використовуючи 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 є секундами

Спробуйте в Інтернеті!


Щоб наслідувати День Пі:

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 Я думав про їх використання, але не був впевнений, чи є це важливим.
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]

Візьміть 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

localtimeповертає місяці нульові, проіндексовані, звідси потреба в 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

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. Піди розберися. Ні. Просто так виходить 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якщо це Pi-щось. Зауважте, що всі ці рядки завжди будуть замінені 4-символьним довгим рядком.
  • З тих пір вони встановлюються в такому конкретному порядку strpos припинять пошук при першій появі голки, тому ми ставимо їх у порядку пріоритетності.
  • Роздільник між hiі isнеобхідний, оскільки ми не хочемо strposвідповідати значенню, яке перекривало б обоє (завдяки приму за збереження тут байтів).
  • Голка 0314тому, 314що неправильно відповідатиме 10:31:42 як Pi-Second.

Y частина найвибагливіша. Нам потрібен префікс, щоб компенсувати перше виникнення Pi-щось, що дозволяє нам розрізняти strposповернені значення між false(не знайдено, Pi-нічого) та 0(знайдені в індексі 0, Pi-день).

І ми хочемо, щоб цей префікс був довгим 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

Пітон 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(" "))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.