Pi Day, Pi Minute lub Pi Second?


16

W tym wyzwaniu musisz ustalić, czy chodzi o Dzień Pi, Pi Minute czy Pi Second.

Ponieważ Pi jest irracjonalny, chce, aby Twój kod był jak najkrótszy.

Przykłady

Brak danych wejściowych , twój program powinien wykorzystać czas systemowy. Właśnie dodałem to dla jasności

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>

Co to jest Dzień Pi / Minuta / Sekunda

  • Pi Day jest, gdy miesiącem jest marzec, a data jest 14
  • Pi Minute jest, gdy godzina jest 3, a minuta to 14
  • Pi Second jest, gdy minuta to 3, a druga to 14
  • Pi Daypowinien być preferowany zamiast Pi Minutelub Pi Secondi Pi Minutepowinien być preferowany zamiast Pi Second.
  • Do tego wyzwania należy użyć 12-godzinnego czasu (15:14 == 3:14). Data / czas użyte do ustalenia Pi Day/Minute/Secondpowinny być oparte na czasie systemowym .

Punktacja i bonus

-15 bajtów Bonus: Jeśli drukujesz, "No Pi Time"gdy nie jest czas Pi.


Jak zawsze, standardowe luki są niedozwolone. To jest najkrótszy kod w wygrywający bajty!


6
Nie sądzę, że Costco pozwala na zakup stałej matematycznej pi o dowolnej porze roku.
Alex A.

2
Zmieniłeś to na zwykłe ciasto. To również nieprawda, ponieważ możesz dostać ciasto od Costco przez cały rok.
Alex A.

1
@AlexA. Hmm, dziwne, że nigdy nie mogę tego znaleźć latem ...
Downgoat

1
Ponieważ pi jest nieskończenie długie i chcesz być pasywno-agresywny?
Arcturus

8
Byłem dzisiaj w Costco - były zamknięte.
Digital Trauma

Odpowiedzi:


4

CJam, 41 bajtów

et[3E]#"
Pi Day

Pi Minute
Pi Second
"N/=

Sprawdź to tutaj. Alternatywnie użyj tego linku, aby zsumować wynik etdla łatwiejszego testowania.

Wyjaśnienie

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 bajtów

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

Nie golfowany:

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"

Dzięki za -2 bajty @ edc65


Może być Date()zamiastnew Date
edc65

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

@ wizzwizz4 to nie zadziała. Jeśli nie czas na Pi, wraca"Pi undefined"
nderscore

Czy czek na niezdefiniowany byłby krótszy niż 6 znaków?
wizzwizz4

1
@nderscore To mniej bajtów do powiedzenia nderscoreniż underscore.
wizzwizz4

5

Rubin, 125 124 znaków

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]

Niestety, mądrzejszy %i[month day hour min sec].map{|x|Time.new.send x} jest dłuższy.

Kluczem tutaj jest użycie, each_consaby uniknąć powtórzeń (patrz kilka ostatnich wierszy wyjaśnienia poniżej).

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)

Możesz zaoszczędzić kilka znaków, wyciągając 'Pi'tak , jak to zrobiłeś t, nie?
Cole Johnson

@Cole A co zrobisz z drugim elementem?
nicael

Dlaczego Pi Hour nie jest niczym. Co jest nie tak z 2 po południu, jutro?
Pan Lister

@ColeJohnson Nie, [(p='Pi ')+Day','',p+'Minute',p+'Second']jest dłużej.
Klamka

4

Python 2, 219 186 183 Bajtów (198-15)

próbowałem

Nie golfowany:

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]

Gra w golfa:

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()jest krótszy. Ponadto indeksowanie do tablicy nie ma sensu, gdy drukujesz ciągi ciągłe.
Klamka

@Doorknob 冰 To prawda :)
Zizouz212

Krótszy nawet: paste.ee/p/ebcSh
R

Wykonane przez zamianę if / elses na [else, if] [instrukcja].
Rɪᴋᴇʀ

1
Te ostatnie numery są nieprawidłowe (2:13 zamiast 3:14), a wymóg 12-godzinnego zegara nie jest spełniony. (Wydaje się, że ma zastosowanie również do niektórych innych odpowiedzi). Możesz również skrócić to, indeksując wynik time.localtime(); sprowadza się do 148-15 bajtów (bez poprawki 12-godzinnej). 12-godzinna sprawa jest jednak niefortunna; bez tego można łatwo sprowadzić go do 129-15 bajtów: 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')(i 118-15 bajtów w Pythonie 3, konwertując na bajty i używając find, co ułatwia rzeczy)
Aleksi Torhamo

4

Japt, 78-15 = 63 bajty

