Cumprimente de acordo com a hora do dia

8

Desafio

Escreva um programa que cumprimente um usuário, dependendo da hora do dia (GMT).


Resultado

Uma sequência (impressa ou retornada) de acordo com estas regras:

  • Se o horário é das 06:00 às 11:59, a saudação deve ser "Bom dia"
  • Se o horário for das 12:00 às 17:59, a saudação deve ser "Boa tarde"
  • Se o horário for das 18:00 às 19:59, a saudação deve ser "Boa noite"
  • Se o horário for das 20:00 às 05:59, a saudação deverá ser "Zzz"


Esclarecimentos

  • Não há entrada
  • Os horários e cumprimentos devem ser exatamente como mostrados
  • O fuso horário é +0 GMT

Exemplos

Time: 14:45 -> Good afternoon

Time: 05:59 -> Zzz

Time: 9:23 -> Good morning

Time: 18:00 -> Good evening
lolad
fonte
1
Sem um ambiente de teste no qual se possa manipular o horário atual, como você testaria isso? Não seria melhor para o código receber a hora atual como entrada?
Skidsdev 08/08/19
2
Se não tomar entrada deveríamos estar usando UTC / fuso horário local, de acordo com algumas especificações OS / o que quisermos (precisa de alguma restrição embora como é sempre em algum lugar manhã no mundo)
Jonathan Allan
1
@ mbomb007 o programa é dormir à noite
lolad
2
Bem, lá está a minha solução de script de login da Novell - sua %GREETING_TIMEvariável não possui "Zzz", apenas alterna de "noite" para "manhã" à meia-noite.
Neil
9
Eu recomendo não restringir a um fuso horário específico, mas sou a favor de restringir a hora do seu próprio sistema. Atualmente, muitas respostas são inválidas por causa disso.
Erik the Outgolfer 08/08/19

Respostas:

12

JavaScript (ES6), 87 bytes

Como observado por TFeld , minha fórmula original era complicada demais . Podemos apenas fazer:

_=>['Zzz','Good morning','Good afternoon','Good evening'][new Date().getHours()%20/6|0]

Experimente online!

Ou teste esta versão que leva a hora como parâmetro.


JavaScript (ES6), 90 bytes

_=>['Zzz','Good morning','Good afternoon','Good evening'][new Date().getHours()*7%20%7>>1]

Experimente online!

Ou teste esta versão que leva a hora como parâmetro.

Fórmula

Dada a hora atual , encontramos o índice de saudação apropriado i com:hEu

Eu=((7×h)mod20)mod72

Uma coisa boa dessa fórmula é que ela não requer parênteses depois de convertida para JS:

h * 7 % 20 % 7 >> 1

Mesa

 Hour |  *7 | mod 20 | mod 7 | >> 1
------+-----+--------+-------+------
   0  |   0 |    0   |   0   |   0
   1  |   7 |    7   |   0   |   0
   2  |  14 |   14   |   0   |   0
   3  |  21 |    1   |   1   |   0
   4  |  28 |    8   |   1   |   0
   5  |  35 |   15   |   1   |   0
   6  |  42 |    2   |   2   |   1
   7  |  49 |    9   |   2   |   1
   8  |  56 |   16   |   2   |   1
   9  |  63 |    3   |   3   |   1
  10  |  70 |   10   |   3   |   1
  11  |  77 |   17   |   3   |   1
  12  |  84 |    4   |   4   |   2
  13  |  91 |   11   |   4   |   2
  14  |  98 |   18   |   4   |   2
  15  | 105 |    5   |   5   |   2
  16  | 112 |   12   |   5   |   2
  17  | 119 |   19   |   5   |   2
  18  | 126 |    6   |   6   |   3
  19  | 133 |   13   |   6   |   3
  20  | 140 |    0   |   0   |   0
  21  | 147 |    7   |   0   |   0
  22  | 154 |   14   |   0   |   0
  23  | 161 |    1   |   1   |   0
Arnauld
fonte
6

Python 2 , 120 106 102 bytes

import time
print['Zzz','Good morning','Good afternoon','Good evening'][int(time.time()/3600%24%20/6)]

Experimente online!

Testável aqui: Experimente online!


Semelhante à resposta de Arnauld , mas um pouco diferente:

h  %20 /6
---------
0   0   0
1   1   0
2   2   0
3   3   0
4   4   0
5   5   0
6   6   1
7   7   1
8   8   1
9   9   1
10  10  1
11  11  1
12  12  2
13  13  2
14  14  2
15  15  2
16  16  2
17  17  2
18  18  3
19  19  3
20  0   0
21  1   0
22  2   0
23  3   0

Salvou:

  • -3 bytes, graças a Arnauld
  • -1 byte, graças ao NP
