Apakah saya sudah makan siang?

15

Kamu suka makan siang Namun, Anda melakukan diet dan ingin memastikan Anda tidak makan siang dua kali dalam satu hari. Jadi, Anda perlu membuat program untuk membantu Anda memastikan.

Namun, satu komplikasi adalah Anda makan siang dengan jadwal yang sangat aneh. Waktu Anda makan siang adalah BULAN: HARI PM (Anda dapat menggunakan UTC atau zona waktu setempat). Itu benar, jika hari ini 14 Juli , Anda makan siang pukul 19:14 .

Untuk program Anda, Anda perlu menggunakan tanggal dan waktu saat ini (jangan mengambil input), dan menampilkan nilai kebenaran yang konsisten jika Anda sudah makan siang hari itu (atau sekarang waktu makan siang), atau nilai falsy yang konsisten jika belum.

Contoh: (Waktu Anda menjalankan program => keluaran)

  • 4 Mei 11:35 AM => false (Anda akan makan siang pukul 17:04)
  • 3 Juni 5:45 PM => false (Anda akan makan siang pukul 18:03)
  • 28 Juli 8:30 PM => benar (Anda makan siang pukul 19:28)
  • 15 Desember 3:25 PM => true (Anda makan siang pukul 12:15)
  • 29 Februari 2:29 PM => true (tepat waktu makan siang)
  • 12 Oktober 12:00 AM => false (hari baru dimulai)

Referensi:

Bagaimana jam 12 jam bekerja

geokavel
sumber
Tidak bisakah kita menggunakan UTC saja?
Tn. Xcoder
@ Mr.Xcoder Ya, sebenarnya tidak apa-apa. Saya akan mengklarifikasi.
geokavel
5
Jika Anda makan siang hanya pada satu waktu tertentu dalam sehari, bagaimana Anda bisa memakannya dua kali? = p
jpmc26
1
@Tanda. Setidaknya abad ini, katakanlah.
geokavel
3
Tidak semua orang makan siang seperti ini? Apakah hanya aku yang benar-benar?
caird coinheringaahing

Jawaban:

7

Swift 3 , 310 byte

import Foundation;var n=String(describing:Date());var k=n.startIndex;print(Int(n[n.index(k,offsetBy:5)...n.index(k,offsetBy:6)])!*60+Int(n[n.index(k,offsetBy:8)...n.index(k,offsetBy:9)])!+720<=Int(n[n.index(k,offsetBy:11)...n.index(k,offsetBy:12)])!*60+Int(n[n.index(k,offsetBy:14)...n.index(k,offsetBy:15)])!)

Coba lihat!

Ini mencetak truedan false, masing-masing untuk kebenaran dan kepalsuan.

CATATAN : Ini hanya berfungsi sampai tahun 9999, pada 11:59:59 malam, karena menggunakan String untuk membandingkan tanggal.

Tuan Xcoder
sumber
2
Substing Swifts selalu membuatku sedih untuk melihat> _ <: P
Downgoat
3

05AB1E , 15 18 byte

