我吃过午饭了吗?


15

你喜欢午餐。但是,您正在节食,并希望确保自己一天之内不吃午餐两次。因此,您需要制作一个程序来帮助您确定。

但是,一个复杂的问题是您吃午餐的时间很奇怪。午餐时间为MONTH:DAY PM(您可以使用UTC或本地化时区)。没错,如果一天是7月14日,那么您将在7:14 PM吃午餐。

对于您的程序,您需要使用当前日期和时间(不要输入),并且如果您当天已经吃过午餐(或者现在是午餐时间),则需要输出一致的真实值,或者输出一致的虚假值。如果还没有。

示例:(运行程序的时间=>输出)

  • 5月4日上午11:35 =>否(您将在5:04 PM吃午餐)
  • 6月3日下午5:45 =>否(您将在6:03 PM吃午餐)
  • 7月28日晚上8:30 =>正确(您在晚上7:28吃了午餐)
  • 12月15日下午3:25 =>正确(您在12:15 PM吃了午餐)
  • 2月29日下午2:29 =>正确(恰好是午餐时间)
  • 10月12日12:00 AM =>否(一天刚刚开始)

参考:

12小时制的工作原理


我们不能使用UTC吗?
Xcoder先生17年

@ Mr.Xcoder是的,实际上还可以。我会澄清。
geokavel

5
如果您仅在一天的某个特定时间吃午餐,您怎么能吃两次呢?= p
jpmc26

1
@分数。至少可以说这个世纪。
geokavel

3
大家不是都这样吃午餐吗?真的只有我吗?
caird coinheringaahing

Answers:


7

迅捷 3,310字节

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

一探究竟!

分别打印truefalse,以表示真实和错误。

注意:这仅在9999年11:59:59 PM之前有效,因为它使用字符串比较日期。


2
Swifts的子字符串总是让我痛苦地看着> _ <:P
Downgoat '17

3

05AB1E15 18字节

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

在线尝试!

说明

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

我认为这行不通。因为现在是世界标准时间上午12:51,并且正在输出
1。– geokavel

Nvm刚意识到我要检查不是下午。固定为3个字节。
Datboi '17年

2

八度,61字节

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

在线尝试!

说明:

首先是功能:

  • now()以十进制格式返回时间。括号是可选的。
  • datestr 将十进制数转换为其第二个参数中给出的格式的字符串
  • str2num 将字符串转换为数字
  • diff 取两个数字之差

分解:

我们从中间考虑:

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

datestr(now,'mmddHHMM'):首先,我们将当前时间now作为输入datestr并指定格式mmddHHMM。字母的含义是:mm = month,,dd = dayHH = hourMM = minutesAM指定小时应采用12小时格式。不包括分隔符,以使其尽可能短。它d = 07142117在撰写本说明时输出。x从现在开始,我将参考该部分。

[(d=x)(1:4);d(5:8)]:将上面的字符串存储为d,然后创建一个包含两个元素的数组,前四个字符,然后是5-9个字符。这给出了

ans =
0714
2122

数字存储为字符串而不是数字的地方。我们称其为上面的结果y

str2num(y)将字符数组转换为数字,其中每一行变成一个数字。这给了[714; 2122]。我们将结果称为z

diff(z)>1200取两个数字之间的差,并检查当前时间是否比当前日期高1200。这占AM / PM。这给了我们想要的结果。


这会检查它是否实际上是下午吗?
michi7x7

现在可以了。:)
Stewie Griffin

如果“ mmdd”为“ 1201”,“ HHMM”为“ 1215”,这应该是正确的,不是吗?我不得不在那个月使用mod 12来解决这个问题。
michi7x7

2

Pyth,22 21 20字节

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

-1个字节,感谢@ Mr.Xcoder

尝试这个!

旧方法,22 20字节

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

尝试一下!

说明

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

&g.d6+.d4 12g.d5.d719个字节无法使用?我不确定,还没有真正测试过,但是……
Xcoder先生17年

&g.d6+12.d4g.d5.d7实际是18岁 另外,在旧方法中,我认为您不需要`,而该长度将变为18个字节。我不知道,我可能错了。
Xcoder先生

@ Mr.Xcoder如果使用&,则两者都必须为真,例如在您的代码22:17中将不会算作19:15之后,因为分钟是错误的。我可以删除一些```,但不能全部删除。谢谢您为我节省了一个字节。
KarlKastor

