¿Ya he almorzado?

15

Te encanta el almuerzo. Sin embargo, usted está a dieta y quiere asegurarse de no almorzar accidentalmente dos veces en un día. Por lo tanto, debe hacer un programa que lo ayude a asegurarse.

Sin embargo, una complicación es que almuerzas en un horario muy extraño. La hora a la que almuerza es MES: DÍA PM (puede usar UTC o zona horaria localizada). Así es, si el día es el 14 de julio , almuerzas a las 7:14 PM .

Para su programa, debe usar la fecha y hora actuales (no tome datos) y generar un valor de verdad constante si ya ha almorzado durante el día (o es la hora del almuerzo ahora), o un valor de falsedad constante si no lo has hecho

Ejemplos: (Tiempo que ejecuta el programa => salida)

  • 4 de mayo 11:35 a.m. => falso (almorzará a las 5:04 p.m.)
  • 3 de junio 5:45 PM => falso (almorzará a las 6:03 PM)
  • 28 de julio 8:30 PM => verdadero (almorzaste a las 7:28 PM)
  • 15 de diciembre 3:25 PM => verdadero (almorzaste a las 12:15 PM)
  • 29 de febrero 2:29 PM => verdadero (es exactamente la hora del almuerzo)
  • 12 de octubre 12:00 AM => falso (día recién comenzado)

Referencia:

Cómo funciona un reloj de 12 horas

geokavel
fuente
¿No podemos usar UTC en su lugar?
Sr. Xcoder
@ Mr.Xcoder Sí, en realidad está bien. Lo aclararé.
geokavel
55
Si almuerza solo a una hora específica del día, ¿cómo podría comerlo dos veces? = p
jpmc26
1
@Marcas. Al menos este siglo, digamos.
geokavel
3
¿No todos almorzan así? ¿Realmente soy solo yo?
caird coinheringaahing

Respuestas:

7

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

¡Echale un vistazo!

Esto imprime truey false, para la verdad y la falsedad, respectivamente.

NOTA : Esto solo funciona hasta el año 9999, a las 11:59:59 p.m., ya que utiliza cadenas para comparar las fechas.

Sr. Xcoder
fuente
2
La subcadena rápida siempre me duele mirar> _ <: P
Downgoat
3

05AB1E , 15 18 bytes

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

Pruébalo en línea!

Explicación

ž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
fuente
No creo que esto funcione. Porque son las 12:51 AM UTC en este momento y está
produciendo
Nvm acaba de darse cuenta de que estaba comprobando contra am no pm. Corregido a un costo de 3 bytes.
Datboi
2

Octava , 61 bytes

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

Pruébalo en línea!

Explicación:

Primero las funciones:

  • now()Devuelve la hora en formato decimal. Los paréntesis son opcionales.
  • datestr convierte un número decimal en una cadena en el formato dado en su segundo argumento
  • str2num convierte una cadena en un número
  • diff toma la diferencia entre dos números

Descompostura:

Tomamos esto del medio:

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

datestr(now,'mmddHHMM'): Primero tomamos la hora actual nowcomo entrada datestry especifica el formato mmddHHMM. Las letras significan: mm = month, dd = day, HH = hour, MM = minutesy AMespecifica que las horas deben estar en un formato de 12 horas. No se incluyen separadores, para que sea lo más corto posible. Se emite d = 07142117en el momento de escribir esta explicación. Me referiré a esa parte a partir xde ahora.

[(d=x)(1:4);d(5:8)]: Almacena la cadena de arriba, como d, luego crea una matriz con dos elementos, los primeros cuatro caracteres, luego los 5-9 caracteres. Esto da :

ans =
0714
2122

Donde los números se almacenan como cadenas, no números. Llamaremos al resultado anterior por ydebajo.

str2num(y)convierte la matriz de caracteres en números, donde cada fila se convierte en un número. Esto da [714; 2122]. Llamaremos al resultado para z.