žežb‚žf12+ža‚т*+`‹

Cobalah online!

Penjelasan

žežb‚žf12+ža‚т*+`‹
že                 # Push current day
  žb               # Push current minute
    ‚              # Wrap to array
     žf12+         # Push current month and add 12 to it
       ža          # Push current hour
         ‚         # Wrap these two to array as well
          т*       # Multiply each element in the second array by 100
            +      # Add both arrays together
             `     # Flatten the resulting array to stack
              ‹    # Is the first item smaller than the second one?
Datboi
sumber
Saya pikir ini tidak berhasil. Karena sekarang jam 12:51 UTC, dan ini menghasilkan 1.
geokavel
Nvm baru sadar saya mengecek saya bukan pm. Diperbaiki dengan biaya 3 byte.
Datboi
2

Oktaf , 61 byte

diff(str2num([(d=datestr(now,'mmddHHMM'))(1:4);d(5:8)]))>1200

Cobalah online!

Penjelasan:

Pertama fungsinya:

  • now()mengembalikan waktu pada format desimal. Tanda kurung adalah opsional.
  • datestr mengkonversi angka desimal menjadi string pada format yang diberikan pada argumen kedua
  • str2num mengkonversi string menjadi angka
  • diff mengambil perbedaan antara dua angka

Kerusakan:

Kami mengambil ini dari tengah:

diff(str2num([(d=datestr(now,'mmddHHMM'))(1:4);d(5:8)]))>1200

datestr(now,'mmddHHMM'): Pertama, kami mengambil waktu saat ini nowsebagai input datestrdan menentukan format mmddHHMM. Surat-surat berarti: mm = month, dd = day, HH = hour, MM = minutesdan AMmenetapkan bahwa jam harus di format 12-jam. Tidak ada pemisah yang disertakan, untuk membuatnya sesingkat mungkin. Ini dihasilkan d = 07142117pada saat menulis penjelasan ini. Saya akan merujuk ke bagian itu xmulai sekarang.

[(d=x)(1:4);d(5:8)]: Menyimpan string di atas, saat d, lalu membuat array dengan dua elemen, empat karakter pertama, lalu 5-9 karakter. Ini memberi :

ans =
0714
2122

Di mana angka disimpan sebagai string, bukan angka. Kami akan memanggil hasil di atas untuk di ybawah ini.

str2num(y)mengubah susunan karakter menjadi angka, di mana setiap baris berubah menjadi satu angka. Ini memberi [714; 2122]. Kami akan memanggil hasilnya untuk z.

diff(z)>1200mengambil perbedaan antara dua angka dan memeriksa apakah waktu saat ini 1200 lebih tinggi dari tanggal saat ini. Ini menyumbang AM / PM. Ini memberi kita hasil yang diinginkan.

Stewie Griffin
sumber
apakah ini memeriksa apakah ini benar-benar PM?
michi7x7
Itu sekarang. :)
Stewie Griffin
Jika "mmdd" adalah "1201" dan "HHMM" adalah "1215" ini pasti benar, bukan? Saya harus menggunakan mod 12 pada bulan itu untuk menjelaskannya.
michi7x7
2

Pyth, 22 21 20 byte

<0+g.d7.d5-.d6+12.d4

-1 byte terima kasih kepada @ Mr.Xcoder

Coba ini!

pendekatan lama, 22 20 byte

<+`+12.d4.d5+`.d6.d7

Cobalah!

penjelasan

<0+g.d7.d5-.d6+12.d4
              +12.d4   # Add 12 to the current month to make it PM
          -.d6         # subtract that from the current hour: negative it is too early,
                       # positive when it is past this hour, zero when its the same hour
   g.d7.d5             # Is the minute greater or equal than the day? True=1; False=0
  +                    # Add this to the hour result,
                       # so that 0 can turn positive if minutes are true
<0                     # Is the result larger than 0 ?
KarlKastor
sumber
Tidak akan &g.d6+.d4 12g.d5.d7bekerja selama 19 byte? Saya tidak yakin dan belum benar-benar mengujinya tetapi ...
Tn. Xcoder
&g.d6+12.d4g.d5.d7akan menjadi 18 sebenarnya. Juga, dalam pendekatan lama saya tidak berpikir Anda perlu `, dan itu akan menjadi 18 byte. Saya tidak tahu, saya mungkin salah.
Tn. Xcoder
@ Mr.Xcoder jika Anda menggunakan & maka keduanya harus benar misalnya dalam kode Anda 22:17 tidak akan dihitung setelah 19:15, karena risalahnya salah. Saya dapat menghapus beberapa `` `, tetapi tidak semuanya. Terima kasih telah menyelamatkan saya satu byte.
KarlKastor
Ok, saya benar-benar tidak tahu apakah itu benar, saya masih belajar Pyth: P
Mr. Xcoder
Kemudian, saya telah menemukan solusi alternatif g++720.d5*60.d4+*60.d6.d7, tetapi sayangnya itu lebih lama (25 byte). Namun, itu mungkin menjadi sumber inspirasi dan saya pikir saya harus menyebutkannya.
Tn. Xcoder
2

C #, 174 byte

using System;public class Program{public static void Main(){Console.WriteLine(DateTime.Now>DateTime.Today.AddHours(DateTime.Today.Month+12).AddMinutes(DateTime.Today.Day));}}

Cobalah online!

pritch90
sumber
Saya tidak berpikir Anda dapat menambahkan jam dan menit, Anda harus mengaturnya.
Musim dingin
1
Buat tindakan anonim ( ()=>...) Action<bool>untuk menyimpan byte. Gunakan DateTime.Nowsaat mengakses bulan dan hari. Secara umum publictidak diperlukan dan Programbisa hanya satu huruf. Gunakan using D=System.DateTime;untuk menyimpan byte. Secara keseluruhan ide bagus tetapi bisa banyak bermain golf. Selamat datang di PPCG!
TheLethalCoder
@TheLethalCoder terima kasih atas sarannya! Ini adalah pertama saya pergi di golf kode tetapi saya pasti akan mencoba lebih banyak!
pritch90
2

PHP dan bahasa lain dengan fungsi-fungsi umum ini: sekitar 28 hingga 29 byte:

echo eval(date('Gi-1199>md')); 

atau sebagai alternatif

<?=eval(date('Gi-1199>md'))?>

keduanya akan dicetak.

mungkin dengan ?1:0tergantung pada representasi. Kemungkinan byte dipotong jika bahasa digunakan yang memiliki gema implisit, atau tidak ada akhir ';'.

Mengapa kita memasukkan nilai ke dalam variabel dan sisanya, ketika tidak diperlukan :)
date()meninggalkan apa pun sebagai literal yang tidak didefinisikan, jadi misalnya, 7 May 2017 17:22:43meneruskan ekspresi 1722 - 1200 >= 507ke eval (). Byte disimpan dengan mengubahnya ke setara 1722 - 1199 > 507.

Siapa bilang eval sudah mati? ;-)

Stilez
sumber
2

Java, 81 byte

n->new Date().after(new Date(){{setHours(getMonth()+13);setMinutes(getDate());}})

Cobalah online!

Tidak Disatukan:

n -> new Date().after(new Date() { //new Date() returns current date
    { //instance initialization
        setHours(getMonth() + 13); //month + 12 hours for PM + 1 because months are 0 indexed
        setMinutes(getDate()());
    }
})
Musim dingin
sumber
1
Apakah ini menangani Desember dengan benar? Saya sudah lama tidak bekerja dengan Java, tetapi ini sepertinya mengirim 1 Desember hingga 24:01 alih-alih setelah tengah hari.
Mark S.
Jangan lupa untuk memasukkan impor Anda java.util.Datedalam hitungan byte.
Jakob
2

Haskell, 135 129 byte

import Data.Time
x(ZonedTime(LocalTime d(TimeOfDay h m _))_)|(_,x,y)<-toGregorian d=return(mod x 12<h-12&&y<m)
y=getZonedTime>>=x

membongkar ini cukup mengganggu, mungkin penanganan string lebih cocok

// edit: pola penjaga aman 5 byte

michi7x7
sumber
2

Mathematica, 65 64 62 byte

3 Program

p=Date[][[#]]&;{60,1}.#&/@(p[4;;5]>=p[2;;3]+{12+p@2~Mod~12,0})

{60,1}.#&/@(#[[4;;5]]>=#[[2;;3]]+{12+#[[2]]~Mod~12,0})&@Date[]

{60,1}.#&/@(#[4;;5]>=#[2;;3]+{12+#@2~Mod~12,0})&[Date[][[#]]&]

Ini masing-masing kurang satu byte jika dihitung sebagai satu byte dalam Mathematica.

Penjelasan

  1. Date[]mengembalikan daftar dalam formulir {y,m,d,h,m,s}. Begitu Date[][[4;;5]] juga jam dan menit dari waktu saat ini.
  2. p=Date[][[#]]&; membuat p fungsi yang mengambil dalam indeks yang kita inginkan dan memberi kita bagian-bagian tanggal.
  3. {60,1}.#&adalah fungsi anonim yang mengambil titik produk {60,1}dan input untuk mendapatkan cara membandingkan waktu. Ini satu byte lebih pendek dariTimeObject .
  4. p@2sama dengan p[2], jumlah bulan.
  5. +{12+p@2~Mod~12,0}menambah {12,0}bulan dan tanggal saat kita tidak di bulan Desember, dan menambahkan{0,0} sebaliknya. (Terima kasih, michi7x7!)
  6. >= adalah operator perbandingan, tetapi kami tidak dapat membandingkan {jam, menit} dengan {bulan yang disesuaikan, tanggal} secara masuk ...
  7. /@ peta {60,1}.#& ke kedua sisi ketidaksetaraan dalam tanda kurung, sehingga kami dapat membandingkan waktu dengan benar.
  8. Untuk program yang dimulai dengan {60,1}.#&, mereka gunakan #untuk mewakili input ke fungsi anonim besar, dan& untuk menandakan akhir.
  9. @Date[] Menerapkan fungsi besar pada barisnya (yang mengekstrak bagian daftar) ke daftar tanggal itu sendiri.
  10. [Date[][[#]]&] Menerapkan fungsi besar di barisnya ke fungsi anonim lain, yang mengekstrak bagian dari daftar tanggal.

Bonus

Sebagai tambahan, jika kita makan siang antara jam 1 pagi sampai 12:59 malam, maka kita bisa menghemat 25 byte saja {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3) .

Anda dapat menguji semua ini dengan menempelkan kode ke kotak pasir Wolfram Cloud dan mengklik Gear-> Evaluate Cell atau tekan Shift + Enter atau Numpad Enter.

Tanda.
sumber
Saya percaya bahwa catatan bonus Anda sebenarnya adalah sebuah solusi yang valid - sebagai domain Anda kali valid 13:01untuk24:31
Taylor Scott
@TaylorScott Terima kasih atas pemformatan kode (meskipun pewarnaannya tampaknya gagal pada beberapa kasus yang lebih rumit). Saya tidak yakin saya mengerti komentar Anda. Jika Jika jam 7:20 pagi pada tanggal 19 Juli, maka kode "bonus" akan mengatakan "ya, Anda sudah makan siang" meskipun itu jauh dari jam 19.20. OP memiliki test case di AM jadi saya pikir ini membuatnya tidak valid. Apa yang saya lewatkan?
Mark S.
@Tanda. Saya melihat - untuk beberapa alasan saya telah membaca bahwa sebagai 11:59 daripada 12:59 - apakah tidak ada cara ringkas untuk menambahkan 12 jam ke kode bonus?
Taylor Scott
1
@TaylorScott Yah, kami ingin menambahkan 12 jam setiap bulan sehingga untuk Januari hingga November kami bisa mengganti Date[]bonus dengan (Date[]+{0,12,0,0,0,0})(mungkin ada cara untuk bermain golf itu, tetapi 12UnitVector[6,2]lebih lama). Masalahnya adalah bahwa pada tanggal-tanggal seperti 3 Desember, kita makan siang pukul 12:03, bukan 24:03, jadi kita perlu menambahkan 12 kecuali pada bulan Desember . Ini mengharuskan kita untuk 1. mengintip ke dalam tanggal untuk melihat apakah kita pada bulan Desember atau tidak (seperti dalam jawaban saya), atau 2. menulis fungsi yang memeriksa jika kita pergi ke 24: XX setelah fakta, yang akan menjadi lebih lama.
Mark S.
1
@Tanda. 12 + Mod [# [[2]], 12]?
michi7x7
1

JavaScript (ES6), 75 byte

f=
(d=new Date)=>(d.getHours()-d.getMonth()-13||d.getMinutes()-d.getDate())>=0
<input type=button value=Lunch? onclick=o.textContent=f()><tt id=o>

Nama-nama fungsi panjang ...

Neil
sumber
1

Python 3 , 104 byte

from datetime import*
n=datetime.now();print(n>=n.replace(hour=[0,n.month+12][n.month<12],minute=n.day))

Cobalah online!

Semua tes datetime. Saya mengganti 29 Februari dengan 28 Februari karena tanggal yang tidak valid tidak berfungsi.

tukang sihir
sumber
1

R , 92 byte

library(lubridate)
d=Sys.Date()
cat(Sys.time()>ymd_hm(paste0(d,'-',month(d)+12,'-',day(d))))

Cobalah online!

                                   month(d)+12,'-',day(d)    # get month and day and paste into a string, adding 12 hours for pm
                      paste0(d,'-',                      )   # add current date to beginning
               ymd_hm(                                    )  # turn whole thing into a date-time object
cat(Sys.time()>                                            ) # compare with current date-time and print
BLT
sumber
1

q, 31 byte

x>12:+"T"$(-3!x:.z.P)5 6 13 8 9

Contoh:

q).z.P
2017.07.16D19:35:26.654099000
q)x>12:+"T"$(-3!x:.z.P)5 6 13 8 9
1b

Penerjemah tersedia di sini

Versi lama

{x:.z.p;x>"T"$":"sv"0"^2$/:string 12 0+`mm`dd$\:x}`
skeevey
sumber
The 2$pad akan berubah 6ke 6_ketimbang _6, sehingga Anda ingin (-2)$, tapi Anda dapat membatalkan mereka tambahan 3 karakter dengan menggunakan singkatan untuk string sebagai ($)... atau bukan menggunakan $ untuk pad, tambahkan "0" dan kemudian mengambil 2 terakhir chars: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mm dd$\:x}for 49 bytes
streetster
tempat yang bagus. yang asli tidak valid. saya menambahkan versi yang lebih pendek
skeevey
1

