Habe ich schon zu Mittag gegessen?

15

Du liebst das Mittagessen. Sie sind jedoch auf Diät und möchten sicherstellen, dass Sie nicht versehentlich zweimal an einem Tag zu Mittag essen. Sie müssen also ein Programm erstellen, um sich zu vergewissern.

Eine Komplikation ist jedoch, dass Sie nach einem sehr seltsamen Zeitplan zu Mittag essen. Die Zeit, in der Sie zu Mittag essen, ist MONAT: TAG NACHMITTAG (Sie können UTC oder eine lokalisierte Zeitzone verwenden). Das ist richtig, wenn der Tag der 14. Juli ist , isst du um 19:14 Uhr zu Mittag .

Für Ihr Programm müssen Sie das aktuelle Datum und die aktuelle Uhrzeit verwenden (keine Eingabe vornehmen) und einen konsistenten Wahrheitswert ausgeben, wenn Sie an diesem Tag bereits zu Mittag gegessen haben (oder es ist jetzt Mittagszeit), oder einen konsistenten falschen Wert wenn du nicht hast.

Beispiele: (Laufzeit Programm => Ausgabe)

  • 4. Mai 11:35 => false (Sie werden um 17:04 Uhr zu Mittag essen)
  • 3. Juni 17:45 => false (Sie essen um 18:03 Uhr zu Mittag)
  • 28. Juli 20:30 => wahr (du hast um 19:28 zu Mittag gegessen)
  • 15. Dezember 15:25 => true (Sie haben um 12:15 Uhr zu Mittag gegessen)
  • 29. Februar 14:29 => wahr (es ist genau Mittagspause)
  • 12. Oktober 00:00 => false (Tag gerade erst begonnen)

Referenz:

Wie funktioniert eine 12-Stunden-Uhr?

Geokavel
quelle
Können wir nicht stattdessen UTC verwenden?
Mr. Xcoder
@ Mr.Xcoder Ja, eigentlich ist das ok. Ich werde es klären.
Geokavel
5
Wenn Sie nur zu einer bestimmten Tageszeit zu Mittag essen, wie könnten Sie es dann zweimal essen? = p
jpmc26
1
@MarkS. Zumindest in diesem Jahrhundert, sagen wir mal.
Geokavel
3
Essen nicht alle so zu Mittag? Bin es wirklich nur ich?
Caird Coinheringaahing

Antworten:

7

Schnelle 3 , 310 Bytes

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)])!)

Hör zu!

Dies druckt trueund false, um ehrlich zu sein bzw. um falsch zu sein.

HINWEIS : Dies funktioniert nur bis zum Jahr 9999 um 23:59:59 Uhr, da Strings zum Vergleichen der Daten verwendet werden.

Mr. Xcoder
quelle
2
Swifts Teilstring schmerzt mich immer, wenn ich> _ <
ansehe
3

05AB1E , 15 18 Bytes

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

Probieren Sie es online!

Erläuterung

ž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
quelle
Ich denke nicht, dass das funktioniert. Weil es jetzt
00:51
Nvm ist nur aufgefallen, dass ich nicht nachmittags nachschaue. Auf Kosten von 3 Bytes behoben.
Datboi
2

Oktave , 61 Bytes

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

Probieren Sie es online!

Erläuterung:

Zuerst die Funktionen:

  • now()Gibt die Uhrzeit in einem Dezimalformat zurück. Die Klammern sind optional.
  • datestr konvertiert eine Dezimalzahl in eine Zeichenfolge in dem Format, das im zweiten Argument angegeben ist
  • str2num wandelt einen String in eine Zahl um
  • diff Nimmt den Unterschied zwischen zwei Zahlen

Nervenzusammenbruch:

Wir nehmen das aus der Mitte:

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