好的,我真的不知道这是否正确,我仍在学习Pyth:P
Xcoder先生17年

然后,我找到了一个替代解决方案g++720.d5*60.d4+*60.d6.d7,但是不幸的是更长(25个字节)。但是,这可能是灵感的来源,我想我应该提一下。
Xcoder先生17年

2

C#,174个字节

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

在线尝试!


我认为您不能增加小时和分钟,必须进行设置。

1
创建一个匿名操作(()=>...Action<bool>以节省字节。使用DateTime.Now访问月份和日期时。通常public不需要,Program可以只是一个字母。使用using D=System.DateTime;保存bytes.Overall不错的想法,但可以golfed很多。欢迎来到PPCG!
TheLethalCoder

@TheLethalCoder感谢您的建议!这是我第一次参加标准高尔夫,但是我一定会再尝试的!
pritch90 '17

2

PHP和其他具有以下常用功能的语言:大约28到29个字节:

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

或者

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

两者都将打印。

可能?1:0取决于表示形式。如果使用的语言具有隐式回显或没有最终的';',则可能会削减字节。

为什么一个人将这些值放入变量,而其余的则在不需要时:)
date()将任何内容保留为未定义的文字,因此例如7 May 2017 17:22:43将表达式传递1722 - 1200 >= 507给eval()。通过将字节更改为等效字节来保存字节1722 - 1199 > 507

谁说埃瓦尔死了?;-)


2

Java,81个字节

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

在线尝试!

取消高尔夫:

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
这样可以正确处理12月吗?我已经很长时间没有使用Java了,但这看起来可能是12月1日至24:01,而不是正午之后。
Mark S.

不要忘记java.util.Date在字节数中包括您的导入。
雅各布

2

Haskell中,135个 129字节

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

这种解压缩很烦人,也许字符串处理更适合

// edit:模式保护5个字节的安全


2

Mathematica,65 64 62字节

3个程序

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

如果在Mathematica中算作单个字节,则每个字节少一个字节。

