Tôi đã ăn trưa chưa


15

Bạn thích ăn trưa. Tuy nhiên, bạn đang ăn kiêng và muốn chắc chắn rằng bạn không vô tình ăn trưa hai lần trong một ngày. Vì vậy, bạn cần phải làm một chương trình để giúp bạn chắc chắn.

Tuy nhiên, một điều phức tạp là bạn ăn trưa theo một lịch trình rất kỳ lạ. Thời gian bạn ăn trưa vào lúc THÁNG: NGÀY PM (bạn có thể sử dụng UTC hoặc múi giờ địa phương). Đúng vậy, nếu ngày là 14 tháng 7 , bạn ăn trưa lúc 7:14 PM .

Đối với chương trình của bạn, bạn cần sử dụng ngày và giờ hiện tại (không lấy đầu vào) và đưa ra một giá trị trung thực nhất quán nếu bạn đã ăn trưa trong ngày (hoặc bây giờ là giờ ăn trưa) hoặc giá trị sai lệch nhất quán nếu bạn không

Ví dụ: (Thời gian bạn chạy chương trình => đầu ra)

  • Ngày 4 tháng 5 11:35 AM => sai (bạn sẽ ăn trưa lúc 5:04 chiều)
  • Ngày 3 tháng 6 5:45 PM => sai (bạn sẽ ăn trưa lúc 6:03 tối)
  • 28 tháng 7 8:30 PM => đúng (bạn đã ăn trưa lúc 7:28 PM)
  • 15 tháng 12 3:25 PM => đúng (bạn đã ăn trưa lúc 12:15 PM)
  • 29 tháng 2 2:29 PM => đúng (chính xác là giờ ăn trưa)
  • Ngày 12 tháng 10 12:00 AM => sai (ngày mới bắt đầu)

Tài liệu tham khảo:

Làm thế nào một đồng hồ 12 giờ hoạt động


Chúng ta không thể sử dụng UTC thay thế?
Ông Xcoder

@ Mr.Xcoder Vâng, thực sự đó là ok. Tôi sẽ làm rõ.
geokavel

5
Nếu bạn chỉ ăn trưa vào một thời điểm cụ thể trong ngày, làm thế nào bạn có thể ăn nó hai lần? = p
jpmc26

1
@Điểm. Ít nhất là trong thế kỷ này, hãy nói.
geokavel

3
Không phải ai cũng ăn bữa trưa như thế này sao? Có thực sự chỉ có tôi?
caird coinheringaahing

Câu trả lời:


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

Kiểm tra nó ra!

Điều này in truefalse, cho sự thật và giả tương ứng.

LƯU Ý : Điều này chỉ hoạt động cho đến năm 9999, lúc 11:59:59 tối, vì nó sử dụng Chuỗi để so sánh ngày.


2
Sự thay đổi nền tảng luôn làm tôi đau đớn khi nhìn vào> _ <: P
Downgoat

3

05AB1E , 15 18 byte

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

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

Giải trình

ž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?

Tôi không nghĩ rằng nó hoạt động. Bởi vì đó là 12:51 AM UTC ngay bây giờ và nó xuất ra 1.
geokavel

Nvm chỉ nhận ra tôi đang kiểm tra không phải là chiều. Đã sửa với giá 3 byte.
Datboi

2

Octave , 61 byte

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

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

Giải trình:

Đầu tiên các chức năng:

  • now()trả về thời gian trên một định dạng thập phân. Các dấu ngoặc là tùy chọn.
  • datestr chuyển đổi một số thập phân thành một chuỗi trên định dạng được đưa ra trong đối số thứ hai của nó
  • str2num chuyển đổi một chuỗi thành một số
  • diff có sự khác biệt giữa hai số

Phá vỡ:

Chúng tôi lấy cái này từ giữa:

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

datestr(now,'mmddHHMM'): Đầu tiên chúng tôi lấy thời gian hiện tại nowlàm đầu vào datestrvà chỉ định định dạng mmddHHMM. Các chữ có nghĩa là: mm = month, dd = day, HH = hour, MM = minutesAMquy định cụ thể rằng giờ nên được trên một định dạng 12-giờ. Không có dải phân cách được bao gồm, để giữ nó càng ngắn càng tốt. Nó xuất ra d = 07142117vào thời điểm viết lời giải thích này. Tôi sẽ đề cập đến phần đó kể xtừ bây giờ.

[(d=x)(1:4);d(5:8)]: Lưu trữ chuỗi ở trên, như d, sau đó tạo một mảng có hai phần tử, bốn ký tự đầu tiên, sau đó là 5-9 ký tự. Điều này mang lại :

ans =
0714
2122

Trong đó các số được lưu trữ dưới dạng chuỗi, không phải số. Chúng tôi sẽ gọi kết quả ở trên cho ybên dưới.