JavaScript, 75 byte

t=new Date,t.setHours(13+t.getMonth()),t.setMinutes(t.getDate()),new Date>t

Yang setara dengan kode berikut:

function didEat()
  const d = new Date()
  d.setHours(12 /* PM */ + d.getMonth() + 1)
  d.setMinutes(d.getDate())
  return new Date > d
}
didEat()
Jrop
sumber
last t can be used while modify
l4m2
t=new Date,t.setMinutes(t.getDate(t.setHours(13+t.getMonth(n=+t))))<n
l4m2
1

Python 2.7, 130 bytes

from datetime import*
a=str(datetime.now()).split()
print int(''.join(a[0].split('-')[1:]))+1200<int(''.join(a[1].split(':')[:2]))

Try it online

Note: There may be a problem with the sign. Please excuse that because I follow IST and it's quite confusing because it's 2:28am here now. Do correct the sign if you feel it is wrong.

Koishore Roy
sumber
1

Perl, 45 chars

sub c{@a=gmtime;$a[2]-12>$a[4]&&$a[1]>=$a[3]}

If I have to provide a method, it will be 45 for sub c{...}. If I have to print say ()||0 even makes it 47. I will add that in if it's a requirement.

bytepusher
sumber
I believe that because the original question specifies you need to make a program to help you make sure that snippets are not allowed - that said either of your listed output methods are generally considered valid
Taylor Scott
1
fair enough, I will provide output then. Thanks for editing, I was not aware of the proper language tag! I was thinking perl -e was generally ok, but others have provided functions, so I edited it in.
bytepusher
1