D=Ð)g ¥3©Df ¥E?"Pi Day":Dd %C¥3©Dc ¥E?`Pi M©e`:Dc ¥3©Db ¥E?`Pi SeÖ:No Pi Te

Całkiem proste - wystarczy sprawdzić datę dla każdej sprawy.

Wyjaśnienie:

  • D=Ð)gpobierz aktualną datę ( Ð), zapisz ją w zmiennej Di uzyskaj month ( g). Po co przechowywać go w zmiennej, jeśli jest ona już jedną literą? Ponieważ od tego czasu możesz ubierać dowolną część daty Da, gdzie ajest funkcja, zwracanie roku, miesiąca, daty itp. Ale w przeciwnym razie musisz zrobić Ð a, zobaczyć przestrzeń.

  • ¥3jest ==3sprawdzenie, czy miesiącem jest marzec.

  • ©to &&znaczy „i”.
  • Df jest dniem miesiąca.
  • E ma 14 lat
  • ?...:... - typowe zestawy operatorów trójskładnikowych
  • Dd %Cprzypomnienie o podzieleniu godziny ( Dd) przez 12 ( C)
  • Dc to minuty
  • Db są sekundy

Wypróbuj online!


Aby emulować Dzień 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

Aby naśladować 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

Aby emulować 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 bajty

Dzięki FlagAsSpam za golenie kilku bajtów.

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

Czy używasz i(jednostki urojonej) i e(stałej Eulera) jako skrótów? Jeśli nie, może to również zaoszczędzić trochę bajtów.
Addison Crump

@ FlagAsSpam Myślałem o ich użyciu, ale nie byłem pewien, czy to się liczy.
Conor O'Brien

@ FlagAsSpam Niezależnie od tego, czy są one ważne tutaj, w erzeczywistości mają dwa bajty!
lirtosiast

@ThomasKwa Och, racja.
Conor O'Brien

@FlagAsSpam To nie jest już nieprawidłowe. ^ _ ^
Conor O'Brien

3

Perl, 80-15 = 65 bajtów

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

Weź 2, analizując reprezentację ciągu localtime. Obecnie wygląda to mniej więcej tak:

Sun Jan  3 15:14:15 2016

Pozycja dopasowanego ciągu służy do ustalenia prawidłowego czasu pi.


Perl, 100 bajtów

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

localtime zwraca indeksowane zero miesięcy, stąd potrzeba 3-/3/ .


2

Python 3, 137-15 = 122 bajtów

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

Wymaganie 12 godzin było niefortunne, ponieważ bez niego byłoby to 118-15 = 103 bajtów:

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 bajtów

Hej, to wcale nie jest takie złe.

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

Naprawdę znalazłem zastosowanie do wywoływania metod AppleScript. Domyśl.Nie. Po prostu się okazuje I'm an idiot. Ustawienie zmiennej jest krótsze.

(dla tych, którzy zastanawiają się, polecenie bieżącej daty zwraca typ daty z zawartością "Saturday, January 2, 2016 at 2:46:01 PM"itp.)


1

PHP, 85-15 = 70 bajtów

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

Główną sztuczką jest tutaj Ymdhi_is format daty , w momencie pisania date('Ymdhi_is')zwraca 201501030258_5828.

  • md, hiI issą wartościami, które zostaną zastąpione przez0314 jeśli jest to Pi-coś. Zauważ, że wszystkie te ciągi zawsze będą zastępowane ciągiem o długości 4 znaków.
  • Są one ułożone w tej określonej kolejności, ponieważ strposprzestaną szukać przy pierwszym wystąpieniu igły, więc ustawiamy je w kolejności pierwszeństwa.
  • Separator pomiędzy hii isjest konieczny, ponieważ nie chcemy strposdopasowywać wartości, która nakładałaby się na obie (dzięki primo za zapisanie bajtów tutaj).
  • Igła jest, 0314ponieważ 314błędnie pasuje 10:31:42 jako Pi-Second.

Część Y jest najtrudniejsza. Potrzebujemy prefiksu, aby zrównoważyć pierwsze wystąpienie Pi-coś, co pozwoli nam rozróżnić strposzwracane wartości między false(nie znaleziono, Pi-nic) a 0(znaleziony przy indeksie 0, Pi-dzień).

Chcemy, aby ten prefiks miał długość 4 lub 5 znaków, ponieważ planujemy podzielić strposwartość zwracaną przez 4.

Y ma 4 znaki, ale:

  • kiedyś będzie miał 5 znaków, a to zepsuje program (pomyśl o roku 10314): dokumentacja PHP mówi, że Yzostaną zastąpione 4 cyframi, ale to nieprawda .
  • jeśli wrócisz w czasie, w roku 314, przerwie to program.

Ponieważ PHP nie istniał w roku 314 i prawdopodobnie już nie będzie istniał w roku 10314, myślę, że te błędy można bezpiecznie zignorować.

Pamiętaj, że 0314mogą się one nakładać, Ymdponieważ:

  • Ymmd konfiguracja: nie ma 31. miesiąca.
  • YYmm konfiguracja: nie ma 14 miesiąca.
  • YYYm konfiguracja: jest mniej niż 40 miesięcy.

Jest też wersja bez błędów związanych z rokiem, która wynosi 86-15 = 71 bajtów :

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

Świetna odpowiedź. Jeśli używasz podkreślników zamiast kropek, możesz upuścić cytaty Ymd_hi_is. Nie sądzę też, aby separator był konieczny między mdi hi, ponieważ 12-godzinna godzina hnigdy nie może być 14 i nigdy nie zaczyna się od 3 lub 4.
primo

0

Python 3, 179 bajtów

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(" "))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.