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


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.


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?

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.


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 ?

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!


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? ;-)


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()());
    }
})

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


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.


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



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

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

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

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.


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.


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


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:


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

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)


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.


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


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.

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.