Jadłem już lunch?

15

Kochasz lunch. Jednak jesteś na diecie i chcesz się upewnić, że przypadkowo nie zjesz lunchu dwa razy w ciągu jednego dnia. Musisz więc stworzyć program, który pomoże ci się upewnić.

Jednak jedną z komplikacji jest to, że jesz lunch według bardzo dziwnego harmonogramu. Czas, w którym jesz lunch, to MIESIĄC: DZIEŃ PM (możesz użyć UTC lub zlokalizowanej strefy czasowej). Zgadza się, jeśli dzień jest 14 lipca , jesz lunch o 19:14 .

W swoim programie musisz użyć bieżącej daty i godziny (nie przyjmuj danych wejściowych) i podać spójną wartość zgodną z prawdą, jeśli zjadłeś już lunch na dany dzień (lub teraz jest czas na lunch), lub spójną wartość fałszowania jeśli nie.

Przykłady: (Czas uruchomienia programu => wyjście)

  • 4 maja 11:35 => fałsz (zjesz obiad o 17:04)
  • 3 czerwca 17:45 => fałsz (zjesz obiad o 18:03)
  • 28 lipca 20:30 => prawda (zjadłeś lunch o 19:28)
  • 15 grudnia 15:25 => prawda (zjadłeś lunch o 12:15)
  • 29 lutego 14:29 => true (dokładnie w porze lunchu)
  • 12 października 12:00 => false (dzień właśnie się rozpoczął)

Odniesienie:

Jak działa zegar 12-godzinny

geokavel
źródło
Czy nie możemy zamiast tego użyć UTC?
Pan Xcoder,
@ Mr.Xcoder Tak, właściwie to jest w porządku. Wyjaśnię.
geokavel
5
Jeśli jesz lunch tylko o określonej porze dnia, jak możesz zjeść go dwa razy? = p
jpmc26
1
@Znaki. Powiedzmy, że przynajmniej w tym wieku.
geokavel
3
Czy nie wszyscy tak jedzą lunch? Czy to naprawdę tylko ja?
caird coinheringaahing

Odpowiedzi:

7

Swift 3 , 310 bajtów

import Foundation;var n=String(describing:Date());var k=n.startIndex;print(Int(n[n.index(k,offsetBy:5)...n.index(k,offsetBy:6)])!*60+Int(n[n.index(k,offsetBy:8)...n.index(k,offsetBy:9)])!+720<=Int(n[n.index(k,offsetBy:11)...n.index(k,offsetBy:12)])!*60+Int(n[n.index(k,offsetBy:14)...n.index(k,offsetBy:15)])!)

Sprawdź to!

To drukuje true i odpowiednio falsedla prawdy i fałszu.

UWAGA : Działa to tylko do roku 9999, o 23:59:59, ponieważ używa ciągów do porównywania dat.

Pan Xcoder
źródło
2
Podciąganie jerzyków
3

05AB1E , 15 18 bajtów

