Chào hỏi theo thời gian trong ngày


8

Thử thách

Viết chương trình chào đón người dùng tùy thuộc vào thời gian trong ngày (GMT).


Đầu ra

Một chuỗi (được in hoặc trả lại) theo các quy tắc sau:

  • Nếu thời gian là 06:00 đến 11:59 thì lời chào phải là "Chào buổi sáng"
  • Nếu thời gian là 12:00 đến 17:59 thì lời chào phải là "Chào buổi chiều"
  • Nếu thời gian là 18:00 đến 19:59 thì lời chào phải là "Chào buổi tối"
  • Nếu thời gian là 20:00 đến 05:59 thì lời chào phải là "Zzz"


Làm rõ

  • Không có đầu vào
  • Thời gian và lời chào phải chính xác như được hiển thị
  • Múi giờ là +0 GMT

Ví dụ

Time: 14:45 -> Good afternoon

Time: 05:59 -> Zzz

Time: 9:23 -> Good morning

Time: 18:00 -> Good evening

1
Không có môi trường thử nghiệm trong đó người ta có thể thao túng thời điểm hiện tại, bạn sẽ kiểm tra điều này như thế nào? Thay vào đó, tốt hơn là mã sẽ nhận được thời gian hiện tại làm đầu vào thay thế?
Skidsdev

2
Nếu không lấy đầu vào, chúng ta nên sử dụng UTC / múi giờ địa phương theo một số thông số hệ điều hành / bất cứ điều gì chúng ta muốn (cần một số hạn chế mặc dù luôn luôn ở đâu đó trên thế giới)
Jonathan Allan

1
@ mbomb007 chương trình đang ngủ vào ban đêm
lolad

2
Vâng, có giải pháp tập lệnh đăng nhập Novell của tôi - %GREETING_TIMEbiến của nó không có "Zzz", nó chỉ chuyển từ "buổi tối" sang "buổi sáng" vào nửa đêm.
Neil

9
Tôi khuyên bạn không nên giới hạn trong một múi giờ cụ thể, nhưng thay vào đó, tôi ủng hộ việc giới hạn thời gian hệ thống của riêng bạn. Nhiều câu trả lời hiện không hợp lệ vì nó.
Erik the Outgolfer

Câu trả lời:


12

JavaScript (ES6), 87 byte

Như được chú ý bởi TFeld , công thức ban đầu của tôi đã quá phức tạp. Chúng ta chỉ có thể làm:

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

Hãy thử trực tuyến!

Hoặc kiểm tra phiên bản này lấy giờ làm tham số.


JavaScript (ES6), 90 byte

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

Hãy thử trực tuyến!

Hoặc kiểm tra phiên bản này lấy giờ làm tham số.

Công thức

Cho giờ hiện tại , chúng tôi tìm thấy chỉ số chào phù hợp với:ihi

i=((7×h)mod20)mod72

Một điều tốt về công thức này là nó không yêu cầu bất kỳ dấu ngoặc đơn nào khi được chuyển đổi thành JS:

h * 7 % 20 % 7 >> 1

Bàn

 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 byte

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

Hãy thử trực tuyến!

Kiểm tra tại đây: Hãy thử trực tuyến!


Tương tự như câu trả lời của Arnauld , nhưng hơi khác:

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

Đã lưu:

  • -3 byte, nhờ Arnauld
  • -1 byte, nhờ NP

3
Tôi nghĩ bạn có thể làm /3600%24%20/6.
Arnauld

2
Tôi nghĩ bạn cũng có thể tiết kiệm một byte bằng cách nhập thời gian và sử dụng time.time ()
NP

@Arnauld Cảm ơn :)
TFeld

@Jonathan ALLan Không hoạt động một cách đáng tiếc. Nó vẫn còn nổi
TFeld

