Ai-je déjeuné?


15

Tu aimes le déjeuner. Cependant, vous suivez un régime et vous voulez vous assurer de ne pas manger accidentellement le déjeuner deux fois en une journée. Vous devez donc créer un programme pour vous en assurer.

Cependant, une complication est que vous déjeunez selon un horaire très étrange. L'heure à laquelle vous déjeunez est MOIS: JOUR PM (vous pouvez utiliser UTC ou le fuseau horaire localisé). C'est vrai, si le jour est le 14 juillet , vous déjeunez à 19h14 .

Pour votre programme, vous devez utiliser la date et l'heure actuelles (ne pas saisir d'entrée) et générer une valeur véridique cohérente si vous avez déjà déjeuné pour la journée (ou c'est l'heure du déjeuner maintenant), ou une valeur falsifiée cohérente si ce n'est pas le cas.

Exemples: (Heure d'exécution du programme => sortie)

  • 4 mai 11h35 => faux (vous déjeunerez à 17h04)
  • 3 juin 17h45 => faux (vous déjeunerez à 18h03)
  • 28 juillet 20h30 => vrai (vous avez déjeuné à 19h28)
  • 15 décembre 15h25 => vrai (vous avez déjeuné à 12h15)
  • 29 février 14h29 => vrai (c'est exactement l'heure du déjeuner)
  • 12 octobre 00h00 => false (la journée vient de commencer)

Référence:

Comment fonctionne une horloge de 12 heures


Ne pouvons-nous pas utiliser UTC à la place?
M. Xcoder

@ Mr.Xcoder Oui, en fait, ça va. Je vais clarifier.
geokavel

5
Si vous ne déjeunez qu'à un moment précis de la journée, comment pourriez-vous le manger deux fois? = p
jpmc26

1
@Des marques. Disons au moins ce siècle.
geokavel

3
Tout le monde ne mange-t-il pas comme ça? Est-ce vraiment seulement moi?
caird coinheringaahing

Réponses:


7

Swift 3 , 310 octets

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

Vérifiez-le!

Cela imprime trueet false, pour la vérité et la fausse respectivement.

Remarque : cela ne fonctionne que jusqu'à l'année 9999, à 23:59:59, car il utilise des chaînes pour comparer les dates.


2
La sous-chaîne des martinets me fait toujours mal de regarder> _ <: P
Downgoat

3

05AB1E , 15 18 octets

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

Essayez-le en ligne!

Explication

ž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?

Je ne pense pas que cela fonctionne. Parce qu'il est 12:51 UTC en ce moment, et qu'il
sort

Nvm vient de réaliser que je vérifiais contre am not pm. Fixé au coût de 3 octets.
Datboi

2

Octave , 61 octets

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

Essayez-le en ligne!

Explication:

D'abord les fonctions:

  • now()renvoie l'heure au format décimal. Les parenthèses sont facultatives.
  • datestr convertit un nombre décimal en une chaîne au format donné dans son deuxième argument
  • str2num convertit une chaîne en nombre
  • diff prend la différence entre deux nombres

Panne:

Nous prenons cela du milieu:

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

datestr(now,'mmddHHMM'): Nous prenons d'abord l'heure actuelle nowcomme entrée datestret spécifions le format mmddHHMM. Les lettres signifient: mm = month, dd = day, HH = hour, MM = minuteset AMprécise que les heures devraient être sur un format de 12 heures. Aucun séparateur n'est inclus, pour le garder aussi court que possible. Il sort d = 07142117au moment de la rédaction de cette explication. Je ferai référence à cette partie à xpartir de maintenant.

[(d=x)(1:4);d(5:8)]: Stocke la chaîne ci-dessus, dpuis crée un tableau avec deux éléments, les quatre premiers caractères, puis les 5-9 caractères. Cela donne :

ans =
0714
2122

Où les nombres sont stockés sous forme de chaînes, pas de nombres. Nous appellerons le résultat ci-dessus pour yci-dessous.

str2num(y)convertit le tableau de caractères en nombres, où chaque ligne se transforme en un seul nombre. Cela donne [714; 2122]. Nous appellerons le résultat pour z.

diff(z)>1200prend la différence entre les deux nombres et vérifie si l'heure actuelle est supérieure de 1200 à la date actuelle. Cela représente AM / PM. Cela nous donne le résultat souhaité.


est-ce que cela vérifie si c'est réellement PM?
michi7x7

C'est le cas maintenant. :)
Stewie Griffin

Si "mmdd" est "1201" et "HHMM" est "1215", cela devrait être vrai, non? J'ai dû utiliser le mod 12 sur le mois pour expliquer cela en quelque sorte.
michi7x7

2

Pyth, 22 21 20 octets

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

-1 octet grâce à @ Mr.Xcoder

Essaye ça!

ancienne approche, 22 20 octets

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

Essayez!

explication

<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 ?

Ne &g.d6+.d4 12g.d5.d7fonctionnerait pas pour 19 octets? Je ne suis pas sûr et je ne l'ai pas encore vraiment testé mais ...
M. Xcoder

&g.d6+12.d4g.d5.d7serait 18 en fait. De plus, dans l'ancienne approche, je ne pense pas que vous en ayez besoin `, et cela deviendrait 18 octets de long. Je ne sais pas, je peux me tromper.
M. Xcoder

@ Mr.Xcoder si vous utilisez & alors les deux doivent être vrais, par exemple dans votre code 22:17 ne compterait pas comme après 19:15, car les minutes sont fausses. Je peux supprimer certains des `` '', mais pas tous. Merci de m'avoir sauvé un octet.
KarlKastor

Ok, je ne savais vraiment pas si c'était correct, j'apprends toujours Pyth: P
M. Xcoder

Ensuite, j'ai trouvé une solution alternative g++720.d5*60.d4+*60.d6.d7, mais malheureusement plus longue (25 octets). Cependant, cela pourrait être une source d'inspiration et j'ai pensé que je devrais le mentionner.
M. Xcoder

2

C #, 174 octets

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

Essayez-le en ligne!


Je ne pense pas que vous puissiez ajouter des heures et des minutes, vous devez les régler.
Hiver

1
Créez une action anonyme ( ()=>...) Action<bool>pour enregistrer les octets. À utiliser DateTime.Nowlors de l'accès au mois et au jour. En général, il publicn'est pas nécessaire et Programpeut être composé d'une seule lettre. Utilisez using D=System.DateTime;pour économiser des octets. Globalement, bonne idée, mais pourrait être beaucoup joué. Bienvenue chez PPCG!
TheLethalCoder

@TheLethalCoder merci pour les conseils! C'était mon premier essai au code golf mais j'essaierai certainement plus!
pritch90

2

PHP et autres langages avec ces fonctions communes: environ 28 à 29 octets:

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

Ou bien

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

qui imprimeront tous les deux.

éventuellement en ?1:0fonction de la représentation. Peut-être que les octets sont coupés si un langage est utilisé qui a un écho implicite, ou pas de ';' final.

Pourquoi voudrait-on obtenir les valeurs dans des variables et tout le reste, quand ce n'est pas nécessaire :)
date()laisse quoi que ce soit comme des littéraux qui ne sont pas définis, donc par exemple, 7 May 2017 17:22:43passe l'expression 1722 - 1200 >= 507à eval (). Octet enregistré en le changeant en équivalent 1722 - 1199 > 507.

Qui a dit qu'eval était mort? ;-)


2

Java, 81 octets

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

Essayez-le en ligne!

Non golfé:

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()());
    }
})

