Begrüßen Sie nach der Tageszeit


8

Herausforderung

Schreiben Sie ein Programm, das einen Benutzer je nach Tageszeit (GMT) begrüßt.


Ausgabe

Eine Zeichenfolge (gedruckt oder zurückgegeben) gemäß diesen Regeln:

  • Wenn die Zeit von 06:00 bis 11:59 Uhr ist, muss die Begrüßung "Guten Morgen" sein.
  • Wenn die Zeit von 12:00 bis 17:59 Uhr ist, muss die Begrüßung "Guten Tag" sein.
  • Wenn die Zeit zwischen 18:00 und 19:59 Uhr ist, muss die Begrüßung "Guten Abend" sein.
  • Wenn die Zeit zwischen 20:00 und 05:59 Uhr liegt, muss die Begrüßung "Zzz" sein.


Klarstellungen

  • Es gibt keine Eingabe
  • Die Zeiten und Grüße müssen genau wie gezeigt sein
  • Die Zeitzone ist +0 GMT

Beispiele

Time: 14:45 -> Good afternoon

Time: 05:59 -> Zzz

Time: 9:23 -> Good morning

Time: 18:00 -> Good evening

1
Wie würden Sie dies ohne eine Testumgebung testen, in der man die aktuelle Zeit manipulieren kann? Wäre es nicht besser, wenn der Code stattdessen die aktuelle Zeit als Eingabe empfängt?
Skidsdev

2
Wenn wir keine Eingaben machen, sollten wir UTC / lokale Zeitzone gemäß einer Betriebssystemspezifikation / was auch immer wir wollen verwenden (bedarf allerdings einer Einschränkung, da es immer irgendwo auf der Welt Morgen ist)
Jonathan Allan

1
@ mbomb007 das Programm schläft nachts
lolad

2
Nun, da ist meine Novell-Anmeldeskriptlösung - ihre %GREETING_TIMEVariable hat kein "Zzz", sondern wechselt nur um Mitternacht von "Abend" zu "Morgen".
Neil

9
Ich empfehle, nicht auf eine bestimmte Zeitzone zu beschränken, sondern befürworte stattdessen die Beschränkung auf Ihre eigene Systemzeit. Viele Antworten sind derzeit deshalb ungültig.
Erik der Outgolfer

Antworten:


12

JavaScript (ES6), 87 Byte

Wie TFeld bemerkte , war meine ursprüngliche Formel überkompliziert. Wir können einfach tun:

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

Probieren Sie es online aus!

Oder testen Sie diese Version , die die Stunde als Parameter benötigt.


JavaScript (ES6), 90 Byte

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

Probieren Sie es online aus!

Oder testen Sie diese Version , die die Stunde als Parameter benötigt.

Formel

Angesichts der aktuellen Stunde finden wir den passenden Begrüßungsindex mit:ihi

i=((7×h)mod20)mod72

Eine gute Sache an dieser Formel ist, dass nach der Konvertierung in JS keine Klammern erforderlich sind:

h * 7 % 20 % 7 >> 1

Tabelle

 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

6

Python 2 , 120 106 102 Bytes

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

Probieren Sie es online aus!

Hier testbar: Probieren Sie es online aus!


Ähnlich wie Arnauld's Antwort , aber etwas anders:

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

Gerettet:

  • -3 Bytes, danke an Arnauld
  • -1 Byte dank NP

3
Ich denke du kannst es tun /3600%24%20/6.
Arnauld

2
Ich denke, Sie können ein Byte sparen, indem Sie Zeit importieren und auch time.time () verwenden
NP

@Arnauld Danke :)
TFeld

@ JonathanAllan Funktioniert leider nicht. Es ist immer noch ein
Festwagen

