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

  • Автор темы Wowkawowkin
  • Обновлено
  • 23, Oct 2024
  • #1

В этом задании вам нужно будет определить, какой сейчас день числа Пи, минута Пи или секунда Пи.

Поскольку Pi иррационален, он хочет, чтобы ваш код был как можно короче.

Примеры

Ввод не предусмотрен, ваша программа должна использовать системное время. Я просто добавил это для ясности

 "No Pi Time" 

Что такое день Пи/минута/секунда

  • Pi Day/Minute/Second is when the month is March, and the date is the 14th
  • Pi Second is when the hour is 3, and the minute is 14
  • Pi Minute is when the minute is 3, and the second is 14
  • Pi Second следует отдать предпочтение вместо Pi Minute или Pi Day , and Pi Second should be preferred instead of Pi Minute .
  • Для этого задания вам следует использовать 12-часовое время (15:14 == 3:14). Дата/время, используемые для определения Pi Day should be based on системное время.

Подсчет очков и бонус

-15 байт Бонус: Если вы распечатаете 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> when it's not Pi time.


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

#код-гольф #код-гольф #дата #пи

Wowkawowkin


Рег
13 Aug, 2007

Тем
63

Постов
205

Баллов
540
  • 26, Oct 2024
  • #2

Javascript (ES6), 114 112 - 15 = 97 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 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(" "))
 

Негольфед:

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

Спасибо за -2 байта @edc65

 

HonHourefex52


Рег
25 Oct, 2024

Тем
74

Постов
184

Баллов
564
  • 26, Oct 2024
  • #3

Рубин, 125 124 символов

YYYm

Увы, чем умнее YYmm is longer.

Ключевым моментом здесь является использование Ymmd to avoid repetition (see the last few lines of the explanation below).

Ymd ||answer||

CJam, 41 байт

0314

Проверьте это здесь. Альтернативно используйте эту ссылку заглушить результат Y for easier testing.

Объяснение

strpos ||answer||

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

Я пытался

Негольфед:

0

Гольф:

false ||answer||

Япт, 78 – 15 = 63 байта

strpos

Довольно просто – просто проверяет дату для каждого случая.

Объяснение:

  • 314 get the current date ( 0314 ), сохраните его в переменной strpos and get the month ( is ). Зачем хранить его в переменной, если она и так однобуквенная? Потому что с тех пор вы можете одевать любую часть свидания с hi , where strpos это функция, возвращающая год, месяц, дату и т. д. Но в противном случае вам придется сделать 0314 , see the space.

  • is is hi , проверяем, март ли месяц.

  • md is 201501030258_5828 , то есть «и».
  • date('Ymdhi_is') is the day of the month.
  • Ymdhi_is is 14
  • <?=['No Pi Time','Pi Day','Pi Minute','Pi Second'][strpos(@date(Ymdhi_is),'0314')/4]; - typical sets of ternary operators
  • "Saturday, January 2, 2016 at 2:46:01 PM" the reminder of dividing the hour ( I'm an idiot ) на 12 ( 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 )
  • 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')) is the minutes
  • 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')) are seconds

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


Чтобы подражать Дню Пи:

3-/3/

Чтобы эмулировать минуту Пи:

localtime

Для эмуляции Пи-Секунды:

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

ТИ-БЕЙСИК, 124 байта

Спасибо FlagAsSpam за сокращение нескольких байтов.

Sun Jan 3 15:14:15 2016 ||answer||

Perl, 80–15 = 65 байт

localtime

Возьмем второй вариант: анализ строкового представления print'No 'x localtime!~/(ar | 15:|03:)14/,'Pi ',(Time,Day,Minute,Second)["@-"/4] . At present, this looks something like this:

"→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

Положение совпавшей строки используется для определения правильного времени Пи.


Перл, 100 байт

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

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 returns the months zero indexed, hence the need for 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 .

 

Sergey_churil


Рег
07 Apr, 2020

Тем
82

Постов
187

Баллов
617
  • 26, Oct 2024
  • #4

Python 3, 137–15 = 122 байта

Db

Требование 12 часов было неудачным, поскольку без него это было бы 118-15 = 103 байта:

Dc ||answer||

AppleScript, 202 190 187 183 181 байт

Эй, в конце концов, это не так уж и плохо.

C

Я действительно нашел применение вызову метода AppleScript. Пойди разберись. Неа. Просто оказывается, что Dd . Setting a variable is shorter.

(для тех, кому интересно, команда текущей даты возвращает тип даты с содержимым Dd %C or the like)

 

Nemoder


Рег
07 Oct, 2007

Тем
95

Постов
206

Баллов
691
  • 26, Oct 2024
  • #5

PHP, 85–15 = 70 байт

?...:...

Основной трюк, используемый здесь, заключается в E формат даты, на момент написания статьи, Df returns && .

  • © , ==3 и ¥3 are the values who will be replaced by Ð a если это Пи-что-то. Обратите внимание, что все эти строки всегда будут заменены строкой длиной из 4 символов.
  • Они расположены именно в этом порядке, поскольку a will stop searching at the first occurrence of the needle, so we put them in the order of priority.
  • Разделитель между Da and g необходимо, потому что мы не хотим D to match a value that would overlap both (thanks to первородный для сохранения байтов здесь).
  • Игла Ð because D=Ð)g будет ошибочно соответствовать 10:31:42 как Пи-секунде.

Часть Y самая сложная. Нам нужен префикс для, чтобы компенсировать первое появление Пи-что-то, что позволит нам различать D=Ð)g ¥3©Df ¥E?"Pi Day":Dd %C¥3©Dc ¥E?`Pi M©e`:Dc ¥3©Db ¥E?`Pi SeÖ:No Pi Te 's return values between 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' (не найдено, Пи-ничего) и 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] (found at index 0, Pi-day).

И мы хотим, чтобы этот префикс имел длину 4 или 5 символов, поскольку мы планируем разделить 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. 's return value by 4.

Y имеет длину 4 символа, но:

  • Когда-нибудь оно будет состоять из 5 символов, и это сломает программу (вспомните год 10314): документация PHP говорит, что et will be replaced by 4 digits, but it's not true.
  • если вы вернетесь во времени, в 314 год, это сломает программу.

Поскольку PHP не существовал в 314 году и, скорее всего, не будет существовать в 10314 году, я думаю, эти ошибки можно смело игнорировать.

Обратите внимание, что et[3E]#" Pi Day Pi Minute Pi Second "N/= can overlap 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) с:

  • each_cons configuration: there's no 31st month.
  • %i[month day hour min sec].map{|x|Time.new.send x} configuration: there's no 14th month.
  • 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] configuration: there are less than 40 months.

Также есть версия без ошибок, связанных с годом, то есть 86–15 = 71 байт:

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" ||answer||

Питон 3, 179 байт

x=>['Pi Day','Pi Minute','Pi Second'].find((x,i)=>[/ar 14/,/(03|15):14:/,/03:14/][i].test(Date()))||'No Pi Time'
 

Oleghups


Рег
08 Nov, 2019

Тем
79

Постов
220

Баллов
625
Тем
403,760
Комментарии
400,028
Опыт
2,418,908