Я уже обедал?

15

Ты любишь обедать. Тем не менее, вы находитесь на диете и хотите убедиться, что вы случайно не пообедаете дважды за один день. Поэтому вам нужно составить программу, которая поможет вам убедиться в этом.

Однако, одно осложнение состоит в том, что вы едите обед по очень странному графику. Время обеда - МЕСЯЦ: ДЕНЬ PM (вы можете использовать UTC или местный часовой пояс). Это верно, если день 14 июля , вы едите обед в 7:14 вечера .

Для вашей программы вам нужно использовать текущую дату и время (не вводите данные) и выводить постоянное истинное значение, если вы уже съели обед за день (или сейчас обеденное время), или постоянное ложное значение если нет

Примеры: (Время запуска программы => вывод)

  • 4 мая 11:35 => false (вы будете обедать в 17:04)
  • 3 июня, 17:45 => false (вы будете обедать в 18:03)
  • 28 июля 20:30 => правда (вы ели обед в 7:28 вечера)
  • 15 декабря 15:25 => правда (вы пообедали в 12:15)
  • 29 февраля 14:29 => правда (это точно обеденное время)
  • 12 октября, 12:00 => false (день только начался)

Ссылка:

Как работают 12-часовые часы

geokavel
источник
Разве мы не можем использовать UTC вместо этого?
Мистер Xcoder
@ Mr.Xcoder Да, на самом деле все в порядке. Я уточню.
геокавель
5
Если вы едите обед только в одно определенное время дня, как вы можете съесть его дважды? = p
jpmc26
1
@Метки. По крайней мере, в этом веке, скажем так.
геокавель
3
Разве все не едят свой обед таким образом? Это действительно только я?
Caird Coneheringaahing

Ответы:

7

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

Проверьте это!

Это печатает trueи falseдля правдивых и фальшивых соответственно.

ПРИМЕЧАНИЕ : это работает только до 9999 года, в 23:59:59 вечера, потому что он использует строки для сравнения дат.

Мистер Xcoder
источник
2
Стрижи подвигов всегда больно смотреть на> _ <: P
Downgoat
3

05AB1E , 15 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?
Datboi
источник
Я не думаю, что это работает. Потому что сейчас 0:51 UTC, и он
выводит
Nvm только что понял, что я проверяю, я не вечера. Исправлено по стоимости 3 байта.
Датбой
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 = day, HH = hour, MM = minutesи AMуказывает , что часы должны быть на 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. Это дает нам желаемый результат.

Стьюи Гриффин
источник
это проверяет, если это на самом деле PM?
michi7x7
Это сейчас. :)
Стьюи Гриффин
Если «mmdd» - «1201», а «ЧЧММ» - «1215», это должно быть правдой, нет? Мне пришлось использовать мод 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 ?
KarlKastor
источник
Не будет &g.d6+.d4 12g.d5.d7работать на 19 байтов? Я не уверен и на самом деле еще не проверял это, но ...
Мистер Xcoder
&g.d6+12.d4g.d5.d7было бы 18 на самом деле. Кроме того, в старом подходе я не думаю, что вам нужно `, и это станет длиной 18 байт. Я не знаю, я могу ошибаться.
Мистер Xcoder
@ Mr.Xcoder, если вы используете &, тогда оба должны быть истинными, например, в вашем коде 22:17 не будет считаться, как после 19:15, потому что минуты ложные. Я могу удалить некоторые из `` `, но не все из них. Спасибо, что спасли мне байт.
КарлКастор
Хорошо, я действительно не знал, было ли это правильно, я все еще изучаю Pyth: P
Mr. Xcoder
Затем я нашел альтернативное решение g++720.d5*60.d4+*60.d6.d7, но это, к сожалению, длиннее (25 байт). Тем не менее, это может быть источником вдохновения, и я решил, что должен упомянуть об этом.
г-н Xcoder
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));}}

Попробуйте онлайн!

pritch90
источник
Я не думаю, что вы можете добавить часы и минуты, вы должны установить их.
зима
1
Создать анонимное действие ( ()=>...) Action<bool>для сохранения байтов. Используйте DateTime.Nowпри доступе к месяцу и дню. В целом publicне требуется и Programможет быть только одна буква. Используйте, using D=System.DateTime;чтобы сохранить байты. В целом хорошая идея, но можно много играть в гольф. Добро пожаловать в PPCG!
TheLethalCoder
@TheLethalCoder спасибо за совет! Это был мой первый опыт в код-гольфе, но я обязательно попробую больше!
pritch90
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.

Кто сказал, что Эвал мертв? ;-)

Stilez
источник
2

Java, 81 байт

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

Попробуйте онлайн!

Ungolfed:

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
Правильно ли это относится к декабрю? Я долгое время не работал с Java, но похоже, что он может послать 1 декабря в 24:01 вместо полудня.
Марк С.
Не забудьте включить ваш импорт 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

эта распаковка довольно раздражает, может лучше подойдет обработка строк

// редактировать: шаблон защищает 5 байтов