datestr(now,'mmddHHMM'): Zuerst nehmen wir die aktuelle Zeit nowals Eingabe datestrund legen das Format fest mmddHHMM. Die Buchstaben bedeuten: mm = month, dd = day, HH = hour, MM = minutesund AMgibt an, dass die Stunden auf ein 12-Stunden - Format sein sollten. Es sind keine Trennzeichen enthalten, um es so kurz wie möglich zu halten. Es gibt d = 07142117auf der Zeit , diese Erklärung zu schreiben. Ich werde xab sofort auf diesen Teil verweisen .

[(d=x)(1:4);d(5:8)]: Speichert die obige Zeichenfolge als d, erstellt dann ein Array mit zwei Elementen, den ersten vier Zeichen und den 5-9 Zeichen. Dies gibt :

ans =
0714
2122

Wo die Zahlen als Zeichenfolgen gespeichert werden, nicht Zahlen. Wir nennen das Ergebnis oben für yunten.

str2num(y)wandelt das Array von Zeichen in Zahlen um, wobei jede Zeile zu einer Zahl wird. Das gibt [714; 2122]. Wir nennen das Ergebnis für z.

diff(z)>1200Nimmt die Differenz zwischen den beiden Zahlen und prüft, ob die aktuelle Zeit 1200 höher als das aktuelle Datum ist. Dies macht AM / PM aus. Dies gibt uns das gewünschte Ergebnis.

Stewie Griffin
quelle
prüft dies, ob es tatsächlich PM ist?
michi7x7
Das tut es jetzt. :)
Stewie Griffin
Wenn "mmdd" "1201" und "HHMM" "1215" ist, sollte dies wahr sein, nicht wahr? Ich musste Mod 12 für den Monat verwenden, um das irgendwie zu erklären.
michi7x7
2

Pyth, 22 21 20 Bytes

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

-1 Byte dank @ Mr.Xcoder

Versuche dies!

alter Ansatz, 22 20 Bytes

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

Versuch es!

Erläuterung

<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
quelle
Würde nicht &g.d6+.d4 12g.d5.d7für 19 Bytes arbeiten? Ich bin mir nicht sicher und habe es noch nicht wirklich getestet, aber ...
Mr. Xcoder
&g.d6+12.d4g.d5.d7wäre eigentlich 18. Auch in der alten Herangehensweise glaube ich nicht, dass Sie die brauchen `, und das würde 18 Bytes lang werden. Ich weiß nicht, ich könnte mich irren.
Mr. Xcoder
@ Mr.Xcoder wenn du & verwendest dann müssen beide wahr sein zB in deinem Code 22:17 würde das nicht als nach 19:15 gelten, da die Minuten falsch sind. Ich kann einige der `` `entfernen, aber nicht alle. Danke, dass du mir ein Byte gespart hast.
Karl Kastor
Ok, ich wusste wirklich nicht, ob das richtig ist, ich lerne immer noch Pyth: P
Mr. Xcoder
Dann habe ich eine alternative Lösung gefunden g++720.d5*60.d4+*60.d6.d7, die aber leider länger ist (25 Bytes). Es könnte jedoch eine Quelle der Inspiration sein und ich dachte, ich sollte es erwähnen.
Mr. Xcoder
2

C #, 174 Bytes

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

Probieren Sie es online!

pritch90
quelle
Ich glaube nicht, dass Sie Stunden und Minuten hinzufügen können, Sie müssen sie einstellen.
Winter
1
Erstellen Sie eine anonyme Aktion ( ()=>...) Action<bool>, um Bytes zu speichern. Verwenden Sie diese DateTime.NowOption, um auf den Monat und den Tag zuzugreifen. Im Allgemeinen publicwird nicht benötigt und Programkann nur ein Buchstabe sein. Verwenden Sie using D=System.DateTime;, um Bytes zu speichern. Insgesamt schöne Idee, könnte aber viel Golf gespielt werden. Willkommen bei PPCG!
TheLethalCoder
@TheLethalCoder danke für den Rat! Dies war mein erster Versuch beim Codegolf, aber ich werde definitiv mehr versuchen!
pritch90
2

PHP und andere Sprachen mit diesen allgemeinen Funktionen: ca. 28 bis 29 Bytes:

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

oder alternativ

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

Beide werden gedruckt.

