Я вже обідав?


15

Ви любите обід. Однак ви на дієті і хочете переконатися, що ви випадково не їсте обід двічі за один день. Тому вам потрібно зробити програму, яка допоможе вам переконатися.

Однак одне ускладнення полягає в тому, що ви їсте обід за дуже дивним графіком. Час, коли ви їсте в обід, - МІСЯЦЬ: DAY PM (ви можете використовувати UTC або локалізований часовий пояс). Саме так, якщо день 14 липня , ви їсте обід о 19:14 .

Для вашої програми вам потрібно використовувати поточну дату та час (не брати введення) та виводити постійне триєтне значення, якщо ви вже їли обід протягом дня (або це час обіду зараз), або послідовне хибне значення якщо ви цього не зробили.

Приклади: (Час запуску програми => вихід)

  • 4 травня 11:35 = = false (ви будете їсти обід о 17:04)
  • 3 червня 17:45 => помилково (ви будете їсти обід о 18:03)
  • 28 липня 20:30 => правда (ви їли обід о 19:28)
  • 15 грудня 15:25 = = правда (ви їли обід о 12:15)
  • 29 лютого 14:29 = = правда (саме час обіду)
  • 12 жовтня 00:00 => false (день щойно розпочався)

Довідка:

Як працює годинник на 12 годин


Чи не можемо ми використовувати UTC замість цього?
Містер Xcoder

@ Mr.Xcoder Так, насправді це нормально. Я уточню.
geokavel

5
Якщо ви їсте обід тільки в один конкретний час доби, як ви могли його з'їсти двічі? = p
jpmc26

1
@MarkS. Принаймні цього століття, скажімо.
geokavel

3
Чи не кожен їсть такий обід? Це насправді тільки я?
caird coinheringaahing

Відповіді:


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

Перевір!

Це відбитки true та, відповідно false, для фальшивої та фальшивої речей.

ПРИМІТКА . Це працює лише до 9999 року о 23:59:59, тому що для порівняння дат використовуються рядки.


2
Стріфти, що підстроковують рядок, завжди боляче дивляться на> _ <: P
Пуховик

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?

Я не думаю, що це працює. Тому що зараз 00:51 UTC UTC, і він виводить 1.
geokavel

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. Це дає нам бажаний результат.


це перевіряє, чи це насправді ПМ?
michi7x7

Це робить і зараз. :)
Стюі Гріффін

Якщо "mmdd" - "1201", а "HHMM" - "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 ?

Не &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
Містер 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));}}

Спробуйте в Інтернеті!


Я не думаю, що ви можете додати години та хвилини, ви повинні встановити їх.
Зимовий

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 >= 507eval (). Байт збережено, змінивши його на еквівалент 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
Чи правильно це поводиться з груднем? Я давно не працював з 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 байт


2

Математика, 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, ми могли б заощадити 25 байт {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3).

Ви можете перевірити все це, вставивши код у пісочну скриньку Wolfram Cloud і натиснувши Gear-> Оцінити клітинку або натиснувши Shift + Enter або Numpad Enter.


Я вважаю , що ваш бонус до відома насправді правильне рішення - домен НЕ дійсний рази 13:01в24:31
Taylor Scott

@TaylorScott Дякую за форматування коду (хоча кольоризація, здається, не вдається в деяких складніших випадках). Я не впевнений, що розумію ваш коментар. Якщо 19 липня це 07:20 ранку, тоді на "бонусний" код буде сказано "так, ви обідали", хоча це ще далеко до 7:20 вечора. В ОП є тестові випадки в АМ, тому я думаю, що це робить його недійсним. Що я пропускаю?
Марк С.

@Mark_S. Я бачу - чомусь я прочитав, що як о 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
@MarkS. 12 + Mod [# [[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

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$Подушка перетвориться 6в 6_чому _6, так що ви хочете (-2)$, але ви можете скасувати з цих додаткових 3 символів за допомогою стенографії для , string як ($)... або замість $ роздути, перед ім'ям «0» , а потім взяти останні 2 символів: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+мм 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
l4м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. Я додам це, якщо це вимога.


Я вважаю, що тому, що в оригінальному запитанні вказано, 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 байти завдяки Wernisch
Збережено 1 байт завдяки Адаму


Вам потрібні додаткові дужки навколо ЗАРАЗ () - СЬОГОДНЯ ()?
Верніш

@Wernisch Ні, як виявилося. Я припускав, що вона буде оцінювати нерівність перед відніманням, але я не перевіряв її. Спасибі.
Інженер Тост

Я думаю, ви можете зберегти байт, перейшовши 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

Джулія 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 годинним годинником, тому я не можу сказати, чи те, що я робив, працює з іншою машиною за допомогою різних годин, але, здається, працює на моїй машині.


0

JavaScript ES6, 70 байт

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

Можливо, не так прямо на кілька мілісекунд ...


0

Матлаб, 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. Якщо поточний час у PM, то я продовжую і просто порівнюю числа часу.

Примітка. Тут я відформатував її трохи по-іншому, щоб зрозуміти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.