Excel, 52 50 49 bytes

=TIME(MONTH(NOW())+12,DAY(NOW()),0)<=MOD(NOW(),1)

Input is this formula in any cell.
Output is either TRUE or FALSE.

Excel's built-in date handling helps a lot.
The TIME function returns the day's lunch time as a time value which, if converted to a date, would use Jan 0, 1900. We compare it against NOW - TODAY so we get the current time with a date value of 0 or Jan 0, 1900.

Saved 2 bytes thanks to Wernisch
Saved 1 byte thanks to Adam

Engineer Toast
sumber
Do you need the extra braces around NOW()-TODAY() ?
Wernisch
@Wernisch No, as it turns out. I had presumed it would evaluate the inequality before the subtraction but I didn't check it. Thanks.
Engineer Toast
I think you can save a byte by changing from now()-today() to mod(now(),1)
Adam
0

JavaScript, 62 chars

f=
_=>[,m,d,H,M]=(new Date).toISOString().split(/\D/),+m+12+d<=H+M

Test code below:

Tomas Langkaas
sumber
0

Excel VBA, 55 Bytes

Anonymous VBE immediate window function that takes no input and outputs a Boolean value representing whether I've had lunch to the VBE immediate window

n=Now:?TimeValue(n)>TimeValue(Month(n)&":"&Day(n)&"PM")
Taylor Scott
sumber
0