žežb‚žf12+ža‚т*+`‹

Wypróbuj online!

Wyjaśnienie

žežb‚žf12+ža‚т*+`‹
že                 # Push current day
  žb               # Push current minute
    ‚              # Wrap to array
     žf12+         # Push current month and add 12 to it
       ža          # Push current hour
         ‚         # Wrap these two to array as well
          т*       # Multiply each element in the second array by 100
            +      # Add both arrays together
             `     # Flatten the resulting array to stack
              ‹    # Is the first item smaller than the second one?
Datboi
źródło
Nie sądzę, że to działa. Ponieważ jest teraz 12:51 UTC i
generuje
Nvm właśnie zdał sobie sprawę, że sprawdzam przeciwko nie jestem po południu. Naprawiono kosztem 3 bajtów.
Datboi
2

Oktawa , 61 bajtów

diff(str2num([(d=datestr(now,'mmddHHMM'))(1:4);d(5:8)]))>1200

Wypróbuj online!

Wyjaśnienie:

Najpierw funkcje:

  • now()zwraca czas w formacie dziesiętnym. Nawiasy są opcjonalne.
  • datestr konwertuje liczbę dziesiętną na ciąg znaków w formacie podanym w drugim argumencie
  • str2num konwertuje ciąg na liczbę
  • diff bierze różnicę między dwiema liczbami

Awaria:

Bierzemy to od środka:

diff(str2num([(d=datestr(now,'mmddHHMM'))(1:4);d(5:8)]))>1200

datestr(now,'mmddHHMM'): Najpierw bierzemy aktualny czas nowjako dane wejściowe datestri określamy format mmddHHMM. Litery oznaczają: mm = month, dd = day, HH = hour, MM = minutesi AMokreśla, że godziny powinny być w formacie 12-godzinnym. Nie dołączono żadnych separatorów, aby był jak najkrótszy. Wynika d = 07142117z czasu pisania tego wyjaśnienia. Odniosę się do tej części xod teraz.

[(d=x)(1:4);d(5:8)]: Przechowuje ciąg powyżej, ponieważ d, a następnie tworzy tablicę z dwoma elementami, pierwsze cztery znaki, a następnie 5-9 znaków. To daje :

ans =
0714
2122

Gdzie liczby są przechowywane jako ciągi znaków, a nie liczby. Wywołamy wynik powyżej dla yponiżej.

str2num(y)konwertuje tablicę znaków na liczby, przy czym każdy wiersz zamienia się w jedną liczbę. To daje [714; 2122]. Wywołamy wynik z.

diff(z)>1200bierze różnicę między dwiema liczbami i sprawdza, czy aktualny czas jest o 1200 wyższy niż bieżąca data. To dotyczy AM / PM. To daje nam pożądany rezultat.

Stewie Griffin
źródło
sprawdza to, czy rzeczywiście jest PM?
michi7x7
To robi teraz. :)
Stewie Griffin
Jeśli „mmdd” to „1201”, a „HHMM” to „1215”, to powinno być prawdziwe, prawda? Musiałem użyć mod 12 w tym miesiącu, aby jakoś to wyjaśnić.
michi7x7
2

Pyth, 22 21 20 bajtów

<0+g.d7.d5-.d6+12.d4

-1 bajt dzięki @ Mr.Xcoder

Spróbuj tego!

stare podejście, 22 20 bajtów

<+`+12.d4.d5+`.d6.d7

Spróbuj!

wyjaśnienie

<0+g.d7.d5-.d6+12.d4
              +12.d4   # Add 12 to the current month to make it PM
          -.d6         # subtract that from the current hour: negative it is too early,
                       # positive when it is past this hour, zero when its the same hour
   g.d7.d5             # Is the minute greater or equal than the day? True=1; False=0
  +                    # Add this to the hour result,
                       # so that 0 can turn positive if minutes are true
<0                     # Is the result larger than 0 ?
KarlKastor
źródło
Nie &g.d6+.d4 12g.d5.d7działałby dla 19 bajtów? Nie jestem pewien i jeszcze go nie przetestowałem, ale ...
Pan Xcoder
&g.d6+12.d4g.d5.d7miałby 18 lat. Poza tym w starym podejściu nie sądzę, żebyś go potrzebował `, a miałoby to 18 bajtów długości. Nie wiem, mogę się mylić.
Pan Xcoder,
@ Mr.Xcoder, jeśli używasz, a następnie oba muszą być prawdziwe, np. W kodzie 22:17 nie będą liczone jak po 19:15, ponieważ minuty są fałszywe. Mogę usunąć niektóre `` '', ale nie wszystkie. Dziękuję za uratowanie mi bajtu.
KarlKastor
Ok, naprawdę nie wiedziałem, czy to prawda, wciąż uczę się Pyth: P
Mr. Xcoder
Potem znalazłem alternatywne rozwiązanie g++720.d5*60.d4+*60.d6.d7 , ale niestety jest ono dłuższe (25 bajtów). Może to jednak być źródłem inspiracji i pomyślałem, że powinienem o tym wspomnieć.
Pan Xcoder,
2

