Já almocei?


15

Você ama o almoço. No entanto, você está em uma dieta e deseja garantir que não almoce acidentalmente duas vezes em um dia. Então você precisa criar um programa para ajudá-lo a ter certeza.

No entanto, uma complicação é que você almoça em um horário muito estranho. A hora em que você almoça é MÊS: DIA PM (você pode usar o UTC ou o fuso horário localizado). É isso mesmo, se o dia for 14 de julho , você almoça às 19:14 .

Para o seu programa, você precisa usar a data e a hora atuais (não aceite entrada) e gerar um valor de verdade consistente se você já almoçou durante o dia (ou agora é a hora do almoço) ou um valor consistente de falsidade se você não tiver.

Exemplos: (Tempo em que você executa o programa => saída)

  • 4 de maio às 11:35 AM => false (você almoçará às 17:04)
  • 3 de junho 17:45 => false (você almoçará às 18:03)
  • 28 de julho 20:30 => true (você almoçou às 19:28)
  • 15 de dezembro 15:25 => true (você almoçou às 12:15)
  • 29 de fevereiro 14:29 => verdadeiro (é exatamente a hora do almoço)
  • 12 de outubro às 12:00 => false (dia apenas iniciado)

Referência:

Como funciona um relógio de 12 horas


Não podemos usar o UTC?
Mr. Xcoder

@ Mr.Xcoder Sim, na verdade está tudo bem. Eu vou esclarecer.
geokavel

5
Se você almoça apenas em uma hora específica do dia, como você pode almoçar duas vezes? = p
jpmc26

1
@MarkS. Pelo menos neste século, digamos.
geokavel

3
Todo mundo não almoça assim? É realmente só eu?
caird coinheringaahing

Respostas:


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

Confira!

Isso imprime truee false, por verdade e falsidade, respectivamente.

NOTA : Isso funciona somente até o ano 9999, às 23:59:59, porque ele usa Strings para comparar as datas.


2
Swifts substringing sempre me dói olhar para> _ <: P
Downgoat

3

05AB1E , 15 18 bytes

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

Experimente online!

Explicação

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

Eu não acho que isso funciona. Porque são 12:51 UTC agora e está saindo 1.
geokavel

Nvm só percebi que eu estava verificando contra não sou pm. Corrigido ao custo de 3 bytes.
Datboi 31/07

2

Oitava , 61 bytes

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

Experimente online!

Explicação:

Primeiro as funções:

  • now()retorna a hora em um formato decimal. Os parênteses são opcionais.
  • datestr converte um número decimal em uma sequência no formato fornecido em seu segundo argumento
  • str2num converte uma string em um número
  • diff leva a diferença entre dois números

Demolir:

Tomamos isso do meio:

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

datestr(now,'mmddHHMM'): Primeiro tomamos o tempo atual nowcomo entrada datestre especifica o formato mmddHHMM. As letras significam: mm = month, dd = day, HH = hour, MM = minutese AMespecifica que as horas deve estar em um formato de 12 horas. Nenhum separador está incluído, para mantê-lo o mais curto possível. Ele é produzido d = 07142117no momento em que escrevemos essa explicação. Vou me referir a essa parte a partir xde agora.

[(d=x)(1:4);d(5:8)]: Armazena a sequência acima, pois dcria uma matriz com dois elementos, os quatro primeiros caracteres e os 5-9 caracteres. Isso fornece :

ans =
0714
2122

Onde os números são armazenados como seqüências de caracteres, não números. Vamos chamar o resultado acima para yabaixo.

str2num(y)converte a matriz de caracteres em números, onde cada linha se transforma em um número. Isso dá [714; 2122]. Vamos chamar o resultado para z.

diff(z)>1200pega a diferença entre os dois números e verifica se a hora atual é 1200 maior que a data atual. Isso é responsável por AM / PM. Isso nos dá o resultado desejado.


isso verifica se é realmente PM?
michi7x7

Faz agora. :)
Stewie Griffin

Se "mmdd" for "1201" e "HHMM" for "1215", isso deve ser verdadeiro, não é? Eu tive que usar o mod 12 no mês para explicar isso de alguma forma.
Mk7x7

2

Pitão, 22 21 20 bytes

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

-1 byte graças a @ Mr.Xcoder

Tente isso!

abordagem antiga, 22 20 bytes

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

Tente!

explicação

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

Não &g.d6+.d4 12g.d5.d7funcionaria para 19 bytes? Não tenho a certeza e não têm realmente testado ainda, mas ...
O Sr. Xcoder