evtl. mit ?1:0je nach darstellung. Möglicherweise werden die Bytes gekürzt, wenn eine Sprache verwendet wird, die implizites Echo oder kein abschließendes ';' hat.

Warum bekommt man die Werte in Variablen und den Rest, wenn er nicht benötigt wird? :)
date()Lässt alles als Literale, die nicht definiert sind, und 7 May 2017 17:22:43übergibt den Ausdruck beispielsweise 1722 - 1200 >= 507an eval (). Byte gespeichert, indem es in das Äquivalent geändert wird 1722 - 1199 > 507.

Wer sagt, dass eval tot ist? ;-)

Stilez
quelle
2

Java, 81 Bytes

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

Probieren Sie es online!

Ungolfed:

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()());
    }
})
Winter
quelle
1
Geht das mit Dezember richtig? Ich habe lange nicht mehr mit Java gearbeitet, aber es sieht so aus, als würde der 1. Dezember auf 24:01 Uhr anstatt kurz nach Mittag gesendet.
Mark S.
Vergessen Sie nicht, Ihren Import von java.util.Datein die Byteanzahl aufzunehmen.
Jakob
2

Haskell, 135 129 Bytes

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

Dieses Auspacken ist ziemlich ärgerlich, vielleicht ist die Handhabung von Saiten besser geeignet

// edit: Pattern Guards schützen 5 Bytes

michi7x7
quelle
2

Mathematica, 65 64 62 Bytes