diff(z)>1200toma la diferencia entre los dos números y comprueba si la hora actual es 1200 más alta que la fecha actual. Esto representa AM / PM. Esto nos da el resultado deseado.

Stewie Griffin
fuente
¿Esto verifica si en realidad es PM?
michi7x7
Lo hace ahora :)
Stewie Griffin
Si "mmdd" es "1201" y "HHMM" es "1215", esto debería ser verdadero, ¿no? Tuve que usar mod 12 en el mes para dar cuenta de eso de alguna manera.
michi7x7
2

Pyth, 22 21 20 bytes

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

-1 byte gracias a @ Mr.Xcoder

¡Prueba esto!

enfoque antiguo, 22 20 bytes

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

¡Intentalo!

explicación

<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
fuente
¿No &g.d6+.d4 12g.d5.d7funcionaría para 19 bytes? No estoy seguro y todavía no lo he probado, pero ...
Sr. Xcoder
&g.d6+12.d4g.d5.d7Sería 18 en realidad. Además, en el enfoque anterior, no creo que necesite el `, y eso tendría 18 bytes de longitud. No sé, podría estar equivocado.
Sr. Xcoder
@ Mr.Xcoder si usa & ambos tienen que ser verdaderos, por ejemplo, en su código 22:17 no contaría como después de las 19:15, porque los minutos son falsos. Puedo eliminar algunos de los `` ', pero no todos. Gracias por salvarme un byte.
KarlKastor
Ok, realmente no sabía si eso era correcto, todavía estoy aprendiendo Pyth: P
Mr. Xcoder
Entonces, he encontrado una solución alternativa g++720.d5*60.d4+*60.d6.d7, pero desafortunadamente es más larga (25 bytes). Sin embargo, podría ser una fuente de inspiración y pensé que debería mencionarlo.
Sr. 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));}}

Pruébalo en línea!

pritch90
fuente
No creo que pueda agregar horas y minutos, debe configurarlos.
Invierno
1
Cree una acción anónima ( ()=>...) Action<bool>para guardar bytes. Úselo DateTime.Nowal acceder al mes y al día. En general publicno es necesario y Programpuede ser solo una letra. Úselo using D=System.DateTime;para guardar bytes. En general, es una buena idea, pero podría jugar mucho golf. Bienvenido a PPCG!
TheLethalCoder
@TheLethalCoder gracias por el consejo! Esta fue mi primera vez en Code Golf, ¡pero definitivamente intentaré más!
pritch90
2

PHP y otros lenguajes con estas funciones comunes: aproximadamente 28 a 29 bytes:

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

o alternativamente

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

los cuales se imprimirán.

posiblemente con ?1:0dependiendo de la representación. Posiblemente los bytes se corten si se usa un lenguaje que tiene eco implícito, o no final ';'.

¿Por qué uno obtiene los valores en variables y todo lo demás, cuando no es necesario :)
date()deja algo como literales que no están definidos, por ejemplo, 7 May 2017 17:22:43pasa la expresión 1722 - 1200 >= 507a eval (). Byte guardado cambiándolo al equivalente 1722 - 1199 > 507.

¿Quién dice que eval está muerto? ;-)

Stilez
fuente
2

Java, 81 bytes

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

Pruébalo en línea!

Sin 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()());
    }
})
Invierno
fuente
1
¿Esto maneja diciembre correctamente? No he trabajado con Java en mucho tiempo, pero parece que podría enviar del 1 de diciembre al 24:01 en lugar de justo después del mediodía.
Mark S.
No olvide incluir su importación de java.util.Dateen el recuento de bytes.
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

este desembalaje es bastante molesto, tal vez el manejo de la cadena sea más adecuado

// edit: guardias de patrones seguros 5 bytes

michi7x7
fuente
2

Mathematica, 65 64 62 bytes

3 programas

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

Estos son cada byte menos si cuentan como un solo byte en Mathematica.

Explicaciones

  1. Date[]devuelve una lista en el formulario {y,m,d,h,m,s}. Entonces Date[][[4;;5]] son las horas y minutos de la hora actual.
  2. p=Date[][[#]]&; hace p una función que toma los índices que queremos y nos da esas partes de la fecha.
  3. {60,1}.#&es una función anónima que toma el producto punto {60,1}y la entrada para obtener una forma de comparar tiempos. Es un byte más corto queTimeObject .
  4. p@2es equivalente a p[2], el número del mes.
  5. +{12+p@2~Mod~12,0}agrega {12,0}al mes y la fecha cuando no estamos en diciembre, y agrega lo {0,0}contrario. (¡Gracias, michi7x7!)
  6. >= es el operador de comparación, pero no podemos comparar {horas, minutos} con {mes ajustado, fecha} de entrada ...
  7. /@asigna {60,1}.#&a ambos lados de la desigualdad entre paréntesis, por lo que podemos comparar los tiempos correctamente.
  8. Para los programas que comienzan con {60,1}.#&, utilizan #para representar la entrada a una gran función anónima, y& para indicar el final.
  9. @Date[] Aplica la función grande en su línea (que extrae partes de una lista) a la lista de fechas en sí.
  10. [Date[][[#]]&] Aplica la función grande en su línea a otra función anónima, una que extrae partes de la lista de fechas.

Prima

Por otro lado, si almorzamos entre la 1AM y las 12:59 PM, entonces podríamos ahorrar 25 bytes con solo {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3).

Puede probar todo esto pegando el código en el sandbox de Wolfram Cloud y haciendo clic en Gear-> Evaluar celda o presionando Shift + Enter o Numpad Enter.

Marcas.
fuente
Creo que la nota de bono es en realidad una solución válida - como su dominio de horas de validez es 13:01de24:31
Taylor de Scott
@TaylorScott Gracias por el formato del código (aunque la coloración parece fallar en algunos casos más complicados). Sin embargo, no estoy seguro de entender tu comentario. Si el 19 de julio es a las 7:20 a.m., el código de "bono" dirá "sí, ha almorzado" a pesar de que están lejos de las 7:20 p.m. El OP tiene casos de prueba en la mañana, así que creo que esto lo invalida. ¿Qué me estoy perdiendo?
Mark S.
@Marcas. Ya veo, por alguna razón, he leído que son las 11:59 p.m. en lugar de las 12:59, ¿no hay una forma concisa de agregar 12 horas al código de bonificación?
Taylor Scott
1
@TaylorScott Bueno, queremos agregar 12 a la hora durante la mayoría de los meses para que de enero a noviembre podamos reemplazar Date[]el bono con (Date[]+{0,12,0,0,0,0})(puede haber una forma de jugar al golf, pero 12UnitVector[6,2]es más largo). El problema es que en fechas como el 3 de diciembre, almorzamos a las 12:03, no a las 24:03, por lo que debemos agregar 12 excepto en diciembre . Esto nos obliga a: 1. mirar dentro de la fecha para ver si estamos en diciembre o no (como en mis respuestas), o 2. escribir una función que examine si pasamos a 24: XX después del hecho, que sería más.
Mark S.
1
@Marcas. 12 + Mod [# [[2]], 12]?
michi7x7
1

JavaScript (ES6), 75 bytes

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>

Esos nombres largos de funciones ...

Neil
fuente
1

R , 92 bytes

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

Pruébalo en línea!

                                   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
fuente
1

q, 31 bytes

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

Ejemplo:

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

Intérprete está disponible aquí.

Versión antigua

{x:.z.p;x>"T"$":"sv"0"^2$/:string 12 0+`mm`dd$\:x}`
skeevey
fuente
El 2$pad se convertirá 6en6_ lugar de _6, por lo que querrás (-2)$, pero puedes cancelar esos 3 caracteres adicionales usando la taquigrafía string como ($)... o en lugar de usar $ para el pad, antepone "0" y luego toma los últimos 2 caracteres: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mm dd$\:x}para 49 bytes
streetster
buen lugar. El original era inválido. agregué una versión aún más corta
skeevey
1

