День Пи, Пи Минута или Пи Секунда?


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 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"когда не время Pi.


Как всегда, стандартные лазейки запрещены. Это кратчайший код в байтах выигрывает!


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

2
Вы изменили его на обычный пирог. Это также неверно, потому что вы можете получать пирог от Costco в течение всего года.
Алекс А.

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'

Ungolfed:

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

Будет ли чек на 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 А что ты будешь делать со вторым элементом?
Ника

Почему Пи Час ничего? Что не так с 2 дня, завтра?
Мистер Листер

@ColeJohnson Нет, [(p='Pi ')+Day','',p+'Minute',p+'Second']больше.
Дверная ручка

4

Python 2, 219 186 183 байта (198-15)

Я старался

Ungolfed:

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]

Golfed:

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, что упрощает
задачу

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 секунды

Попробуйте онлайн!


Чтобы подражать 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

Чтобы подражать Пи Минуте :

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

Чтобы подражать Пи Второму :

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на самом деле это два байта!
lirtosiast

@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

Положение соответствующей строки используется для определения правильного времени 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

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

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. Установка переменной короче.

(для тех, кто интересуется, текущая команда date возвращает тип даты с содержимым "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совпадать со значением, которое перекрывало бы оба (благодаря primo за сохранение байтов здесь).
  • Игла 0314потому что314 будет неправильно соответствовать 10:31:42 как Пи-Второй.

Часть Y самая хитрая. Нам нужен префикс, чтобы компенсировать первое вхождение Pi-чего-то, что позволяет нам различать strposвозвращаемые значения междуfalse (not found, Pi-nothing) и0 (найдено с индексом 0, Pi-day).

И мы хотим, чтобы этот префикс был длиной 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.
primo

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(" "))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.