3 Programme

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[][[#]]&]

Dies sind jeweils ein Byte weniger, wenn sie in Mathematica als ein einzelnes Byte gezählt werden.

Erklärungen

  1. Date[]gibt eine Liste im Formular zurück {y,m,d,h,m,s}. So Date[][[4;;5]]sind die Stunden und Minuten der aktuellen Zeit.
  2. p=Date[][[#]]&;erstellt peine Funktion, die die gewünschten Indizes aufnimmt und uns diese Teile des Datums gibt.
  3. {60,1}.#&ist eine anonyme Funktion, die das Skalarprodukt von {60,1}und die Eingabe verwendet, um eine Möglichkeit zum Vergleichen von Zeiten zu erhalten. Es ist ein Byte kürzer als TimeObject.
  4. p@2entspricht p[2]der Zahl des Monats.
  5. +{12+p@2~Mod~12,0}Fügt {12,0}den Monat und das Datum hinzu, wenn wir nicht im Dezember sind, und fügt etwas {0,0}anderes hinzu . (Danke, michi7x7!)
  6. >= ist der Vergleichsoperator, aber wir können {Stunden, Minuten} nicht mit {bereinigtem Monat, Datum} eingabeweise vergleichen ...
  7. /@ordnet {60,1}.#&beide Seiten der Ungleichung in Klammern zu, damit wir die Zeiten richtig vergleichen können.
  8. Bei den Programmen, die mit beginnen {60,1}.#&, stellen sie #die Eingabe für eine große anonyme Funktion dar und &kennzeichnen das Ende.
  9. @Date[] Wendet die große Funktion in ihrer Zeile (die Teile einer Liste extrahiert) auf die Datumsliste selbst an.
  10. [Date[][[#]]&] Wendet die große Funktion in ihrer Zeile auf eine andere anonyme Funktion an, die Teile der Datumsliste extrahiert.

Bonus

Abgesehen davon, wenn wir zwischen 1 Uhr morgens und 12:59 Uhr mittags aßen, konnten wir mit nur 25 Bytes sparen {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3).

Sie können all dies testen, indem Sie den Code in die Wolfram Cloud-Sandbox einfügen und auf Gear-> Evaluate Cell klicken oder Shift + Enter oder Numpad Enter drücken.

Mark S.
quelle
Ich glaube , dass Sie Ihr Bonus Note tatsächlich eine gültige Lösung ist - wie Ihre Domäne von gültigen Zeiten ist 13:01zu24:31
Taylor Scott
@TaylorScott Vielen Dank für die Code-Formatierung (obwohl die Einfärbung in einigen schwierigeren Fällen fehlzuschlagen scheint). Ich bin mir jedoch nicht sicher, ob ich Ihren Kommentar verstehe. Wenn am 19. Juli, wenn es 07:20 Uhr ist, lautet der "Bonus" -Code "Ja, Sie haben zu Mittag gegessen", obwohl es noch lange nicht 19:20 Uhr ist. Das OP hat Testfälle im AM, daher denke ich, dass dies ungültig macht. Was vermisse ich?
Mark S.
@Mark_S. Ich verstehe - aus irgendeinem Grund hatte ich gelesen, dass es 23.59 Uhr statt 12.59 Uhr ist - gibt es keine präzise Möglichkeit, dem Bonuscode 12 Stunden hinzuzufügen?
Taylor Scott
1
@TaylorScott Nun, wir möchten für die meisten Monate 12 zur vollen Stunde addieren, sodass wir für Januar bis November Date[]den Bonus durch ersetzen (Date[]+{0,12,0,0,0,0})können (es gibt möglicherweise eine Möglichkeit, Golf zu spielen, die jedoch 12UnitVector[6,2]länger ist). Das Problem ist, dass wir an Daten wie dem 3. Dezember um 12:03 Uhr zu Mittag essen und nicht um 24:03 Uhr. Daher müssen wir 12 hinzufügen, außer im Dezember . Dies erfordert, dass wir entweder 1. einen Blick in das Datum werfen, um zu sehen, ob wir im Dezember sind oder nicht (wie in meinen Antworten), oder 2. eine Funktion schreiben, die untersucht, ob wir nachträglich auf 24: XX gegangen sind, was wäre länger.
Mark S.
1
@MarkS. 12 + Mod [# [[2]], 12]?
michi7x7
1

JavaScript (ES6), 75 Byte

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>

Diese langen Funktionsnamen ...

Neil
quelle
1

Python 3 , 104 Bytes

from datetime import*
n=datetime.now();print(n>=n.replace(hour=[0,n.month+12][n.month<12],minute=n.day))

Probieren Sie es online!

Alle datetime-Tests. Ich habe den 29. Februar durch den 28. Februar ersetzt, weil das ungültige Datum nicht funktioniert hat.

Wrymug
quelle
1

R , 92 Bytes

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

Probieren Sie es 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
quelle
1

q, 31 Bytes

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

Beispiel:

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

Dolmetscher gibt es hier

Alte Version

{x:.z.p;x>"T"$":"sv"0"^2$/:string 12 0+`mm`dd$\:x}`
Skeevey
quelle
Das 2$Pad dreht 6sich 6_eher zu als _6, so dass Sie möchten (-2)$, aber Sie können diese zusätzlichen 3 Zeichen auslöschen, indem Sie die Abkürzung für string as ($)... verwenden oder anstatt $ zum Auffüllen zu verwenden, "0" voranstellen und dann die letzten 2 nehmen Zeichen: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mm dd$\:x}für 49 Bytes
Streetster
gute Stelle. Das Original war ungültig. ich habe eine noch kürzere version hinzugefügt
skeevey
1

JavaScript, 75 Byte

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

Welches entspricht dem folgenden Code:

function didEat()
  const d = new Date()
  d.setHours(12 /* PM */ + d.getMonth() + 1)
  d.setMinutes(d.getDate())
  return new Date > d
}
didEat()
Jrop
quelle
Letzte tkann verwendet werden, während ändern
l4m2
t=new Date,t.setMinutes(t.getDate(t.setHours(13+t.getMonth(n=+t))))<n
14 m²,
1

Python 2.7, 130 Bytes

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

Probieren Sie es online aus

Hinweis: Möglicherweise liegt ein Problem mit dem Schild vor. Bitte entschuldigen Sie das, weil ich IST verfolge und es ziemlich verwirrend ist, weil es jetzt 02:28 Uhr hier ist. Korrigieren Sie das Zeichen, wenn Sie das Gefühl haben, dass es falsch ist.

Koishore Roy
quelle
1

Perl, 45 Zeichen

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

Wenn ich eine Methode angeben muss, beträgt sie 45 für sub c{...}. Wenn ich drucken muss say ()||0macht es 47. Ich werde das hinzufügen, wenn es eine Anforderung ist.

Byteschieber
quelle
Ich glaube, weil die ursprüngliche Frage angibt, you need to make a program to help you make suredass Snippets nicht zulässig sind - das heißt, eine der aufgeführten Ausgabemethoden wird allgemein als gültig angesehen
Taylor Scott
1
fairerweise werde ich dann ausgeben. Vielen Dank für die Bearbeitung, mir war das richtige Sprachkennzeichen nicht bekannt! Ich dachte, das wäre perl -eim Allgemeinen in Ordnung, aber andere haben Funktionen bereitgestellt, also habe ich sie in bearbeitet.
bytepusher
1

Excel, 52 50 49 Bytes

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

Eingabe ist diese Formel in einer beliebigen Zelle.
Ausgabe ist entweder TRUEoder FALSE.

Die in Excel integrierte Datumsverarbeitung hilft sehr.
Die TIMEFunktion gibt die Mittagspause des Tages als Zeitwert zurück, der bei einer Umrechnung in ein Datum verwendet wirdJan 0, 1900 . Wir vergleichen es mit NOW - TODAY, um die aktuelle Zeit mit einem Datumswert von 0oder zu erhalten Jan 0, 1900.

2 Byte dank Wernisch
gespeichert 1 Byte dank Adam gespeichert

Ingenieur Toast
quelle
Benötigen Sie die zusätzlichen Klammern JETZT () - HEUTE ()?
Wernisch
@Wernisch Nein, wie sich herausstellt. Ich hatte angenommen, dass es die Ungleichung vor der Subtraktion auswerten würde, aber ich habe es nicht überprüft. Vielen Dank.
Ingenieur Toast
Ich denke , dass Sie ein Byte speichern kann aus , indem now()-today()zumod(now(),1)
Adam
0

JavaScript, 62 Zeichen

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

Testcode unten:

Tomas Langkaas
quelle
0

Excel VBA, 55 Bytes

Anonyme VBE-Direktfensterfunktion, die keine Eingabe annimmt und einen Booleschen Wert ausgibt, der angibt, ob ich im VBE-Direktfenster zu Mittag gegessen habe

n=Now:?TimeValue(n)>TimeValue(Month(n)&":"&Day(n)&"PM")
Taylor Scott
quelle
0

Ruby , 64 + 7 = 71 Bytes

Benötigt das -rtimeFlag, da es aus irgendeinem Grund Time::parsewie die einzige Funktion ist, die es aus dem gesamten TimeModul benötigt.

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

Probieren Sie es online! (druckt auch die aktuelle Uhrzeit aus)

Wert Tinte
quelle
0

Julia 0.6.0 99 Bytes

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

Julia hat eine eingebaute Funktion zur Verwendung der Uhr / des Kalenders des Computers. Mein Computer läuft unter Ubuntu 16.04 und hat bereits eine 12-Stunden-Uhr. Daher kann ich nicht sagen, ob das, was ich getan habe, mit einer anderen Uhr auf einem anderen Computer funktioniert, scheint aber auf meinem Computer zu funktionieren.

Goysa
quelle
0

JavaScript ES6, 70 Bytes

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

Vielleicht nicht so richtig für einige Millisekunden ...

l4m2
quelle
0

Matlab, 241 Bytes

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

Erläuterung: Zuerst erhalte ich das Datum als Zeichenfolge. Dann isoliere ich den Monat und den Tag. Da das Problem besagt, dass es immer als PM interpretiert wird, schreibe ich automatisch false, wenn die Uhrzeit in AM ist. Wenn die aktuelle Zeit in PM ist, fahre ich fort und vergleiche einfach die Zahlen der Zeit.

Hinweis: Ich habe es hier aus Gründen der Lesbarkeit etwas anders formatiert.

a13a22
quelle