Oh mein Fehler, Sie müssen damit indizieren :(
Jonathan Allan

4

R, 97 95 93 Bytes

Unter Verwendung der oben in R.

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

Erläuterung:

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

Beispiel

Beachten Sie, dass diese Codezeile ohne Hinzufügen von 1 kurze 10 Elemente enthält

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"

Durch Hinzufügen von 1 wird sichergestellt, dass das erhaltene Ergebnis größer als 0 ist

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"

1
Willkommen bei PPCG! Ich denke, Sie können einfach regelmäßig durch 6 teilen, um 2 Bytes zu sparen. Möglicherweise müssen Sie es auch in eine Funktion umwandeln, etwa so: Probieren Sie es online aus! .
BLT

@ BLT Danke. Als ich den Code in Stücken getestet habe, ergaben sich Gleitkommazahlen, von denen ich nicht dachte, dass sie in den Klammern funktionieren würden. Daher habe ich% /% für die Bodenteilung verwendet. Ich habe heute etwas Neues gelernt. Um es in eine Funktion umzuwandeln, ruft Sys.time () automatisch die aktuelle Zeit auf einem bestimmten Computer ab und ist selbst die einzige Eingabe in der Gleichung.
Sumner18

2
Es scheint, als könnten wir die Zeitzone "G" verwenden und sie wird automatisch zu "GMT" vervollständigt. Es gibt eine Warnung aus, gibt aber GMT auf meinem Windows 10-Computer in Großbritannien aus, obwohl es möglicherweise regionenspezifisch / plattformspezifisch ist. Ich sehe nichts darüber in den Dokumenten. Spart 2 Bytes, wenn wir es trotzdem verwenden können.
Kriminell

@CriminallyVulgar Das funktioniert hier auf meinem Windows 10-Computer in den USA. Vielen Dank!
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

Probieren Sie die SQL-Geige aus

Erläuterung:

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


2

Excel, 97 Bytes

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

Beginnen Sie mit der Liste der Fälle

0 <= STUNDE <6: "Zzz"
6 <= STUNDE <12: "Guten Morgen"
12 <= STUNDE <18: "Guten Tag"
18 <= STUNDE <20: "Guten Abend"
20 <= STUNDE: "Zzz ""

Verwenden Sie dann einfach ein Range-basiertes Vlookup(Standard, wenn Sie das 4. Argument weglassen) mit einem Array von Werten:

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"}

Ich habe damit experimentiert MOD(HOUR(NOW())+18,24, die Stunde um 6 zurück zu verschieben und die Fälle um 1 zu reduzieren, aber das ergab 99 Bytes. :(


2

05AB1E , 36 Bytes

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

Probieren Sie es online aus!


”‚¿”                                 # 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'.

1

Powershell, 82 72 Bytes

Port of TFelds Antwort

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

1

Common Lisp , 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"))

Common Lisp ignoriert meistens Leerzeichen, solange es eindeutig bestimmen kann, wo jeder Unterausdruck endet, so dass beim Golfen hier nur Leerzeichen entfernt werden. Common Lisp bietet Funktionen auch die Möglichkeit, mehrere Werte zurückzugeben, wobei alle bis auf den ersten verworfen werden, wenn der Aufrufer die Rückgabewerte 2nd / 3rd / etc nicht explizit angefordert hat. Dies ermöglicht es Funktionen, Hilfsdaten zurückzugeben, wie die floorFunktion eine Bodenteilung durchführt, aber als sekundärer Rückgabewert den Rest zurückgibt. Dies ermöglicht es Funktionen auch, den Aufwand zu vermeiden, ihre Rückgabewerte in eine Datenstruktur packen zu müssen, wenn der Aufrufer sie wahrscheinlich sofort wieder zerstören wird. (get-decoded-time)(wirklich selbst eine Abkürzung für(decode-universal-time (get-universal-time))) gibt die meisten Werte von nahezu jeder Standardfunktion in Common Lisp ... 9 zurück, um genau zu sein. Der 3. Rückgabewert ( (nth-value 2 ...)) ist die aktuelle Stunde in 24 Stunden. Dann wird einfach der richtige Index in die Liste der Antworten berechnet und an übergeben nth. Ich muss floorhier verwenden, da CL einen richtigen Bruch zurückgeben würde, wenn ich /für die Division verwenden würde.

Probieren Sie es online aus!


1

Stapel, 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

Verwendet die Formel von @ TFeld. Die vom Gebietsschema abhängige Version ist nur 128 Byte groß:

@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



1

C # (Visual C # Interactive Compiler) , 91 Byte

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

Probieren Sie es online aus!

Verwendet Utc Now, um die UTC-Zeit abzurufen.

Wenn es eine Funktion anstelle eines vollständigen Programms sein kann:

C # (Visual C # Interactive Compiler) , 88 Byte

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

Probieren Sie es online aus!

Test mit allen Stunden (Code schamlos von Arnauld gestohlen)


Das ist ziemlich gut! Obwohl Sie wahrscheinlich verwenden sollten DateTime.UtcNow, um die richtige Zeitzone zu erhalten.
Dana

Sie können jedoch das nachfolgende Semikolon ( ;) entfernen !
Dana

Das Semikolon ist mir total entgangen. Vielen Dank!
Verkörperung der Unwissenheit

0

05AB1E , 45 42 Bytes

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

(h*7%20%7)//2portiert von @ Arnauld's JavaScript (ES6) Antwort .

Probieren Sie es online aus oder überprüfen Sie alle Stunden .


Ursprüngliche 45-Byte-Antwort:

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

Probieren Sie es online aus oder überprüfen Sie alle Stunden .

Erläuterung:

ž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 ...")

Lesen Sie die Erklärung hier, um zu verstehen, warum ”‚¿”"gut" ist. '•´ist "Morgen"; '¯âist "Nachmittag"; und 'žÖist "Abend".


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}

Probieren Sie es online aus!

Der Befehl 2Dgibt den Stundenanteil der aktuellen Uhrzeit zurück und der Rest ist eine Ladung von if-Anweisungen.


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

0

C (gcc) , 127 Bytes

Der einzige wirklich hinterhältige Trick besteht darin, die Stunden zu unsigned intzwingen, damit ich die Nachtwerte auf> 14 zwingen kann. Da die struct tmStruktur nur Ganzzahlen enthält, kann ich so tun, als wäre es ein Array, von dem übergeben wird 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]);}

Probieren Sie es online aus!


Schlagen Sie (char*[]){"morning","afternoon","evening"}statts
Deckenkatze

0

J, 65 Bytes

Ein weiterer Hafen von TFelds Antwort.

('Zzz','Good '&,&>;:'morning afternoon evening'){~<.6%~20|3{6!:0''
  • 3{6!:0'' Ruft die Stunde, die Index 3 des aktuellen Zeitvektors ist, vom eingebauten ab 6!:0''
  • <.6%~20| ist der Boden von ((Stunde Mod 20) geteilt durch 6)
  • Verwenden Sie dies als Index {~für ein 4x14-Zeichen-Array, das die Begrüßungen enthält.
  • sparen ein paar Zeichen durch die Verkettung ( ,) die Zeichenfolge Goodauf die Worte morning, afternoonund eveningdie Aufteilung auf Leerzeichen sind durch die J „Worte“ tokenizer ( ;:). Technisch gesehen dient es zum Tokenisieren von J-Sätzen, aber da J bloße Wörter hat, wird es auf Leerzeichen aufgeteilt.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.