JavaScript, 75 bytes

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

Que es equivalente al siguiente código:

function didEat()
  const d = new Date()
  d.setHours(12 /* PM */ + d.getMonth() + 1)
  d.setMinutes(d.getDate())
  return new Date > d
}
didEat()
Jrop
fuente
El último tpuede usarse mientras se modifica
l4m2
t=new Date,t.setMinutes(t.getDate(t.setHours(13+t.getMonth(n=+t))))<n
l4m2
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]))

Pruébalo en línea

Nota: puede haber un problema con el letrero. Perdone eso porque sigo a IST y es bastante confuso porque son las 2:28 am aquí ahora. Corrija la señal si siente que está mal.

Koishore Roy
fuente
1

Perl, 45 caracteres

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

Si tengo que proporcionar un método, será 45 para sub c{...}. Si tengo que imprimir, say ()||0incluso hace 47. Agregaré eso si es un requisito.

bytepusher
fuente
Creo que debido a que la pregunta original especifica you need to make a program to help you make sureque los fragmentos no están permitidos; dicho eso, cualquiera de los métodos de salida enumerados generalmente se considera válido
Taylor Scott,
1
justo, proporcionaré resultados entonces. Gracias por editar, ¡no conocía la etiqueta de idioma adecuada! Estaba pensando perl -eera en general bien, pero otros han proporcionado funciones, por lo que he editado en.
bytepusher
1