Ôi sai lầm của tôi, bạn cần lập chỉ mục với nó :(
Jonathan Allan

4

R, 97 95 93 byte

Sử dụng các phương pháp tìm thấy ở trên trong R

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

Giải trình:

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

Thí dụ

Lưu ý cách dòng mã này, không thêm 1, là 10 phần tử ngắn

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"

Thêm 1 đảm bảo rằng kết quả thu được lớn hơn 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
Chào mừng đến với PPCG! Tôi nghĩ rằng bạn chỉ có thể chia cho 6 thường xuyên để tiết kiệm 2 byte. Bạn có thể cần phải biến nó thành một chức năng, một cái gì đó như thế này: Hãy thử trực tuyến! .
BLT

@BLT Cảm ơn bạn. Khi tôi kiểm tra mã theo từng mảnh / đang cho ra các số dấu phẩy động, mà tôi không nghĩ sẽ hoạt động trong dấu ngoặc, do đó tôi đã sử dụng% /% cho phân chia sàn. Tôi đã học được một cái gì đó mới ngày hôm nay. Đối với việc biến nó thành một hàm, Sys.time () tự động lấy thời gian hiện tại trên bất kỳ máy tính nào, chính nó là đầu vào duy nhất trong phương trình.
Sumner18

2
Có vẻ như chúng ta có thể sử dụng múi giờ "G" và nó sẽ tự động hoàn thành thành "GMT". Nó đưa ra cảnh báo nhưng xuất ra GMT trên máy Windows 10 có trụ sở tại Vương quốc Anh của tôi, mặc dù nó có thể là khu vực / nền tảng cụ thể? Tôi không thấy bất cứ điều gì về nó trong các tài liệu. Lưu 2 byte nếu chúng ta có thể sử dụng nó mặc dù.
CriminallyVulgar

@CriminallyVulgar Điều đó hoạt động ở đây trên máy Windows 10 có trụ sở tại Hoa Kỳ của tôi. Cảm ơn!
Sumner18

3

T-SQL, 153 byte

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

Hãy thử Fiddle SQL

Giải trình:

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 byte

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

Bắt đầu với danh sách các trường hợp

0 <= GIỜ <6: "Zzz"
6 <= GIỜ <12: "Chào buổi sáng"
12 <= GIỜ <18: "Chào buổi chiều"
18 <= GIỜ <20: "Chào buổi tối"
20 <= GIỜ: "Zzz "

Sau đó, chỉ cần sử dụng một Phạm vi dựa trên Vlookup(mặc định nếu bạn tham gia đối số thứ 4) với Mảng giá trị:

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

Tôi đã thử nghiệm sử dụng MOD(HOUR(NOW())+18,24để thay đổi giờ trở lại 6 và giảm các trường hợp xuống 1, nhưng điều đó dẫn đến 99 byte. :


2

05AB1E , 36 byte

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

Hãy thử trực tuyến!


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

Lisp thông thường , 103 byte

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

Ung dung

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

Lisp thông thường chủ yếu bỏ qua khoảng trắng miễn là nó có thể xác định rõ ràng nơi mỗi biểu thức phụ kết thúc, vì vậy phần lớn việc chơi golf ở đây chỉ là loại bỏ khoảng trắng. Lisp chung cũng cung cấp khả năng cho các hàm trả về nhiều giá trị, với tất cả trừ lần đầu tiên bị loại bỏ nếu người gọi không yêu cầu rõ ràng các giá trị trả về thứ 2/3 / etc. Điều này cho phép các hàm trả về dữ liệu phụ trợ, giống như floorhàm thực hiện phân chia tầng, nhưng như một giá trị trả về thứ cấp trả về phần còn lại. Điều này cũng cho phép các hàm tránh được chi phí phải đóng gói các giá trị trả về của chúng trong cơ sở hạ tầng nếu người gọi có khả năng hủy cấu trúc lại ngay lập tức. (get-decoded-time)(thực sự là một tốc ký cho(decode-universal-time (get-universal-time))) trả về hầu hết các giá trị của bất kỳ hàm tiêu chuẩn nào trong chung chung ... 9, chính xác. Giá trị trả về thứ 3 ( (nth-value 2 ...)) là giờ hiện tại trong 24 giờ. Sau đó, nó chỉ tính toán chỉ số thích hợp vào danh sách các câu trả lời và chuyển nó đến nth. Tôi phải sử dụng floorở đây vì CL sẽ trả về một phân số thích hợp nếu tôi sử dụng /để chia.

Hãy thử trực tuyến!


1

Mẻ, 178 byte

@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

Sử dụng công thức của @ TFeld. Phiên bản phụ thuộc vào miền địa phương chỉ có 128 byte:

@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 # (Trình biên dịch tương tác Visual C #) , 91 byte

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

Hãy thử trực tuyến!

Sử dụng Utc ngay để có được thời gian UTC.

Nếu nó có thể là một chức năng thay vì một chương trình đầy đủ:

C # (Trình biên dịch tương tác Visual C #) , 88 byte

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

Hãy thử trực tuyến!

Kiểm tra với tất cả các giờ (mã bị đánh cắp không biết xấu hổ từ Arnauld)


Điều này là khá tốt! Mặc dù có lẽ bạn nên sử dụng DateTime.UtcNowđể có được múi giờ chính xác.
dana

Bạn có thể loại bỏ ;ký tự dấu chấm phẩy ( )!
dana

Dấu chấm phẩy hoàn toàn bị trượt bởi tôi. Cảm ơn!
Hiện thân của sự thiếu hiểu biết

0

05AB1E , 45 42 byte

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

(h*7%20%7)//2được chuyển từ câu trả lời JavaScript (ES6) của @ Arnauld .

Hãy thử trực tuyến hoặc xác minh tất cả các giờ .


Câu trả lời gốc 45 byte:

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

Hãy thử trực tuyến hoặc xác minh tất cả các giờ .

Giải trình:

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

Xem giải thích ở đây để hiểu tại sao ”‚¿”là "Tốt"; '•´là "buổi sáng"; '¯âlà "buổi chiều"; và 'žÖlà "buổi tối".


0

Noether, 106 byte

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

Hãy thử trực tuyến!

Lệnh 2D trả về phần giờ của thời gian hiện tại và phần còn lại là tải của câu lệnh if.


0

Haskell, 174 byte

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 byte

Thủ thuật thực sự lén lút duy nhất là ép buộc hàng giờ unsigned intđể tôi có thể buộc các giá trị ban đêm lên> 14. Vì struct tmcấu trúc chỉ có số nguyên, tôi có thể giả vờ rằng đó là một mảng được truyền từ 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]);}

Hãy thử trực tuyến!


Đề xuất (char*[]){"morning","afternoon","evening"}thay vìs
trần mèo

0

J, 65 byte

Một cổng khác của câu trả lời của TFeld.

('Zzz','Good '&,&>;:'morning afternoon evening'){~<.6%~20|3{6!:0''
  • 3{6!:0'' lấy giờ, là chỉ số 3 của vectơ thời gian hiện tại, từ phần dựng sẵn 6!:0''
  • <.6%~20| là sàn của ((giờ mod 20) chia cho 6)
  • sử dụng nó như là một chỉ mục {~thành một mảng ký tự 4x14 có chứa lời chào.
  • tiết kiệm một vài ký tự bằng cách kết hợp ( ,) chuỗi Goodnhững lời morning, afternooneveningđó là chia vào khoảng trắng bởi J "chữ" tokenizer ( ;:). Về mặt kỹ thuật, nó là để token hóa các câu J, nhưng vì J có các từ trần nên cuối cùng nó sẽ tách ra trên khoảng trắng.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.