str2num(y)chuyển đổi mảng ký tự thành số, trong đó mỗi hàng biến thành một số. Điều này cho [714; 2122]. Chúng tôi sẽ gọi kết quả cho z.

diff(z)>1200lấy chênh lệch giữa hai số và kiểm tra nếu thời gian hiện tại cao hơn 1200 so với ngày hiện tại. Tài khoản này cho AM / PM. Điều này cho chúng ta kết quả mong muốn.


Kiểm tra này nếu nó thực sự PM?
michi7x7

Nó làm ngay bây giờ. :)
Stewie Griffin

Nếu "mmdd" là "1201" và "HHMM" là "1215" thì điều này có đúng không? Tôi đã phải sử dụng mod 12 vào tháng để giải thích điều đó bằng cách nào đó.
michi7x7

2

Pyth, 22 21 20 byte

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

-1 byte nhờ @ Mr.Xcoder

Thử đi!

cách tiếp cận cũ, 22 20 byte

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

Thử nó!

giải trình

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

Sẽ không &g.d6+.d4 12g.d5.d7làm việc cho 19 byte? Tôi không chắc chắn và chưa thực sự thử nghiệm nó nhưng ...
Ông Xcoder

&g.d6+12.d4g.d5.d7sẽ là 18 thực sự. Ngoài ra, theo cách tiếp cận cũ, tôi không nghĩ bạn cần `và điều đó sẽ trở thành dài 18 byte. Tôi không biết, tôi có thể sai.
Ông Xcoder

@ Mr.Xcoder nếu bạn sử dụng và sau đó cả hai phải đúng, ví dụ như trong mã của bạn, 22:17 sẽ không được tính là sau 19:15, vì số phút là sai. Tôi có thể loại bỏ một số `` `, nhưng không phải tất cả chúng. Cảm ơn bạn đã tiết kiệm cho tôi một byte.
KarlKastor

Ok, tôi thực sự không biết điều đó có đúng không, tôi vẫn đang học Pyth: P
Ông Xcoder

Sau đó, tôi đã tìm thấy một giải pháp thay thế g++720.d5*60.d4+*60.d6.d7, nhưng điều đó không may là lâu hơn (25 byte). Tuy nhiên, nó có thể là một nguồn cảm hứng và tôi nghĩ rằng tôi nên đề cập đến nó.
Ông 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));}}

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


Tôi không nghĩ bạn có thể thêm giờ và phút, bạn phải đặt chúng.
Mùa đông

1
Tạo một hành động ẩn danh ( ()=>...) như Action<bool>để lưu byte. Sử dụng DateTime.Nowkhi truy cập tháng và ngày. Nói chung publiclà không cần thiết và Programcó thể chỉ là một chữ cái. Sử dụng using D=System.DateTime;để tiết kiệm byte. Ý tưởng hay nhưng có thể được chơi rất nhiều. Chào mừng đến với PPCG!
TheLethalCoder

@TheLethalCoder cảm ơn vì lời khuyên! Đây là lần đầu tiên tôi chơi golf mã nhưng chắc chắn tôi sẽ cố gắng nhiều hơn nữa!
pritch90

2

PHP và các ngôn ngữ khác có các hàm phổ biến này: khoảng 28 đến 29 byte:

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

Hay cách khác

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

cả hai sẽ in.

có thể với ?1:0tùy thuộc vào đại diện. Có thể cắt byte nếu một ngôn ngữ được sử dụng có tiếng vang ngầm hoặc không có âm cuối ';'.

Tại sao người ta sẽ lấy các giá trị thành các biến và tất cả phần còn lại, khi không cần thiết :)
date()để lại bất cứ thứ gì dưới dạng chữ không được xác định, ví dụ, 7 May 2017 17:22:43chuyển biểu thức 1722 - 1200 >= 507sang eval (). Byte được lưu bằng cách thay đổi nó thành tương đương 1722 - 1199 > 507.

Ai nói eval đã chết? ;-)


2

Java, 81 byte

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

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

Ung dung:

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
Điều này có xử lý chính xác tháng 12 không? Tôi đã không làm việc với Java trong một thời gian dài, nhưng có vẻ như nó có thể gửi ngày 1 đến 24:01 thay vì chỉ sau buổi trưa.
Đánh dấu S.

Đừng quên bao gồm nhập của bạn java.util.Datetrong số 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

việc giải nén này khá khó chịu, có thể xử lý chuỗi phù hợp hơn

// chỉnh sửa: mẫu bảo vệ an toàn 5 byte


2

Toán học, 65 64 62 byte