Excel, 52 50 49 bytes

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

La entrada es esta fórmula en cualquier celda.
La salida es TRUEoFALSE .

El manejo de fechas incorporado de Excel ayuda mucho.
La TIMEfunción devuelve la hora del almuerzo del día como un valor de tiempo que, si se convierte en una fecha, se usaría Jan 0, 1900. Lo comparamos NOW - TODAYpara obtener la hora actual con un valor de fecha de 0o Jan 0, 1900.

Guardado 2 bytes gracias a Wernisch
Guardado 1 byte gracias a Adam

Tostadas de ingeniero
fuente
¿Necesita llaves adicionales alrededor de NOW () - TODAY ()?
Wernisch
@Wernisch No, como resulta. Supuse que evaluaría la desigualdad antes de la resta, pero no la verifiqué. Gracias.
Engineer Toast
Creo que puede guardar un byte cambiando de now()-today()amod(now(),1)
Adam
0

JavaScript, 62 caracteres

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

Código de prueba a continuación:

Tomás Langkaas
fuente
0

Excel VBA, 55 bytes

Función de ventana inmediata anónima de VBE que no toma entrada y genera un valor booleano que representa si he almorzado en la ventana inmediata de VBE

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

Ruby , 64 + 7 = 71 bytes

Requiere el -rtimeindicador porque, por alguna razón Time::parse, la única función lo requiere fuera del Timemódulo completo .

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

Pruébalo en línea! (también imprime la hora actual)

Tinta de valor
fuente
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 ha incorporado una función para usar el reloj / calendario de la computadora. Mi computadora se ejecuta en ubuntu 16.04 y ya tiene un reloj de 12 horas, por lo que no puedo decir si lo que hice funciona con otra máquina que usa un reloj diferente, pero parece que funciona en mi máquina.

Goysa
fuente
0

JavaScript ES6, 70 bytes

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

Tal vez no sea así en algunos milisegundos ...

l4m2
fuente
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

Explicación: Primero, obtengo la fecha como una cadena. Entonces, aíslo el mes y el día. Dado que el problema indica que siempre se interpreta como PM, entonces automáticamente escribo falso si la hora es en AM. Si la hora actual es en PM, entonces continúo y solo comparo los números de la hora.

Nota: Lo he formateado de forma ligeramente diferente aquí para facilitar la lectura.

a13a22
fuente