Sambut sesuai dengan waktu hari


8

Tantangan

Tulis program yang menyambut pengguna tergantung pada jam berapa (GMT) itu.


Keluaran

String (dicetak atau dikembalikan) sesuai dengan aturan ini:

  • Jika waktunya 06: 00-11:59 salam harus "Selamat pagi"
  • Jika jam 12: 00-17:59 salam harus "Selamat siang"
  • Jika waktunya 18: 00-19:59 salam harus "Selamat malam"
  • Jika waktunya 20:00 - 05:59 salam harus "Zzz"


Klarifikasi

  • Tidak ada input
  • Waktu dan salam harus persis seperti yang ditunjukkan
  • Zona waktu adalah +0 GMT

Contohnya

Time: 14:45 -> Good afternoon

Time: 05:59 -> Zzz

Time: 9:23 -> Good morning

Time: 18:00 -> Good evening

1
Tanpa lingkungan pengujian di mana seseorang dapat memanipulasi waktu saat ini, bagaimana Anda menguji ini? Bukankah lebih baik kode menerima waktu saat ini sebagai input?
Skidsdev

2
Jika tidak mengambil input kita harus menggunakan UTC / zona waktu lokal sesuai dengan beberapa spesifikasi OS / apa pun yang kita inginkan (perlu beberapa pembatasan meskipun selalu pagi di suatu tempat di dunia)
Jonathan Allan

1
@ mbomb007 program sedang tidur di malam hari
lolad

2
Nah, %GREETING_TIMEbegitulah solusi skrip login Novell saya - variabelnya tidak memiliki "Zzz", itu hanya beralih dari "malam" ke "pagi" di tengah malam.
Neil

9
Saya merekomendasikan untuk tidak membatasi ke zona waktu tertentu, tetapi saya lebih suka membatasi waktu sistem Anda sendiri. Banyak jawaban saat ini tidak valid karena itu.
Erik the Outgolfer

Jawaban:


12

JavaScript (ES6), 87 byte

Seperti yang diperhatikan oleh TFeld , formula asli saya terlalu rumit. Kita bisa melakukan:

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

Cobalah online!

Atau uji versi ini yang menggunakan jam sebagai parameter.


JavaScript (ES6), 90 byte

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

Cobalah online!

Atau uji versi ini yang menggunakan jam sebagai parameter.

Rumus

Mengingat jam saat , kita menemukan indeks ucapan yang sesuai i dengan:hsaya

saya=((7×h)mod20)mod72

Hal yang baik tentang rumus ini adalah tidak memerlukan tanda kurung apa pun yang pernah dikonversi ke JS:

h * 7 % 20 % 7 >> 1

Meja

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

Cobalah online!

Diuji di sini: Coba online!


Mirip dengan jawaban Arnauld , tetapi sedikit berbeda:

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

Diselamatkan:

  • -3 byte, terima kasih kepada Arnauld
  • -1 byte, terima kasih kepada NP

3
Saya pikir Anda bisa melakukannya /3600%24%20/6.
Arnauld

2
Saya pikir Anda dapat menghemat byte dengan mengimpor waktu dan menggunakan time.time () juga
NP

@Arnauld Terima kasih :)
TFeld

@JonathanAllan Sayangnya tidak berfungsi. Ini masih pelampung
TFeld

Oh, kesalahan saya, Anda perlu mengindeks dengan itu :(
Jonathan Allan

4

R, 97 95 93 Bytes

Menggunakan metode yang ditemukan di atas dalam R

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

Penjelasan:

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

Contoh

Perhatikan bagaimana baris kode ini, tanpa menambahkan 1, adalah 10 elemen pendek

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"

Menambahkan 1 memastikan bahwa hasil yang diperoleh lebih besar dari 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
Selamat datang di PPCG! Saya pikir Anda bisa membagi dengan 6 secara teratur untuk menghemat 2 byte. Anda mungkin perlu mengubahnya menjadi fungsi juga, sesuatu seperti ini: Coba online! .
BLT

@ BLT Terima Kasih. Ketika saya menguji kode dalam potongan / menghasilkan angka floating point, yang saya pikir tidak akan berhasil dalam tanda kurung, jadi saya menggunakan% /% untuk pembagian lantai. Saya belajar sesuatu yang baru hari ini. Adapun mengubahnya menjadi fungsi, Sys.time () secara otomatis mengambil waktu saat ini di komputer tertentu, itu sendiri menjadi satu-satunya input dalam persamaan.
Sumner18

2
Sepertinya kita dapat menggunakan zona waktu "G" dan akan melengkapi secara otomatis ke "GMT". Ini memberikan peringatan tetapi mengeluarkan GMT pada mesin Windows 10 saya yang berbasis di Inggris, meskipun itu mungkin spesifik wilayah / platform? Saya tidak melihat apa-apa tentang itu di dokumen. Hemat 2 byte jika kita bisa menggunakannya.
CriminallyVulgar

@CriminallyVulgar Itu bekerja di sini di mesin Windows 10 saya yang berbasis di AS. Terima kasih!
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

Coba biola SQL

Penjelasan:

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)