C #, 174 bajtów

using System;public class Program{public static void Main(){Console.WriteLine(DateTime.Now>DateTime.Today.AddHours(DateTime.Today.Month+12).AddMinutes(DateTime.Today.Day));}}

Wypróbuj online!

pritch90
źródło
Nie sądzę, że możesz dodać godziny i minuty, musisz je ustawić.
Zima,
1
Utwórz anonimową akcję ( ()=>...), Action<bool>aby zapisać bajty. Użyj, DateTime.Nowgdy chcesz uzyskać dostęp do miesiąca i dnia. Zasadniczo publicnie jest potrzebny i Programmoże być tylko jedną literą. Służy using D=System.DateTime;do oszczędzania bajtów. Całkiem fajny pomysł, ale można w niego dużo grać. Witamy w PPCG!
TheLethalCoder
@TheLethalCoder dzięki za poradę! To był mój pierwszy występ w Code Golf, ale na pewno będę próbował więcej!
pritch90
2

PHP i inne języki z tymi powszechnymi funkcjami: około 28 do 29 bajtów:

echo eval(date('Gi-1199>md')); 

lub alternatywnie

<?=eval(date('Gi-1199>md'))?>

oba zostaną wydrukowane.

prawdopodobnie z ?1:0 zależnością od reprezentacji. Prawdopodobnie odcięte bajty, jeśli używany jest język, który ma ukryte echo lub nie ma końcowego „;”.

Dlaczego mielibyśmy przenosić wartości na zmienne i całą resztę, kiedy nie jest to potrzebne :)
date()pozostawia wszystko jako literały, które nie są zdefiniowane, więc na przykład 7 May 2017 17:22:43przekazuje wyrażenie 1722 - 1200 >= 507do eval (). Zapisano bajt, zmieniając go na ekwiwalent1722 - 1199 > 507 .

Kto powiedział, że eval nie żyje? ;-)

Stilez
źródło
2

Java, 81 bajtów

n->new Date().after(new Date(){{setHours(getMonth()+13);setMinutes(getDate());}})

Wypróbuj online!

Nie golfowany:

n -> new Date().after(new Date() { //new Date() returns current date
    { //instance initialization
        setHours(getMonth() + 13); //month + 12 hours for PM + 1 because months are 0 indexed
        setMinutes(getDate()());
    }
})
Zimowy
źródło
1
Czy to poprawnie obsługuje grudzień? Dawno nie pracowałem z Javą, ale wygląda na to, że może wysłać 1 grudnia do 24:01 zamiast tuż po południu.
Mark S.
Nie zapomnij dołączyć importu java.util.Datedo liczby bajtów.
Jakob,
2

Haskell, 135 129 bajtów

import Data.Time
x(ZonedTime(LocalTime d(TimeOfDay h m _))_)|(_,x,y)<-toGregorian d=return(mod x 12<h-12&&y<m)
y=getZonedTime>>=x

to rozpakowywanie jest dość denerwujące, być może lepiej nadaje się obsługa sznurka

// edycja: wzór chroni bezpieczne 5 bajtów

michi7x7
źródło
2

Mathematica, 65 64 62 bajtów

3 programy