Ruby, 64+7 = 71 bytes

Requires the -rtime flag because for some reason Time::parse is like, the only function requires it out of the entire Time module.

p Time.parse("#{t=Time.now}"[/.+-(..)-(..) /]+[$1,$2]*?:+'pm')<t

Try it online! (it also prints out the current time)

Value Ink
sumber
0

Julia 0.6.0 99 bytes

a=split(string(Dates.today()),"-");(Dates.hour(now())<parse(a[2]))&&Dates.minute(now())<parse(a[3])

Julia has built in function to use the clock/calendar of the computer. My computer is running on ubuntu 16.04 and already with 12 hour clock, so I can't say if what I did works with other machine using different clock, but seems to works on my machine.

Goysa
sumber
0

JavaScript ES6, 70 Bytes

_=>(h=x=>new Date().toJSON().substr(x,5).replace(/\D/,0))(5)+12e3<h(11)

Maybe not that right on some milliseconds...

l4m2
sumber
0

Matlab, 241 bytes

dt=datestr(now,'mm/dd');
dt(2)
dt(4:5)
CrctLchTm=[' ' dt(2) ':' dt(4:5) ' PM']
CrntTm=datestr(now,'HH:MM PM')
CrntTm(7)=='A'
if ans==1
    Lch='false'
else
    CrctLchTm=str2num([CrctLchTm(2) CrctLchTm(4:5)])
    CrntTm=str2num([CrntTm(2) CrntTm(4:5)])
    CrntTm<CrctLchTm
    if ans==1
        Lch='false'
    else
        Lch='true'             
    end    
end

Explanation: First, I obtain the date as a string. Then, I isolate the month and day. Since the problem states that it is always interpreted as PM, then I automatically write false if the time is in AM. If the current time is in PM, then I continue on and just compare the numbers of the time.

Note: I've formatted it slightly differently here for readability.

a13a22
sumber