時刻に応じて挨拶する


8

チャレンジ

時刻(GMT)に応じてユーザーに挨拶するプログラムを作成します。


出力

次のルールに従った文字列(印刷または返される):

  • 時刻が06:00から11:59の場合、挨拶は「おはよう」である必要があります
  • 時刻が12:00から17:59の場合、挨拶は「こんにちは」である必要があります
  • 時間が18:00から19:59の場合、挨拶は「こんばんは」である必要があります
  • 時間が20:00から05:59の場合、挨拶は「Zzz」である必要があります


明確化

  • 入力はありません
  • 時間と挨拶は正確に示されているとおりでなければなりません
  • タイムゾーンは+0 GMTです

Time: 14:45 -> Good afternoon

Time: 05:59 -> Zzz

Time: 9:23 -> Good morning

Time: 18:00 -> Good evening

1
現在の時刻を操作できるテスト環境がなければ、これをどのようにテストしますか?代わりに、コードが現在の時刻を入力として受け取るほうがよいのではないでしょうか。
Skidsdev

2
入力を取得しない場合は、OS仕様/必要に応じてUTC /ローカルタイムゾーンを使用する必要があります(常に世界のどこかで朝になるため、制限が必要です)
Jonathan Allan

1
@ mbomb007プログラムは夜眠っています
lolad

2
さて、私のNovellログインスクリプトソリューションがあります。その%GREETING_TIME変数には「Zzz」がなく、真夜中に「夕方」から「朝」に切り替わるだけです。
ニール、

9
特定のタイムゾーンに制限しないことをお勧めしますが、代わりに独自のシステム時間に制限することをお勧めします。そのため、多くの回答は現在無効です。
Erik the Outgolfer

回答:


12

JavaScript(ES6)、87バイト

TFeldが気づいたように、私の元の式は複雑すぎました。できること:

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

オンラインでお試しください!

または、パラメータとして1時間かかるこのバージョンテストします。


JavaScript(ES6)、90バイト

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

オンラインでお試しください!

または、パラメータとして1時間かかるこのバージョンテストします。

現在の時間与えられると、適切な挨拶インデックスが次のように見つかります。Ihi

i=((7×h)mod20)mod72

この式の良い点は、JSに変換すると括弧が不要になることです。

h * 7 % 20 % 7 >> 1

テーブル

 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

パイソン2120の 106 102バイト

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

オンラインでお試しください!

ここでテスト可能:オンラインでお試しください!


Arnauldの回答に似ていますが、少し異なります。

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

保存済み:

  • -3バイト、Arnauldのおかげ
  • NPのおかげで-1バイト

3
できると思います/3600%24%20/6
Arnauld

2
時間をインポートし、time.time()を使用することでもバイトを節約できると思います
NP

@Arnauldありがとう:)
TFeld

@JonathanAllan残念ながら動作しません。それはまだフロートです
TFeld