p=Date[][[#]]&;{60,1}.#&/@(p[4;;5]>=p[2;;3]+{12+p@2~Mod~12,0})

{60,1}.#&/@(#[[4;;5]]>=#[[2;;3]]+{12+#[[2]]~Mod~12,0})&@Date[]

{60,1}.#&/@(#[4;;5]>=#[2;;3]+{12+#@2~Mod~12,0})&[Date[][[#]]&]

Każdy z nich jest o jeden bajt mniej, jeśli liczy się jako pojedynczy bajt w Mathematica.

Objaśnienia

  1. Date[]zwraca listę w formularzu {y,m,d,h,m,s}. Podobnie Date[][[4;;5]]godziny i minuty bieżącego czasu.
  2. p=Date[][[#]]&;wykonuje pfunkcję, która przyjmuje potrzebne nam wskaźniki i podaje te części daty.
  3. {60,1}.#&to anonimowa funkcja, która pobiera iloczyn iloczynu {60,1}i dane wejściowe, aby uzyskać sposób na porównanie czasów. Jest o jeden bajt krótszy niżTimeObject .
  4. p@2odpowiada p[2]liczbie miesiąca.
  5. +{12+p@2~Mod~12,0}dodaje {12,0}miesiąc i datę, kiedy nie jesteśmy w grudniu, i dodaje {0,0}inaczej. (Dzięki, michi7x7!)
  6. >= jest operatorem porównania, ale nie możemy porównać {godzin, minut} z {skorygowanym miesiącem, datą} wpisowo ...
  7. /@odwzorowuje {60,1}.#&obie strony nierówności w nawiasach, dzięki czemu możemy poprawnie porównywać czasy.
  8. W przypadku programów, które zaczynają się od {60,1}.#&, używają #do reprezentowania danych wejściowych do dużej anonimowej funkcji i &do oznaczania końca.
  9. @Date[] Stosuje dużą funkcję w swoim wierszu (który wyodrębnia części listy) do samej listy dat.
  10. [Date[][[#]]&] Stosuje dużą funkcję w swoim wierszu do innej funkcji anonimowej, która wyodrębnia części listy dat.

Premia

Nawiasem mówiąc, jeśli zjedlibyśmy lunch między 1:00 a 12:59, moglibyśmy zaoszczędzić 25 bajtów {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3).

Możesz to wszystko przetestować, wklejając kod do piaskownicy Wolfram Cloud i klikając Gear-> Oceń komórkę lub naciskając Shift + Enter lub Numpad Enter.

Znaki.
źródło
Wierzę, że premia notatka jest rzeczywiście ważne rozwiązanie - jako domena ważnych czasów jest 13:01do24:31
Taylor Scott
@TaylorScott Dzięki za formatowanie kodu (choć kolorowanie wydaje się nie udać w niektórych trudniejszych przypadkach). Nie jestem jednak pewien, czy rozumiem twój komentarz. Jeśli 19 lipca o 7:20 rano, kod „bonusowy” powie „tak, zjadłeś lunch”, mimo że jest jeszcze daleko od 19:20. OP ma przypadki testowe w AM, więc myślę, że to czyni to nieważnym. czego mi brakuje?
Mark S.,
@Znaki. Rozumiem - z jakiegoś powodu przeczytałem to jako o 23:59 zamiast o 12:59 - czy nie ma zwięzłego sposobu na dodanie 12 godzin do kodu bonusowego?
Taylor Scott,
1
@TaylorScott Cóż, chcemy dodać 12 do godziny przez większość miesięcy, więc w okresie od stycznia do listopada moglibyśmy zamienić Date[]premię na (Date[]+{0,12,0,0,0,0})(może być sposób na grę w golfa, ale 12UnitVector[6,2]jest dłuższy). Problem polega na tym, że w datach takich jak 3 grudnia jemy lunch o 12:03, a nie 24:03, więc musimy dodać 12, z wyjątkiem grudnia . Wymaga to od nas: 1. zerknięcia w terminie, aby zobaczyć, czy jesteśmy w grudniu, czy nie (jak w moich odpowiedziach), lub 2. napisania funkcji, która sprawdza, czy poszliśmy do 24: XX po fakcie, co byłoby dłużej.
Mark S.
1
@Znaki. 12 + Mod [# [[2]], 12]?
michi7x7
1

JavaScript (ES6), 75 bajtów

f=
(d=new Date)=>(d.getHours()-d.getMonth()-13||d.getMinutes()-d.getDate())>=0
<input type=button value=Lunch? onclick=o.textContent=f()><tt id=o>

Te długie nazwy funkcji ...

Neil
źródło
1

R , 92 bajty

library(lubridate)
d=Sys.Date()
cat(Sys.time()>ymd_hm(paste0(d,'-',month(d)+12,'-',day(d))))

Wypróbuj online!

                                   month(d)+12,'-',day(d)    # get month and day and paste into a string, adding 12 hours for pm
                      paste0(d,'-',                      )   # add current date to beginning
               ymd_hm(                                    )  # turn whole thing into a date-time object
cat(Sys.time()>                                            ) # compare with current date-time and print
BLT
źródło
1

q, 31 bajtów

x>12:+"T"$(-3!x:.z.P)5 6 13 8 9

Przykład:

q).z.P
2017.07.16D19:35:26.654099000
q)x>12:+"T"$(-3!x:.z.P)5 6 13 8 9
1b

Tłumacz jest dostępny tutaj

Stara wersja

{x:.z.p;x>"T"$":"sv"0"^2$/:string 12 0+`mm`dd$\:x}`
skeevey
źródło
2$Pad okaże 6się 6_zamiast _6, więc czego chcesz (-2)$, ale można zrezygnować z tych dodatkowych 3 znaki za pomocą skrótów na string jak ($)... albo zamiast używania $ pad, prepend „0”, a następnie podjąć ostatnią 2 znaki: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mm dd$\:x}za 49 bajtów
streetster
dobre miejsce. oryginał był nieprawidłowy. dodałem jeszcze krótszą wersję
skeevey
1

JavaScript, 75 bajtów

t=new Date,t.setHours(13+t.getMonth()),t.setMinutes(t.getDate()),new Date>t

Co jest równoważne z następującym kodem:

function didEat()
  const d = new Date()
  d.setHours(12 /* PM */ + d.getMonth() + 1)
  d.setMinutes(d.getDate())
  return new Date > d
}
didEat()
Jrop
źródło
ostatniego tmożna użyć podczas modyfikacji
l4m2
t=new Date,t.setMinutes(t.getDate(t.setHours(13+t.getMonth(n=+t))))<n
l4m2
1

Python 2.7, 130 bajtów

from datetime import*
a=str(datetime.now()).split()
print int(''.join(a[0].split('-')[1:]))+1200<int(''.join(a[1].split(':')[:2]))

Wypróbuj online

Uwaga: może występować problem ze znakiem. Przepraszam, ponieważ śledzę IST i jest to dość mylące, ponieważ teraz jest 2:28. Popraw znak, jeśli uważasz, że jest zły.

Koishore Roy
źródło
1

Perl, 45 znaków

sub c{@a=gmtime;$a[2]-12>$a[4]&&$a[1]>=$a[3]}

Jeśli będę musiał podać metodę, będzie to 45 sub c{...}. Jeśli muszę wydrukować, to say ()||0nawet 47. Dodam to, jeśli jest to wymagane.

bytepusher
źródło
Uważam, że ponieważ pierwotne pytanie określa, you need to make a program to help you make sureże fragmenty nie są dozwolone - co oznacza, że ​​jedna z wymienionych metod wyjściowych jest ogólnie uważana za prawidłową
Taylor Scott
1
sprawiedliwie, wtedy dostarczę dane wyjściowe. Dzięki za edycję, nie byłem świadomy właściwego tagu językowego! Myślałem, że perl -eogólnie jest ok, ale inni udostępnili funkcje, więc dokonałem edycji.
bytepusher
1

Excel, 52 50 49 bajtów

=TIME(MONTH(NOW())+12,DAY(NOW()),0)<=MOD(NOW(),1)

Dane wejściowe to ta formuła w dowolnej komórce.
Wyjście jest albo TRUEalbo FALSE.

Wbudowana obsługa Excela bardzo pomaga. Funkcja Zwraca dzień czas lunchu jako wartość czasu, który, w przypadku przekształcenia do daty, by wykorzystać . Porównujemy to z
TIMEJan 0, 1900NOW - TODAY aby uzyskać bieżący czas z wartością daty 0lub Jan 0, 1900.

Zaoszczędzono 2 bajty dzięki Wernisch
Zaoszczędzono 1 bajt dzięki Adamowi

Inżynier Toast
źródło
Czy potrzebujesz dodatkowych aparatów ortodontycznych wokół NOW () - DZISIAJ ()?
Wernisch
@Wernisch Nie, jak się okazuje. Zakładałem, że to oceni nierówność przed odjęciem, ale tego nie sprawdziłem. Dzięki.
Engineer Toast
Myślę, że możesz uratować bajt, zmieniając z now()-today()namod(now(),1)
Adam
0

JavaScript, 62 znaki

f=
_=>[,m,d,H,M]=(new Date).toISOString().split(/\D/),+m+12+d<=H+M

Kod testowy poniżej:

Tomas Langkaas
źródło
0

Excel VBA, 55 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która nie przyjmuje danych wejściowych i generuje wartość logiczną reprezentującą, czy zjadłem lunch w bezpośrednim oknie VBE

n=Now:?TimeValue(n)>TimeValue(Month(n)&":"&Day(n)&"PM")
Taylor Scott
źródło
0

Rubin , 64 + 7 = 71 bajtów

Wymaga -rtimeflagi, ponieważ z jakiegoś powodu Time::parsejest to jedyna funkcja wymagająca jej z całego Timemodułu.

p Time.parse("#{t=Time.now}"[/.+-(..)-(..) /]+[$1,$2]*?:+'pm')<t

Wypróbuj online! (drukuje również bieżący czas)

Wartość tuszu
źródło
0

Julia 0.6.0 99 bajtów

a=split(string(Dates.today()),"-");(Dates.hour(now())<parse(a[2]))&&Dates.minute(now())<parse(a[3])

Julia ma wbudowaną funkcję korzystania z zegara / kalendarza komputera. Mój komputer działa na Ubuntu 16.04 i ma już 12-godzinny zegar, więc nie mogę powiedzieć, czy to, co zrobiłem, działa na innym komputerze z innym zegarem, ale wydaje się, że działa na moim komputerze.

Goysa
źródło
0

JavaScript ES6, 70 bajtów

_=>(h=x=>new Date().toJSON().substr(x,5).replace(/\D/,0))(5)+12e3<h(11)

Może nie tak w ciągu kilku milisekund ...

l4m2
źródło
0

Matlab, 241 bajtów

dt=datestr(now,'mm/dd');
dt(2)
dt(4:5)
CrctLchTm=[' ' dt(2) ':' dt(4:5) ' PM']
CrntTm=datestr(now,'HH:MM PM')
CrntTm(7)=='A'
if ans==1
    Lch='false'
else
    CrctLchTm=str2num([CrctLchTm(2) CrctLchTm(4:5)])
    CrntTm=str2num([CrntTm(2) CrntTm(4:5)])
    CrntTm<CrctLchTm
    if ans==1
        Lch='false'
    else
        Lch='true'             
    end    
end

Objaśnienie: Po pierwsze, otrzymuję datę jako ciąg. Następnie izoluję miesiąc i dzień. Ponieważ problem mówi, że zawsze jest interpretowany jako PM, to automatycznie piszę fałsz, jeśli czas jest w AM. Jeśli aktualny czas jest w PM, to kontynuuję i po prostu porównuję liczby czasu.

Uwaga: sformatowałem go tutaj nieco inaczej dla czytelności.

a13a22
źródło