michi7x7
источник
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. >= является оператором сравнения, но мы не можем сравнивать {часы, минуты} с {скорректированными месяцем, датой} начально ...
  7. /@отображает {60,1}.#&обе части неравенства в скобках, поэтому мы можем сравнивать время правильно.
  8. Для программ, которые начинаются с {60,1}.#&, они используют #для представления ввода в большую анонимную функцию и &для обозначения конца.
  9. @Date[] Применяет большую функцию в своей строке (которая извлекает части списка) к самому списку дат.
  10. [Date[][[#]]&] Применяет большую функцию в своей строке к другой анонимной функции, которая извлекает части списка дат.

бонус

Кроме того, если мы съели обед между 1:00 и 12:59 PM, то мы могли бы сэкономить 25 байтов всего {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3).

Вы можете проверить все это, вставив код в изолированную программную среду Wolfram Cloud и нажав Gear-> Evaluate Cell или нажав Shift + Enter или Numpad Enter.

Метки.
источник
Я считаю, что ваша бонусная заметка на самом деле является правильным решением, поскольку ваш домен 13:01 в24:31
Taylor Scott
@TaylorScott Спасибо за форматирование кода (хотя раскраска кажется неудачной в некоторых более сложных случаях). Я не уверен, что понимаю ваш комментарий. Если 19 июля будет 7:20 утра, то код «бонуса» скажет «да, вы пообедали», хотя это далеко от 7:20 вечера. У OP есть тестовые случаи в AM, поэтому я думаю, что это делает его недействительным. Что мне не хватает?
Марк С.
@Метки. Я вижу - по какой-то причине я прочитал это как 23:59, а не 12:59 - нет ли краткого способа добавить 12 часов к коду бонуса?
Тейлор Скотт
1
@TaylorScott Ну, мы хотим добавить 12 к часу в течение большинства месяцев, поэтому с января по ноябрь мы могли бы заменить Date[]бонус в (Date[]+{0,12,0,0,0,0})(возможно, есть способ сыграть в гольф, но12UnitVector[6,2] это дольше). Проблема в том, что в такие дни, как 3 декабря, мы едим обед в 12:03, а не в 24:03, поэтому нам нужно добавить 12, кроме декабря . Это требует от нас либо: 1. заглянуть внутрь даты, чтобы увидеть, в декабре мы или нет (как в моих ответах), либо 2. написать функцию, которая проверяет, перешли ли мы к 24: XX после факта, что будет дольше.
Марк С.
1
@Метки. 12 + Мод [# [[2]], 12]?
michi7x7
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
BLT
источник
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}`
skeevey
источник
2$Подушка превратится 6в 6_чем _6, так что вы хотите (-2)$, но вы можете отменить из этих дополнительных 3 символов с помощью стенографии для , string как ($)... или вместо $ раздуть, перед именем «0» , а затем взять последние 2 символы: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+мм dd$\:x}для 49 байт
streetster
хорошее место оригинал был недействительным. я добавил еще более короткую версию
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()
Jrop
источник
последний tможет быть использован при модификации
l4m2
t=new Date,t.setMinutes(t.getDate(t.setHours(13+t.getMonth(n=+t))))<n
м2
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. Я добавлю это, если это будет требованием.

bytepusher
источник
Я полагаю, что, поскольку в первоначальном вопросе указано, you need to make a program to help you make sureчто фрагменты не разрешены - при этом любой из перечисленных методов вывода, как правило, считается допустимым
Тейлор Скотт,
1
Если честно, я предоставлю вывод. Спасибо за редактирование, я не знал правильного языкового тега! Я думал, что в perl -eцелом все в порядке, но другие предоставили функции, поэтому я отредактировал его.
bytepusher
1

Excel, 52 50 49 байтов

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

Ввод этой формулы в любой ячейке.
Выход либо TRUEилиFALSE .

Встроенная обработка даты в Excel очень помогает. Функция возвращает время обеда дня в качестве значения времени , которое, если преобразуется в дату, будет использовать . Мы сравниваем его с тем, чтобы получить текущее время со значением даты или .
TIMEJan 0, 1900NOW - TODAY0Jan 0, 1900

Сэкономили 2 байта благодаря Вернишу Сэкономили
1 байт благодаря Адаму

Инженер Тост
источник
Вам нужны дополнительные скобки вокруг СЕЙЧАС () - СЕГОДНЯ ()?
Верниш
@ Верниш Нет, как оказалось. Я предполагал, что это будет оценивать неравенство до вычитания, но я не проверял это. Благодарю.
Тост инженера
Я думаю, что вы можете сохранить байт, изменив с now()-today()наmod(now(),1)
Адам
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])

Юлия имеет встроенную функцию, чтобы использовать часы / календарь компьютера. Мой компьютер работает на Ubuntu 16.04 и уже с 12-часовыми часами, поэтому я не могу сказать, работает ли то, что я делал, с другой машиной, использующей другие часы, но, кажется, работает на моей машине.

Goysa
источник
0

JavaScript ES6, 70 байт

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

Может быть, это не так на несколько миллисекунд ...

l4m2
источник
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, я автоматически пишу false, если время в AM. Если текущее время в PM, то я продолжаю и просто сравниваю числа времени.

Примечание: я отформатировал его немного по-другому для удобства чтения.

a13a22
источник