3 chương trình

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[][[#]]&]

Đây là mỗi byte ít hơn nếu được tính là một byte đơn trong Mathicala.

Giải thích

  1. Date[]trả về một danh sách trong mẫu {y,m,d,h,m,s}. Vì vậy, Date[][[4;;5]]giờ và phút của thời gian hiện tại.
  2. p=Date[][[#]]&;tạo pmột hàm lấy các chỉ số chúng ta muốn và cung cấp cho chúng ta các phần của ngày.
  3. {60,1}.#&là một hàm ẩn danh lấy sản phẩm chấm {60,1}và đầu vào để có cách so sánh thời gian. Nó ngắn hơn một byte TimeObject.
  4. p@2 tương đương với p[2] , số tháng.
  5. +{12+p@2~Mod~12,0}thêm {12,0}vào tháng và ngày khi chúng ta không ở trong tháng 12 và thêm vào đó {0,0}. (Cảm ơn, michi7x7!)
  6. >= là toán tử so sánh, nhưng chúng ta không thể so sánh {giờ, phút} với {tháng điều chỉnh, ngày} ...
  7. /@ánh xạ {60,1}.#&tới cả hai mặt của bất đẳng thức trong ngoặc đơn, vì vậy chúng ta có thể so sánh chính xác thời gian.
  8. Đối với các chương trình bắt đầu {60,1}.#&, chúng sử dụng #để thể hiện đầu vào cho một hàm ẩn danh lớn và &để biểu thị sự kết thúc.
  9. @Date[] Áp dụng hàm lớn trên dòng của nó (trích các phần của danh sách) vào chính danh sách ngày.
  10. [Date[][[#]]&] Áp dụng hàm lớn trên dòng của nó cho một hàm ẩn danh khác, một hàm trích ra các phần của danh sách ngày.

Tặng kem

Bên cạnh đó, nếu chúng ta ăn trưa trong khoảng thời gian từ 1 giờ sáng đến 12 giờ 59 phút, thì chúng ta có thể tiết kiệm 25 byte chỉ bằng {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3) .

Bạn có thể kiểm tra tất cả những thứ này bằng cách dán mã vào hộp cát Wolfram Cloud và nhấp vào Gear-> Đánh giá ô hoặc nhấn Shift + Enter hoặc Numpad Enter.


Tôi tin rằng nốt tiền thưởng của bạn thực sự là một giải pháp hợp lệ - như tên miền của bạn lần hợp lệ là 13:01để24:31
Taylor Scott

@TaylorScott Cảm ơn định dạng mã (mặc dù việc tô màu dường như không thành công trong một số trường hợp phức tạp hơn). Tôi không chắc chắn tôi hiểu bình luận của bạn, mặc dù. Nếu Nếu là 7:20 sáng ngày 19 tháng 7, thì mã "phần thưởng" sẽ nói "có, bạn đã ăn trưa" mặc dù cách xa 7:20 PM. OP có các trường hợp thử nghiệm vào sáng nên tôi nghĩ điều này làm cho nó không hợp lệ. Tôi đang thiếu gì?
Đánh dấu S.

@Điểm. Tôi thấy - vì một số lý do tôi đã đọc rằng là 11:59 tối chứ không phải 12:59 - không có cách nào ngắn gọn để thêm 12 giờ vào mã thưởng?
Taylor Scott

1
@TaylorScott Vâng, chúng tôi muốn thêm 12 giờ trong hầu hết các tháng để từ tháng 1 đến tháng 11, chúng tôi có thể thay thế Date[]phần thưởng bằng (Date[]+{0,12,0,0,0,0})(có thể có một cách để chơi golf, nhưng 12UnitVector[6,2]lâu hơn). Vấn đề là vào những ngày như ngày 3 tháng 12, chúng tôi ăn trưa vào lúc 12:03 chứ không phải 24:03, vì vậy chúng tôi cần thêm 12 trừ tháng 12 . Điều này đòi hỏi chúng ta phải 1. nhìn vào ngày để xem liệu chúng ta có vào tháng 12 hay không (như trong câu trả lời của tôi) hoặc 2. viết một hàm kiểm tra nếu chúng ta đã đi đến 24: XX sau khi thực tế, đó sẽ là lâu hơn.
Đánh dấu S.

1
@Điểm. 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>

Những tên hàm dài đó ...



1

R , 92 byte

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

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

                                   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

Thí dụ:

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

Thông dịch viên có sẵn ở đây

Phiên bản cũ

{x:.z.p;x>"T"$":"sv"0"^2$/:string 12 0+`mm`dd$\:x}`

Các 2$pad sẽ lần lượt 6đến 6_chứ không phải _6, vì vậy bạn muốn (-2)$, nhưng bạn có thể hủy bỏ những thêm 3 ký tự bằng tốc ký cho string như ($)... hoặc thay vì sử dụng $ để pad, hãy thêm "0" và sau đó đi qua 2 ký tự: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mm dd$\:x}cho 49 byte
streetster

điểm tốt. bản gốc không hợp lệ. tôi đã thêm một phiên bản thậm chí còn ngắn hơn
36 phút

1

JavaScript, 75 byte

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

Tương đương với mã sau:

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.

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.