&g.d6+12.d4g.d5.d7seria 18 na verdade. Além disso, na abordagem antiga, não acho que você precise do` , e isso tornaria 18 bytes de comprimento. Eu não sei, posso estar errado.
Mr. Xcoder

@ Mr.Xcoder se você usar e, em seguida, ambos tiverem que ser verdadeiros, por exemplo, no seu código 22:17 não contaria depois das 19:15, porque os minutos são falsos. Posso remover alguns dos `` ``, mas não todos. Obrigado por me salvar um byte.
22417 Karl -astor

Ok, eu realmente não sabia se isso era correto, eu ainda estou aprendendo Pyth: P
O Sr. Xcoder

Encontrei uma solução alternativa g++720.d5*60.d4+*60.d6.d7, mas infelizmente isso é mais longo (25 bytes). No entanto, pode ser uma fonte de inspiração e achei que deveria mencionar.
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));}}

Experimente online!


Eu não acho que você pode adicionar horas e minutos, você deve defini-los.
Inverno

1
Crie uma ação anônima ( ()=>...) Action<bool>para salvar bytes. Use DateTime.Nowao acessar o mês e o dia. Em geral, publicnão é necessário e Programpode ser apenas uma letra. Use using D=System.DateTime;para salvar bytes. Ótima idéia, mas pode ser muito praticada. Bem-vindo ao PPCG!
TheLethalCoder

@TheLethalCoder obrigado pelo conselho! Esta foi a minha primeira vez no código de golfe, mas definitivamente vou tentar mais!
pritch90

2

PHP e outras linguagens com estas funções comuns: cerca de 28 a 29 bytes:

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

ou alternativamente

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

ambos serão impressos.

possivelmente com ?1:0 dependendo da representação. Possivelmente bytes cortados se for usada uma linguagem que tenha eco implícito ou nenhum ';' final.

Por que colocar os valores em variáveis ​​e todo o resto, quando não é necessário :)
date()deixa qualquer coisa como literal que não está definida, por exemplo, 7 May 2017 17:22:43passa a expressão1722 - 1200 >= 507 para eval (). Byte salvo, alterando-o para o equivalente 1722 - 1199 > 507.

Quem disse que eval está morto? ;-)


2

Java, 81 bytes

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

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

1
Isso lida com dezembro corretamente? Não trabalho com Java há muito tempo, mas parece que ele pode ser enviado de 1 a 24 de dezembro às 24:01, em vez de logo após o meio dia.
Mark S.

Não se esqueça de incluir sua importação de java.util.Datena contagem 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

essa descompactação é bastante irritante, talvez o manuseio de cordas seja mais adequado

// edit: guardas padrão seguros 5 bytes


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

Estes são cada um byte menos se contam como um único byte no Mathematica.

Explicações

  1. Date[]retorna uma lista no formulário {y,m,d,h,m,s}. então Date[][[4;;5]] acontece com as horas e minutos da hora atual.
  2. p=Date[][[#]]&; faz p uma função que recebe nos índices que queremos e nos dá as partes da data.
  3. {60,1}.#&é uma função anônima que utiliza o produto escalar {60,1}e a entrada para obter uma maneira de comparar os tempos. É um byte menor queTimeObject .
  4. p@2 é equivalente a p[2] , o número do mês.
  5. +{12+p@2~Mod~12,0}aumenta {12,0}o mês e a data em que não estamos em dezembro e adiciona{0,0} contrário. (Obrigado, michi7x7!)
  6. >= é o operador de comparação, mas não podemos comparar {horas, minutos} com {mês ajustado, data} no sentido da entrada ...
  7. /@mapeia os {60,1}.#&dois lados da desigualdade entre parênteses, para que possamos comparar os tempos corretamente.
  8. Para os programas iniciados {60,1}.#&, eles #representam a entrada de uma grande função anônima e &significam o fim.
  9. @Date[] Aplica a grande função em sua linha (que extrai partes de uma lista) à própria lista de datas.
  10. [Date[][[#]]&] Aplica a grande função em sua linha a outra função anônima, que extrai partes da lista de datas.

Bônus

Além disso, se almoçarmos entre 1h e 12h59, poderemos salvar 25 bytes com apenas {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3).

Você pode testar tudo isso colando o código na caixa de proteção Wolfram Cloud e clicando em Equipamento-> Avaliar célula ou pressionando Shift + Enter ou Numpad Enter.


Eu acredito que sua nota bônus é realmente uma solução válida - como seu domínio de vezes válidos é 13:01de24:31
Taylor Scott

@TaylorScott Obrigado pela formatação do código (embora a coloração pareça falhar em alguns casos mais complicados). Não tenho certeza se entendi seu comentário. Se o código for "Se for 7h20 da manhã de 19 de julho", o código "bônus" dirá "sim, você almoçou", mesmo que esteja longe das 19h20. O OP tem casos de teste no AM, então acho que isso o torna inválido. o que estou perdendo?
Mark S.

@Mark_S. Entendo - por alguma razão, eu li que como sendo 23:59 em vez de 12:59 - não existe uma maneira concisa de adicionar 12 horas ao código de bônus?
Taylor Scott

1
@TaylorScott Bem, queremos adicionar 12 horas à maior parte dos meses para que, de janeiro a novembro, possamos substituir Date[]o bônus por (Date[]+{0,12,0,0,0,0})(pode haver uma maneira de jogar isso, mas 12UnitVector[6,2]é mais longa). O problema é que em datas como 3 de dezembro, almoçamos às 12:03, e não às 24:03, então precisamos adicionar 12, exceto em dezembro . Isso exige: 1. espiar dentro da data para ver se estamos em dezembro ou não (como nas minhas respostas) ou 2. escrever uma função que examina se fomos para 24: XX após o fato, o que seria mais longo.
Mark S.

1
@MarkS. 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>

Esses nomes de função longos ...



1

R , 92 bytes

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

Experimente 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

1

q, 31 bytes

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

Exemplo:

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á disponível here

Versão antiga

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

The 2$ pad will turn 6 to 6_ rather than _6, so you'd want (-2)$, but you can cancel out those extra 3 chars by using the shorthand for string as ($)... or instead of using $ to pad, prepend "0" and then take the last 2 chars: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mmdd$\:x} for 49 bytes
streetster

good spot. the original was invalid. i added an even shorter version
skeevey

1

JavaScript, 75 bytes

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

Which is equivalent to the following code:

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

last t can be used while modify
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]))

Try it online

Note: There may be a problem with the sign. Please excuse that because I follow IST and it's quite confusing because it's 2:28am here now. Do correct the sign if you feel it is wrong.


1

Perl, 45 chars

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

If I have to provide a method, it will be 45 for sub c{...}. If I have to print say ()||0 even makes it 47. I will add that in if it's a requirement.


I believe that because the original question specifies you need to make a program to help you make sure that snippets are not allowed - that said either of your listed output methods are generally considered valid
Taylor Scott

1
fair enough, I will provide output then. Thanks for editing, I was not aware of the proper language tag! I was thinking perl -e was generally ok, but others have provided functions, so I edited it in.
bytepusher

1

Excel, 52 50 49 bytes

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

Input is this formula in any cell.
Output is either TRUE or FALSE.

Excel's built-in date handling helps a lot.
The TIME function returns the day's lunch time as a time value which, if converted to a date, would use Jan 0, 1900. We compare it against NOW - TODAY so we get the current time with a date value of 0 or Jan 0, 1900.

Saved 2 bytes thanks to Wernisch
Saved 1 byte thanks to Adam


Do you need the extra braces around NOW()-TODAY() ?
Wernisch

@Wernisch No, as it turns out. I had presumed it would evaluate the inequality before the subtraction but I didn't check it. Thanks.
Engineer Toast

I think you can save a byte by changing from now()-today() to mod(now(),1)
Adam

0

JavaScript, 62 chars

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

Test code below:


0

Excel VBA, 55 Bytes

Anonymous VBE immediate window function that takes no input and outputs a Boolean value representing whether I've had lunch to the VBE immediate window

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

0

Ruby, 64+7 = 71 bytes

Requires the -rtime flag because for some reason Time::parse is like, the only function requires it out of the entire Time module.

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

Try it online! (it also prints out the current time)


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 has built in function to use the clock/calendar of the computer. My computer is running on ubuntu 16.04 and already with 12 hour clock, so I can't say if what I did works with other machine using different clock, but seems to works on my machine.


0

JavaScript ES6, 70 Bytes

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

Maybe not that right on some milliseconds...


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

Explanation: First, I obtain the date as a string. Then, I isolate the month and day. Since the problem states that it is always interpreted as PM, then I automatically write false if the time is in AM. If the current time is in PM, then I continue on and just compare the numbers of the time.

Note: I've formatted it slightly differently here for readability.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.