说明

  1. Date[]以形式返回列表{y,m,d,h,m,s}。所以 Date[][[4;;5]]是时间和当前时间的分钟。
  2. p=Date[][[#]]&;创建p一个函数,该函数接受所需的索引并为我们提供日期的那些部分。
  3. {60,1}.#&是一个匿名函数,它使用{60,1}和的点积与输入来比较时间。比短一字节TimeObject
  4. p@2等于p[2],月份的数字。
  5. +{12+p@2~Mod~12,0}添加{12,0}到我们不在十二月的月份和日期,{0,0}否则添加。(谢谢,michi7x7!)
  6. >= 是比较运算符,但是我们无法将{hours,minutes}与{adjusted month,date}进行逐项比较...
  7. /@映射{60,1}.#&到括号中不等式的两侧,因此我们可以正确比较时间。
  8. 对于以开头的程序{60,1}.#&,它们用于#表示一个大型匿名函数的输入,并&表示结束。
  9. @Date[] 将big函数的行(提取列表的一部分)应用于日期列表本身。
  10. [Date[][[#]]&] 将big函数在其行上应用于另一个匿名函数,该匿名函数提取日期列表的一部分。

奖金

顺便说一句,如果我们在凌晨1点到12:59 PM之间吃午餐,那么我们只需使用即可节省25个字节{60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3)

您可以通过将代码粘贴到Wolfram Cloud沙箱中并单击Gear-> Evaluate Cell或按Shift + Enter或Numpad Enter 来测试所有这些。


我相信,你的奖金笔记实际上是一个有效的解决方案-为您的有效时间访问13:0124:31
泰勒·斯科特

@TaylorScott感谢您对代码进行格式化(尽管在某些棘手的情况下着色似乎失败了)。不过,我不确定我是否理解您的评论。如果是7月19日上午7:20,那么即使离下午7:20晚上很远,“奖励”代码也会显示“是的,您已经吃过午餐”。OP在AM中具有测试用例,因此我认为这使其无效。我想念什么?
马克S.17年

@分数。我看到-由于某种原因,我读到的时间是晚上11:59而不是12:59-是否没有简洁的方法将12小时添加到奖励代码中?
泰勒·斯科特

1
@TaylorScott好吧,我们希望在大多数月份中将小时数增加12,因此从1月到11月,我们可以将Date[]奖金 替换为(Date[]+{0,12,0,0,0,0})(可能有一种打高尔夫球的方法,但是12UnitVector[6,2]更长一些)。问题在于,在12月3日这样的日期,我们在12:03而不是24:03吃午餐,因此除了12月,我们需要添加12 。这要求我们要么1.窥视日期以查看我们是否在12月(如我的回答),要么2.编写一个函数来检查事实之后是否到达了24:XX,这将是更长。
Mark S.

1
@分数。12 + Mod [#[[2]],12]吗?
michi7x7 '17

1

JavaScript(ES6),75个字节

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>

那些长函数名...



1

R,92字节

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

在线尝试!

                                   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个字节

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

例:

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

口译员在这里可用

旧版本

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

2$盘将转向66_,而不是_6,所以你想要(-2)$的,但你可以通过使用简写抵消这些额外的3个字符string 作为($)...或者,而不是使用$垫,在前面加上“0”,然后取最后2字符: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mm(dd$\:x}代表49个字节)
街头流氓,

好地方。原来是无效的。我添加了一个更短的版本
skeevey

1

JavaScript,75个字节

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

等效于以下代码:

function didEat()
  const d = new Date()
  d.setHours(12 /* PM */ + d.getMonth() + 1)
  d.setMinutes(d.getDate())
  return new Date > d
}
didEat()

最后一个t可以在修改时使用
l4m2

t=new Date,t.setMinutes(t.getDate(t.setHours(13+t.getMonth(n=+t))))<n
l4m2

1

Python 2.7,130个字节

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

在线尝试

注意:标志可能有问题。请原谅,因为我关注IST,而现在却是凌晨2点28分,这非常令人困惑。如果感觉不对,请更正该标志。


1

Perl,45个字符

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

如果我必须提供一种方法,则为45 sub c{...}。如果必须打印,say ()||0甚至可以打印47。如果需要, 我会在其中添加。


我相信,因为原始问题指定you need to make a program to help you make sure了不允许使用摘录-表示您列出的任何一种输出方法通常被认为是有效的
Taylor Scott

1
公平地说,我将提供输出。感谢您的编辑,我不知道正确的语言标签!我以为perl -e总体上还可以,但是其他人都提供了功能,所以我对其进行了编辑
。– bytepusher

1

Excel,52 50 49字节

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

输入是任何单元格中的此公式。
输出为TRUEFALSE

Excel的内置日期处理功能很有帮助。
TIME函数返回当天的午餐时间作为时间值,如果将其转换为日期,将使用Jan 0, 1900。我们将其与进行比较,NOW - TODAY以便获得日期时间为0或的当前时间Jan 0, 1900

Wernisch节省了2个
字节Adam节省了1个字节


您是否需要在NOW()-TODAY()周围添加大括号?
Wernisch '17

@Wernisch不,事实证明。我以为它会在减法之前评估不平等,但我没有检查。谢谢。
工程师吐司

我认为您可以通过更改为now()-today()来节省一个字节mod(now(),1)
亚当(Adam)

0

JavaScript,62个字符

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

测试代码如下:


0

Excel VBA,55字节

匿名VBE立即窗口函数,不接受任何输入,并输出一个布尔值,该值表示我是否已经在VBE立即窗口中吃过午餐

n=Now:?TimeValue(n)>TimeValue(Month(n)&":"&Day(n)&"PM")

0

红宝石,64 + 7 = 71字节

-rtime之所以需要该标志,是因为出于某种原因Time::parse,例如,唯一的功能是将其从整个Time模块中移除。

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

在线尝试!(它还会打印出当前时间)


0

朱莉娅0.6.0 99字节

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

Julia具有内置功能,可以使用计算机的时钟/日历。我的计算机正在ubuntu 16.04上运行,并且已经有12个小时的时钟,因此我不能说我所做的工作是否与使用不同时钟的其他计算机一起使用,但似乎可以在我的计算机上使用。


0

JavaScript ES6,70字节

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

也许在几毫秒内就不对了...


0

Matlab,241个字节

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

说明:首先,我以字符串形式获取日期。然后,我将月份和日期隔离。由于问题指出始终将其解释为PM,因此如果时间在AM中,我会自动写入false。如果当前时间是下午,那么我继续并比较时间数。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.