ああ私の間違い、あなたはそれにインデックスを付ける必要があります:(
Jonathan Allan

4

R、97 95 93バイト

上記のRにあるメソッドの使用

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

説明:

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

このコード行は、1を追加せずに、10要素と短いことに注意してください。

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"

1を追加すると、得られる結果が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"

1
PPCGへようこそ!定期的に6で割って2バイト節約できると思います。次のような関数に変換する必要がある場合もあります。オンラインでお試しください!
BLT 2018

@BLTありがとうございます。コードを分割してテストしたとき、浮動小数点数が得られていたため、括弧内では機能しないと考えられたため、フロア除算に%/%を使用しました。今日は新しいことを学びました。関数に変換する場合、Sys.time()は、与えられた任意のコンピューターの現在時刻を自動的に取得します。それ自体が方程式の唯一の入力です。
Sumner18

2
タイムゾーン「G」を使用できるようで、「GMT」にオートコンプリートされます。警告が表示されますが、英国ベースのWindows 10マシンでGMTを出力しますが、地域/プラットフォーム固有の場合がありますか?私はそれについてドキュメントで何も見ていません。ただし、使用できる場合は2バイト節約されます。
CriminallyVulgar

@CriminallyVulgarこれは、米国を拠点とするWindows 10マシンで動作します。ありがとう!
Sumner18

3

T-SQL、153バイト

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

SQLフィドルを試す

説明:

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バイト

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

ケースのリストから始めます

0 <= HOUR <6: "Zzz"
6 <= HOUR <12: "おはよう"
12 <= HOUR <18: "こんにちは"
18 <= HOUR <20: "こんばんは"
20 <= HOUR: "Zzz 」

次にVlookup、値の配列で範囲ベース(4番目の引数を省略した場合のデフォルト)を使用します。

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

MOD(HOUR(NOW())+18,24時間を6シフトしてケースを1減らすためにを使用して実験しましたが、結果として99バイトになりました。:(


2

05AB1E、36バイト

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

オンラインでお試しください!


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

Common Lisp、103バイト

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

未ゴルフ

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

Common Lispは、各部分式がどこで終わるかを明確に決定できる限り、ほとんど空白を無視します。そのため、ここでのゴルフの多くは、空白を削除するだけです。Common Lispは、関数が複数の値を返す機能も提供します。呼び出し元が2番目/ 3番目などの戻り値を明示的に要求しなかった場合、最初のもの以外はすべて破棄されます。これにより、floor関数はフロア除算を実行するように補助データを返すことができますが、2次戻り値として残りを返します。これにより、関数は、呼び出し側がすぐに再度構造化解除する可能性が高い場合に、戻り値をデータ構造にパッケージ化しなければならないというオーバーヘッドを回避できます。(get-decoded-time)(本当にそれ自体は(decode-universal-time (get-universal-time)))正確には、一般的なlisp ... 9のほぼすべての標準関数のほとんどの値を返します。3番目の戻り値((nth-value 2 ...))は、24時間制での現在の時間です。次に、応答のリストへの適切なインデックスを計算し、それをに渡しnthます。除算floorに使用/した場合、CLは適切な分数を返すため、ここで使用する必要があります。

オンラインでお試しください!


1

バッチ、178バイト

@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

@TFeldの式を使用します。ロケールに依存するバージョンは128バイトのみです。

@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バイト

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

オンラインでお試しください!

Utc Nowを使用してUTC時間を取得します。

完全なプログラムではなく関数である場合:

C#(Visual C#Interactive Compiler)、88バイト

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

オンラインでお試しください!

すべての時間でテストする(Arnauldから恥知らずに盗まれたコード)


これはかなり良いです!DateTime.UtcNow正しいタイムゾーンを取得するにはおそらく使用する必要があります。
dana

;ただし、末尾のセミコロン()文字を削除することもできます。
dana

セミコロンは完全に私が滑ってしまった。ありがとう!
無知の実施

0

05AB1E45 42 バイト

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

(h*7%20%7)//2@ArnauldのJavaScript(ES6)回答から移植されました。

オンラインそれを試してみたり、すべての時間を確認してください


元の45バイトの回答:

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

オンラインそれを試してみたり、すべての時間を確認してください

説明:

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

なぜ”‚¿”「良い」かを理解するには、ここの説明を参照してください'•´「朝」です。'¯â「午後」です。そして'žÖ「夕方」です。



0

Haskell、174バイト

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バイト

唯一の卑劣なトリックはunsigned int、夜の値を> 14に強制できるように時間を強制することです。struct tm構造体は整数しか持っていないので、それがから渡される配列であるように見せかけることができ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]);}

オンラインでお試しください!


提案する(char*[]){"morning","afternoon","evening"}代わりにs
ceilingcat

0

J、65バイト

TFeldの回答の別のポート。

('Zzz','Good '&,&>;:'morning afternoon evening'){~<.6%~20|3{6!:0''
  • 3{6!:0'' 組み込みから現在の時間ベクトルのインデックス3である時間を取得します 6!:0''
  • <.6%~20| ((時間mod 20)6 6)の床
  • これ{~を、挨拶を含む4x14文字配列のインデックスとして使用します。
  • ,文字列Goodを単語、、およびに連結()して、いくつかの文字を保存しますmorning。これらは、J "words"トークナイザー()によって空白で分割されます。技術的には、J文をトークン化するためのものですが、Jには単語がないため、空白で分割されてしまいます。afternoonevening;:
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.