Mulailah dengan daftar kasus

0 <= JAM <6: "Zzz"
6 <= JAM <12: "Selamat pagi"
12 <= JAM <18: "Selamat siang"
18 <= JAM <20: "Selamat malam"
20 <= JAM: "Zzz "

Kemudian gunakan saja berbasis Rentang Vlookup(default jika Anda menghilangkan argumen ke-4) dengan Array nilai:

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

Saya bereksperimen dengan menggunakan MOD(HOUR(NOW())+18,24untuk menggeser jam ke belakang dengan 6 dan mengurangi kasus dengan 1, tetapi itu menghasilkan 99 byte. :(


2

05AB1E , 36 byte

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

Cobalah 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'.

1

Powershell, 82 72 byte

Port of TFeld menjawab

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

1

Common Lisp , 103 byte

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

Tidak disatukan

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

Lisp umum sebagian besar mengabaikan spasi putih selama itu dapat dengan jelas menentukan di mana setiap sub-ekspresi berakhir, begitu banyak golf di sini hanya menghilangkan spasi putih. Common Lisp juga menyediakan kemampuan bagi fungsi untuk mengembalikan beberapa nilai, dengan semua kecuali yang pertama dibuang jika pemanggil belum secara eksplisit meminta nilai pengembalian ke-2/3 / etc. Ini memungkinkan fungsi untuk mengembalikan data tambahan, seperti floorfungsi melakukan pembagian lantai, tetapi sebagai nilai balik sekunder mengembalikan sisanya. Ini juga memungkinkan fungsi untuk menghindari overhead karena harus mengemas nilai kembali mereka dalam struktur data jika pemanggil cenderung segera merusaknya lagi. (get-decoded-time)(benar-benar sendiri singkatan untuk(decode-universal-time (get-universal-time)) ) mengembalikan nilai terbanyak dari hampir semua fungsi standar di common lisp ... 9, tepatnya. Nilai pengembalian ke-3 ( (nth-value 2 ...)) adalah jam saat ini dalam waktu 24 jam. Maka itu hanya menghitung indeks yang tepat ke dalam daftar tanggapan dan meneruskannya ke nth. Saya harus menggunakan di floorsini karena CL akan mengembalikan sebagian yang tepat jika saya digunakan /untuk pembagian.

Cobalah online!


1

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

Menggunakan rumus @ TFeld. Versi dependen-lokal hanya 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 # (Visual C # Interactive Compiler) , 91 byte

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

Cobalah online!

Gunakan Utc Now untuk mendapatkan waktu UTC.

Jika itu bisa menjadi fungsi dan bukan program lengkap:

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

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

Cobalah online!

Uji dengan semua jam (kode dicuri tanpa malu-malu dari Arnauld)


Ini bagus sekali! Meskipun Anda mungkin harus menggunakan DateTime.UtcNowuntuk mendapatkan zona waktu yang benar.
dana

Anda dapat menghapus karakter titik koma ( ;) yang tertinggal !
dana

Titik koma benar-benar menyelinap oleh saya. Terima kasih!
Perwujudan Ketidaktahuan

0

05AB1E , 45 42 byte

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

(h*7%20%7)//2diangkut dari jawaban JavaScript (ES6) @ Arnauld .

Cobalah online atau verifikasi semua jam .


Jawaban 45 byte asli:

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

Cobalah online atau verifikasi semua jam .

Penjelasan:

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

Lihat penjelasannya di sini untuk memahami mengapa ”‚¿”"Baik"; '•´adalah "pagi"; '¯âadalah "sore"; dan 'žÖ"malam".


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}

Cobalah online!

Perintah 2Dmengembalikan bagian jam dari waktu saat ini dan sisanya adalah memuat pernyataan 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

Satu-satunya trik yang benar-benar licik adalah memaksa jam ke dalam unsigned intsehingga saya bisa memaksa nilai malam ke> 14. Karena struct tmstruktur hanya memiliki bilangan bulat, saya bisa berpura-pura bahwa itu adalah array yang dilewatkan 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]);}

Cobalah online!


Sarankan (char*[]){"morning","afternoon","evening"}alih-alihs
ceilingcat

0

J, 65 byte

Port lain dari jawaban TFeld.

('Zzz','Good '&,&>;:'morning afternoon evening'){~<.6%~20|3{6!:0''
  • 3{6!:0'' mendapat jam, yang merupakan indeks 3 dari vektor waktu saat ini, dari builtin 6!:0''
  • <.6%~20| adalah lantai ((jam mod 20) dibagi 6)
  • gunakan itu sebagai indeks {~ke dalam array karakter 4x14 yang berisi salam.
  • menyimpan beberapa karakter dengan menggabungkan ( ,) string Gooddengan kata-kata morning, afternoondan eveningyang split pada spasi dengan J "kata" tokenizer ( ;:). Secara teknis ini untuk tokenizing kalimat J, tetapi karena J memiliki kata-kata kosong itu akhirnya terbelah di spasi putih.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.