1
Est-ce que cela gère correctement décembre? Je n'ai pas travaillé avec Java depuis longtemps, mais il semble que cela pourrait envoyer le 1er décembre à 24h01 au lieu de juste après midi.
Mark

N'oubliez pas d'inclure votre importation java.util.Datedans le nombre d'octets.
Jakob

2

Haskell, 135 129 octets

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

ce déballage est assez ennuyeux, peut-être que la manipulation des cordes est mieux adaptée

// edit: les gardes de motif sont en sécurité 5 octets


2

Mathematica, 65 64 62 octets

3 programmes

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

Ce sont chacun un octet de moins s'ils comptent comme un seul octet dans Mathematica.

Explications

  1. Date[]renvoie une liste dans le formulaire {y,m,d,h,m,s}. Il en va de même pour Date[][[4;;5]]les heures et les minutes de l'heure actuelle.
  2. p=Date[][[#]]&;fait pune fonction qui prend les indices que nous voulons et nous donne ces parties de la date.
  3. {60,1}.#&est une fonction anonyme qui prend le produit scalaire {60,1}et l'entrée pour obtenir un moyen de comparer les temps. C'est un octet plus court que TimeObject.
  4. p@2est équivalent à p[2], le numéro du mois.
  5. +{12+p@2~Mod~12,0}ajoute {12,0}au mois et à la date où nous ne sommes pas en décembre, et ajoute le {0,0}contraire. (Merci, michi7x7!)
  6. >= est l'opérateur de comparaison, mais nous ne pouvons pas comparer {heures, minutes} à {mois, date} ajusté en entrée ...
  7. /@correspond {60,1}.#&aux deux côtés de l'inégalité entre parenthèses, afin que nous puissions comparer les temps correctement.
  8. Pour les programmes qui commencent par {60,1}.#&, ils utilisent #pour représenter l'entrée d'une grande fonction anonyme et &pour signifier la fin.
  9. @Date[] Applique la grande fonction de sa ligne (qui extrait des parties d'une liste) à la liste de dates elle-même.
  10. [Date[][[#]]&] Applique la grande fonction de sa ligne à une autre fonction anonyme, qui extrait des parties de la liste de dates.

Prime

Soit dit en passant, si nous déjeunions entre 1 h et 12 h 59, nous pourrions économiser 25 octets avec seulement {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3) .

Vous pouvez tester tout cela en collant le code dans le sandbox Wolfram Cloud et en cliquant sur Gear-> Evaluer la cellule ou en appuyant sur Maj + Entrée ou Entrée du pavé numérique.


Je crois que votre note de bonus est en fait une solution valable - comme votre domaine des temps valides est 13:01à24:31
Taylor Scott

@TaylorScott Merci pour la mise en forme du code (bien que la colorisation semble échouer dans certains cas plus délicats). Je ne suis pas sûr de comprendre votre commentaire, cependant. Si le 19 juillet, il est 7 h 20, alors le code «bonus» dirait «oui, vous avez déjeuné» même si c'est loin de 19 h 20. L'OP a des cas de test dans le matin, donc je pense que cela le rend invalide. Qu'est-ce que je rate?
Mark S.20

@Des marques. Je vois - pour une raison quelconque, j'avais lu que c'était à 23 h 59 plutôt qu'à 12 h 59 - n'y a-t-il pas un moyen concis d'ajouter 12 heures au code bonus?
Taylor Scott

1
@TaylorScott Eh bien, nous voulons ajouter 12 heures à la plupart des mois, donc de janvier à novembre, nous pourrions remplacer Date[]le bonus par (Date[]+{0,12,0,0,0,0})(il peut y avoir un moyen de jouer au golf, mais 12UnitVector[6,2]c'est plus long). Le problème est qu'à des dates comme le 3 décembre, nous déjeunons à 12h03 et non à 24h03, nous devons donc en ajouter 12 sauf en décembre . Cela nous oblige à soit 1. jeter un œil à l'intérieur de la date pour voir si nous sommes en décembre ou non (comme dans mes réponses), soit 2. écrire une fonction qui examine si nous sommes allés à 24: XX après coup, ce qui serait plus long.
Mark S.

1
@Des marques. 12 + Mod [# [[2]], 12]?
michi7x7

1

JavaScript (ES6), 75 octets

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>

Ces longs noms de fonction ...



1

R , 92 octets

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

Essayez-le en ligne!

                                   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

1

q, 31 octets

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

Exemple:

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

L'interprète est disponible ici

Ancienne version

{x:.z.p;x>"T"$":"sv"0"^2$/:string 12 0+`mm`dd$\:x}`

Le 2$pad se transformera 6en 6_plutôt que _6, donc vous le voudriez (-2)$, mais vous pouvez annuler ces 3 caractères supplémentaires en utilisant le raccourci pour string as ($)... ou au lieu d'utiliser $ pour pad, ajoutez "0", puis prenez les 2 derniers caractères: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mm dd$\:x}pour 49 octets
streetster

bon endroit. l'original n'était pas valide. j'ai ajouté une version encore plus courte
skeevey

1

JavaScript, 75 octets

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

Ce qui équivaut au code suivant:

function didEat()
  const d = new Date()
  d.setHours(12 /* PM */ + d.getMonth() + 1)
  d.setMinutes(d.getDate())
  return new Date > d
}
didEat()

le dernier tpeut être utilisé pendant la modification
l4m2

t=new Date,t.setMinutes(t.getDate(t.setHours(13+t.getMonth(n=+t))))<n
l4m2

1

Python 2.7, 130 octets

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

Essayez-le en ligne

Remarque: il peut y avoir un problème avec le panneau. Veuillez excuser cela parce que je suis IST et c'est assez déroutant car il est 2 h 28 ici maintenant. Corrigez le signe si vous pensez qu'il est faux.


1

Perl, 45 caractères

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

Si je dois fournir une méthode, ce sera 45 pour sub c{...}. Si je dois imprimer, say ()||0il suffit de 47. J'ajouterai cela si c'est une exigence.


Je crois que parce que la question d'origine spécifie you need to make a program to help you make sureque les extraits ne sont pas autorisés - cela dit que l'une ou l'autre de vos méthodes de sortie répertoriées est généralement considérée comme valide
Taylor Scott

1
assez juste, je fournirai alors la sortie. Merci d'avoir édité, je n'étais pas au courant de la balise de langue appropriée! Je pensais que perl -ec'était généralement bien, mais d'autres ont fourni des fonctions, alors je l'ai modifié.
bytepusher

1

Excel, 52 50 49 octets

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

L'entrée est cette formule dans n'importe quelle cellule.
La sortie est soitTRUE ou FALSE.

La gestion des dates intégrée d'Excel aide beaucoup.
La TIMEfonction renvoie l'heure du déjeuner du jour sous la forme d'une valeur d'heure qui, si elle était convertie en date, serait utilisée Jan 0, 1900. Nous le comparons à NOW - TODAYdonc nous obtenons l'heure actuelle avec une valeur de date de 0ouJan 0, 1900 .

Enregistré 2 octets grâce à Wernisch
Enregistré 1 octet grâce à Adam


Avez-vous besoin des accolades supplémentaires autour de MAINTENANT () - AUJOURD'HUI ()?
Wernisch

@Wernisch Non, comme il s'avère. J'avais supposé qu'il évaluerait l'inégalité avant la soustraction mais je ne l'ai pas vérifiée. Merci.
Engineer Toast

Je pense que vous pouvez enregistrer un octet en passant de now()-today()àmod(now(),1)
Adam

0

JavaScript, 62 caractères

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

Code de test ci-dessous:


0

Excel VBA, 55 octets

Fonction de fenêtre immédiate VBE anonyme qui ne prend aucune entrée et génère une valeur booléenne indiquant si j'ai déjeuné dans la fenêtre immédiate VBE

n=Now:?TimeValue(n)>TimeValue(Month(n)&":"&Day(n)&"PM")

0

Rubis , 64 + 7 = 71 octets

Nécessite l' -rtimeindicateur parce que pour une raison quelconque, Time::parsec'est comme, la seule fonction l'exige de l'ensemble du Timemodule.

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

Essayez-le en ligne! (il imprime également l'heure actuelle)


0

Julia 0.6.0 99 octets

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

Julia a intégré une fonction pour utiliser l'horloge / le calendrier de l'ordinateur. Mon ordinateur fonctionne sur Ubuntu 16.04 et déjà avec une horloge de 12 heures, donc je ne peux pas dire si ce que j'ai fait fonctionne avec une autre machine utilisant une horloge différente, mais semble fonctionner sur ma machine.


0

JavaScript ES6, 70 octets

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

Peut-être pas à droite sur quelques millisecondes ...


0

Matlab, 241 octets

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

Explication: Tout d'abord, j'obtiens la date sous forme de chaîne. Ensuite, j'isole le mois et le jour. Étant donné que le problème indique qu'il est toujours interprété comme PM, j'écris automatiquement false si l'heure est en AM. Si l'heure actuelle est en PM, je continue et je compare simplement les chiffres de l'heure.

Remarque: Je l'ai formaté légèrement différemment ici pour plus de lisibilité.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.