TFeld
fonte
3
Eu acho que você pode fazer /3600%24%20/6.
Arnauld
2
Eu acho que você pode salvar um byte através da importação de tempo e usando time.time () bem
NP
Graças @Arnauld :)
TFeld
@ JonathanAllan Infelizmente não funciona. É ainda um flutuador
TFeld
Oh meu erro, você precisa de índice com ele :(
Jonathan Allan
4

R, 97 95 93 bytes

Usando os métodos encontrados acima em R

c("Zzz","Good morning","Good afternoon","Good evening")[as.POSIXlt(Sys.time(),"G")$h%%20/6+1]

Explicação:

c("Zzz","Good morning","Good afternoon","Good evening")      # Creates a vector with the greetings
[                                                            # Open bracket. The number in the bracket will extract the corresponding greeting from the vector below
as.POSIXlt(                                                  # as.POSIXlt converts the object to one of the two classes used to represent date/times
Sys.time(),                                                  # Retrieves the current time on the OS
"G")                                                         # Converts the time to the desired time zone. Does output a warning, but still converts properly to GMT
$h                                                           # Extracts the hour from the object created by as.POSIXlt
%%20/6                                                       # Methodology as used by other golfers
+1]                                                          # Vectors in R start from 1, and not 0 like in other languages, so adding 1 to the value ensures values range from 1 to 4, not 0 to 3

Exemplo

Observe como essa linha de código, sem adicionar 1, é curta 10 elementos

c('Zzz','Good morning','Good afternoon','Good evening')[0:23%%20/6]

[1] "Zzz"            "Zzz"            "Zzz"            "Zzz"            "Zzz"            "Zzz"           
[7] "Good morning"   "Good morning"   "Good morning"   "Good morning"   "Good morning"   "Good morning"  
[13] "Good afternoon" "Good afternoon"

A adição de 1 garante que o resultado obtido seja maior que 0

c('Zzz','Good morning','Good afternoon','Good evening')[as.integer(0:23)%%20/6+1]

[1] "Zzz"            "Zzz"            "Zzz"            "Zzz"            "Zzz"            "Zzz"           
[7] "Good morning"   "Good morning"   "Good morning"   "Good morning"   "Good morning"   "Good morning"  
[13] "Good afternoon" "Good afternoon" "Good afternoon" "Good afternoon" "Good afternoon" "Good afternoon"
[19] "Good evening"   "Good evening"   "Zzz"            "Zzz"            "Zzz"            "Zzz"
Sumner18
fonte
1
Bem-vindo ao PPCG! Eu acho que você pode dividir por 6 regularmente para economizar 2 bytes. Pode ser necessário transformá-lo também em uma função, algo como isto: Experimente online! .
BLT
@BLT Obrigado. Quando testei o código em pedaços / estava produzindo números de ponto flutuante, que não achei que funcionariam entre parênteses, usei% /% para divisão de piso. Eu aprendi algo novo hoje. Quanto a transformá-lo em uma função, o Sys.time () recupera automaticamente o horário atual em qualquer computador, sendo ele próprio a única entrada na equação.
precisa saber é o seguinte
2
Parece que podemos usar o fuso horário "G" e o preenchimento automático será "GMT". Emite um aviso, mas gera GMT na minha máquina Windows 10 com sede no Reino Unido, embora possa ser específica da região / plataforma? Não vejo nada sobre isso nos documentos. Economiza 2 bytes se pudermos usá-lo.
CriminallyVulgar
@CriminallyVulgar Isso funciona aqui na minha máquina Windows 10 com sede nos EUA. Obrigado!
Sumner18
3

T-SQL, 153 bytes

SELECT CASE WHEN a>18THEN'Good afternoon'WHEN a>12THEN'Good morning'WHEN a>2THEN'Zzz'ELSE'Good evening'END
FROM(SELECT(DATEPART(hh,GETUTCDATE())+6)%24a)a

Experimente o SQL Fiddle

Explicação:

SELECT
  CASE WHEN a>18 THEN'Good afternoon' --CASE returns the first value in order whose condition is met
       WHEN a>12 THEN'Good morning'
       WHEN a>2  THEN'Zzz'
       ELSE 'Good evening'
       END
FROM( SELECT (      --Use a subquery to treat the time like a 1x1 table - shorter than declaring a variable
    DATEPART(hh,    --Returns the hour part (hh) of the date
      GETUTCDATE()) --Returns current UTC time (as far as the SQL Server is concerned)
        +6)%24      --Virtual time zone where no period crosses midnight, so everything is ordered
        a)          --Give column a 1-letter alias
        a           --Give subquery an alias so SQL Server doesn't complain
Shmeeku
fonte
2

Excel, 97 bytes

=VLOOKUP(Hour(Now()),{0,"Zzz";6,"Good morning";12,"Good afternoon";18,"Good evening";20,"Zzz"},2)

Comece com a lista de casos

0 <= HOUR <6: "Zzz"
6 <= HOUR <12: "Bom dia"
12 <= HOUR <18: "Boa tarde"
18 <= HOUR <20: "Boa noite"
20 <= HOUR: "Zzz "

Em seguida, basta usar um intervalo Vlookup(padrão, se você omitir o 4º argumento) com uma matriz de valores:

H= 0| "Zzz"
H= 6| "Good morning"
H=12| "Good afternoon"
H=18| "Good evening"
H=20|"Zzz"

{0,"Zzz"; 6,"Good morning"; 12,"Good afternoon"; 18, "Good evening"; 20,"Zzz"}

Eu experimentei usar MOD(HOUR(NOW())+18,24para mudar a hora de volta em 6 e reduzir os casos em 1, mas isso resultou em 99 bytes. :(

Cronocida
fonte
2

05AB1E , 36 bytes

”‚¿”…•´¯âžÖ#1ú«…Zzz¸«ža•1Ý;`{ùí4²•èè

Experimente online!


”‚¿”                                 # Push 'Good'
    …•´¯âžÖ                          # Push 'morning afternoon evening'
           #                         # Split on spaces.
            1ú                       # Pad each with 1 space.
              «                      # Concat good onto it: ['Good morning',...,'Good evening']
               …Zzz¸«                # Concat 'Zzz' onto it.
                     ža              # Get current hour.
                       •1Ý;`{ùí4²•   # Push 33333000000111111222.
                                  è  # indexes[current_hour]->i[6:00AM]->0
                                   è # phrases[indexes[current_hour]]->p[i[6AM]]->'Good morning'.
Urna de polvo mágico
fonte
1

Powershell, 82 72 bytes

Porto da resposta do TFeld

('Zzz','Good morning','Good afternoon','Good evening')[(date).Hour%20/6]
confuso
fonte
1

Lisp comum , 103 bytes

(nth(floor(mod(nth-value 2(get-decoded-time))20)6)'("Zzz""Good morning""Good afternoon""Good evening"))

Ungolfed

(nth (floor (mod (nth-value 2 (get-decoded-time))
                 20)
            6)
     '("Zzz" "Good morning" "Good afternoon" "Good evening"))

O Lisp comum ignora principalmente os espaços em branco, desde que possa determinar inequivocamente onde cada subexpressão termina, grande parte do golfe aqui está apenas removendo os espaços em branco. O Lisp comum também fornece a capacidade das funções retornarem vários valores, com a exceção de todos os primeiros descartados, se o chamador não tiver solicitado explicitamente os valores de retorno 2º / 3º / etc. Isso permite que as funções retornem dados auxiliares, como a floorfunção executa a divisão do piso, mas como um valor de retorno secundário retorna o restante. Isso também permite que as funções evitem a sobrecarga de ter que empacotar seus valores de retorno em uma estrutura de dados se o chamador provavelmente a desestruturar imediatamente novamente. (get-decoded-time)(realmente uma abreviação de(decode-universal-time (get-universal-time))) retorna a maioria dos valores de praticamente qualquer função padrão em lisp comum ... 9, para ser exato. O terceiro valor de retorno ( (nth-value 2 ...)) é a hora atual em 24 horas. Depois, basta computar o índice adequado na lista de respostas e passar para nth. Eu tenho que usar flooraqui como CL retornaria uma fração adequada se eu usasse /para divisão.

Experimente online!

djeis
fonte
1

Lote, 178 bytes

@for /f "tokens=3" %%a in ('wmic path Win32_UTCTime') do @set/ag=%%a%%20/6
@for %%a in (Zzz.0 "Good morning.1" "Good afternoon.2" "Good evening.3") do @if %%~xa==.%g% echo %%~na

Usa a fórmula do @ TFeld. A versão dependente da localidade tem apenas 128 bytes:

@set/ag=%time:~,2%%%20/6
@for %%a in (Zzz.0 "Good morning.1" "Good afternoon.2" "Good evening.3") do @if %%~xa==.%g% echo %%~na
Neil
fonte
1

C # (.NET Core) , 177 bytes

using System;namespace a{class b{static void Main(string[] a){Console.WriteLine(new String[]{"Zzz","Good morning","Good afternoon","Good evening"}[DateTime.Now.Hour%20/6|0]);}}}

Experimente online!

Alice
fonte
139 bytes
Modalidade de ignorância
1

Japonês , 52 bytes

`Zzz,Good ¶rÍÁ,Good af’rÍ9,Good evÀxg`q, gKd %20/6|0

Experimente online!

Bejofo
fonte
1

C # (compilador interativo do Visual C #) , 91 bytes

Write("Zzz,Good morning,Good afternoon,Good evening".Split(',')[DateTime.UtcNow.Hour%20/6])

Experimente online!

Usa Utc Now para obter a hora UTC.

Se puder ser uma função em vez de um programa completo:

C # (compilador interativo do Visual C #) , 88 bytes

()=>"Zzz,Good morning,Good afternoon,Good evening".Split(',')[DateTime.UtcNow.Hour%20/6]

Experimente online!

Teste com todas as horas (código roubado descaradamente da Arnauld)

Modalidade de ignorância
fonte
Isso é muito bom! Embora você provavelmente deva usar DateTime.UtcNowpara obter o fuso horário correto.
Dana
Você pode remover o ;caractere ponto-e-vírgula ( ) à direita !
dana
O ponto e vírgula passou totalmente por mim. Obrigado!
Modalidade de ignorância
0

05AB1E , 45 42 bytes

ža7*20%7%2÷U”‚¿”Xi'•´ëX<i'¯âë'žÖ]ðýX>i…Zzz

(h*7%20%7)//2portado da resposta JavaScript de @ Arnauld (ES6) .

Experimente online ou verifique todas as horas .


Resposta original de 45 bytes:

žaDV6÷U”‚¿”Xi'•´ëX<i'¯âë'žÖ]ðýX3%>iY2÷9Êi…Zzz

Experimente online ou verifique todas as horas .

Explicação:

ža                 # Get the current hours
  DV               # Duplicate it, and store it in variable `Y`
    6÷U            # Integer-divide it by 6, and store it in variable `X`
”‚¿”               # String "Good"
    Xi             # If `X` is 1:
      '•´          #  Use string 'morning'
    ëX<i           # Else-if `X` is 2:
        '¯â        #  Use string 'afternoon'
    ë              # Else:
     'žÖ           #  Use string 'evening'
           ]       # Close all if-elses
            ðý     # Join the two string literals with a space
X3%>i              # If `X` modulo-3 is 0:
     Y2÷9Êi        # And if `Y` integer-divided by 2 is not 9:
           …Zzz    #  Output string "Zzz" instead
                   # (Implicit else:
                   #   output top of stack, which is the "Good ...")

Veja a explicação aqui para entender por que ”‚¿”é "Bom"; '•´é "manhã"; '¯âé "tarde"; e 'žÖé "tarde".

Kevin Cruijssen
fonte
0

Noether, 106 bytes

"Good "~g{2D~d5>d12<&}{g"morning"+P}d{11>d18<&}{g"afternoon"+P}d{17>d20<&}{g"evening"+P}d{20>d6<&}{"Zzz"P}

Experimente online!

O comando 2Dretorna a parte da hora da corrente, a hora e o restante é uma carga de instruções if.

Beta Decay
fonte
0

Haskell, 174 bytes

import Data.UnixTime
v h|h<10="Zzz"|1>0="Good "++y h
y h|h<16="morning"|h<22="afternoon"|1>0="evening"
main=do;t<-getUnixTime;print$v$mod(div(read.show.utSeconds$t)3600+4)24
Евгений Новиков
fonte
0

C (gcc) , 127 bytes

O único truque realmente furtivo é unsigned intforçar as horas para que eu possa forçar os valores noturnos a> 14. Como a struct tmestrutura possui apenas números inteiros, posso fingir que é uma matriz que está sendo transmitida gmtime_r.

char*s[]={"morning","afternoon","evening"};t,u[9];f(){t=time(0);gmtime_r(&t,u);printf(u[2]-6U>13?"Zzz":"Good %s",s[u[2]/6-1]);}

Experimente online!

ErikF
fonte
Sugerir em (char*[]){"morning","afternoon","evening"}vez des
tetocat 6/0918
0

J, 65 bytes

Outro porto da resposta do TFeld.

('Zzz','Good '&,&>;:'morning afternoon evening'){~<.6%~20|3{6!:0''
  • 3{6!:0'' obtém a hora, que é o índice 3 do vetor de tempo atual, a partir do 6!:0''
  • <.6%~20| é o piso de ((hora mod 20) dividido por 6)
  • use isso como um índice {~em uma matriz de caracteres 4x14 que contém os cumprimentos.
  • economizar alguns caracteres concatenando ( ,) a corda Goodàs palavras morning, afternoone eveningque são divididos em espaços em branco pela J "palavras" tokenizer ( ;:). Tecnicamente, é para tokenizar sentenças J, mas como J possui palavras simples, acaba se dividindo em espaços em branco.
hoosierEE
fonte