Henüz öğle yemeği yedim mi?


15

Öğle yemeğini seviyorsun. Ancak, diyet yapıyorsunuz ve yanlışlıkla bir günde iki kez öğle yemeği yemediğinizden emin olmak istiyorsunuz. Bu yüzden emin olmanıza yardımcı olacak bir program yapmalısınız.

Bununla birlikte, bir komplikasyon, çok garip bir programda öğle yemeği yemenizdir. Öğle yemeğini saat: MONTH: DAY PM (UTC veya yerel saat dilimini kullanabilirsiniz). Gün ise Bu doğru 14 Temmuz sen öğle yemeği, 07:14 PM .

Programınız için, günün tarihini ve saatini kullanmanız (girdi almamanız) ve gün için zaten öğle yemeği yediyseniz (veya şimdi öğle yemeği vaktidir) veya tutarlı bir falsy değeri çıkarmanız gerekir. eğer yapmadıysanız.

Örnekler: (Programı çalıştırdığınız zaman => çıktı)

  • 4 Mayıs 11:35 = = yanlış (öğleden sonra 17:04)
  • 3 Haziran 17:45 => yanlış (öğleden sonra 18:03)
  • 28 Temmuz 20:30 => doğru (19: 28'de öğle yemeği yediniz)
  • 15 Aralık 15:25 => doğru (öğlen 12: 15'de öğlen yediniz)
  • 29 Şubat 14:29 => doğru (tam öğle yemeği zamanı)
  • 12 Ekim 00:00 => yanlış (gün yeni başladı)

Referans:

12 saatlik saat nasıl çalışır?


Bunun yerine UTC'yi kullanamaz mıyız?
Bay Xcoder

@ Mr.Xcoder Evet, aslında sorun değil. Açıklığa kavuşacağım.
geokavel

5
Sadece günün belirli bir saatinde öğle yemeği yerseniz, nasıl iki kez yersiniz? = p
jpmc26

1
@MarkS. En azından bu yüzyılda diyelim.
geokavel

3
Herkes öğle yemeğini böyle yemiyor mu? Gerçekten sadece ben miyim?
caird coinheringaahing

Yanıtlar:


7

Swift 3 , 310 bayt

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

Bunu kontrol et!

Bu baskılar trueve false, truthy ve falsy sırasıyla.

NOT : Bu, tarihleri ​​karşılaştırmak için Dizeler kullandığından yalnızca 9999 yılına kadar 23: 59: 59'a kadar çalışır.


2
Swift alt
dizgi

3

05AB1E , 15 18 bayt

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

Çevrimiçi deneyin!

açıklama

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

Bunun işe yaradığını sanmıyorum. Çünkü şu anda 12:51 UTC ve çıktı 1
geokavel

Nvm sadece am değil am karşı kontrol olduğunu fark etti. 3 bayt maliyetle sabitlendi.
Datboi

2

Oktav , 61 bayt

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

Çevrimiçi deneyin!

Açıklama:

İlk önce fonksiyonlar:

  • now()zamanı ondalık biçimde döndürür. Parantezler isteğe bağlıdır.
  • datestr ondalık bir sayıyı ikinci bağımsız değişkeninde verilen biçimde bir dizeye dönüştürür
  • str2num bir dizeyi sayıya dönüştürür
  • diff iki sayı arasındaki farkı alır

Yıkmak:

Bunu ortadan alıyoruz:

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

datestr(now,'mmddHHMM'): Öncelikle geçerli saati nowgirdi olarak alıyoruz datestrve formatı belirliyoruz mmddHHMM. Harfler anlamına: mm = month, dd = day, HH = hour, MM = minutesve AMsaat 12 saat formatında olmalıdır belirtir söyledi. Mümkün olduğunca kısa tutmak için ayırıcılar dahil edilmemiştir. d = 07142117Bu açıklamanın yazıldığı zaman çıktı . Bundan sonra o kısma değineceğim x.

[(d=x)(1:4);d(5:8)]: Yukarıdaki dizeyi farklı olarak dsaklar, ardından ilk dört karakter, ardından 5-9 karakter olmak üzere iki öğeden oluşan bir dizi oluşturur. Bu şunu verir :

ans =
0714
2122

Sayıların sayı olarak değil dize olarak depolandığı yerler. Yukarıdaki sonucu yaşağıda arayacağız .

str2num(y)karakter dizisini sayılara dönüştürür, burada her satır bir sayıya dönüşür. Bu verir [714; 2122]. Sonucu arayacağız z.

diff(z)>1200iki sayı arasındaki farkı alır ve geçerli saatin geçerli tarihten 1200 daha yüksek olup olmadığını kontrol eder. Bu, AM / PM'yi açıklar. Bu bize istenen sonucu verir.


bu gerçekten PM olup olmadığını kontrol ediyor mu?
michi7x7

Şimdi öyle. :)
Stewie Griffin

"Mmdd" "1201" ve "HHMM" "1215" ise, bu doğru olmalıdır, değil mi? Bunu bir şekilde açıklamak için ayda mod 12'yi kullanmak zorunda kaldım.
michi7x7

2

Pyth, 22 21 20 bayt

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

@ Mr.Xcoder sayesinde -1 bayt

Bunu dene!

eski yaklaşım, 22 20 bayt

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

Dene!

açıklama

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

Olmaz &g.d6+.d4 12g.d5.d719 byte için çalışmak? Emin değilim ve henüz gerçekten test etmedim ama ...
Bay Xcoder

&g.d6+12.d4g.d5.d7aslında 18 olurdu. Ayrıca, eski yaklaşımda ihtiyacın olduğunu düşünmüyorum `ve bu 18 bayt uzunluğunda olacak. Bilmiyorum, yanılmış olabilirim.
Bay Xcoder

@ Mr.Xcoder kullanırsanız & her ikisinin de doğru olması gerekir, örneğin kodunuzda 22:17 saat 19: 15'ten sonra sayılmaz çünkü dakikalar yanlıştır. Bazılarını kaldırabilirim, ama hepsini değil. Bana bir bayt kazandýđýn için teţekkürler.
KarlKastor

Tamam, bunun doğru olup olmadığını gerçekten bilmiyordum, hala Pyth öğreniyorum: P
Bay Xcoder

Sonra alternatif bir çözüm buldum g++720.d5*60.d4+*60.d6.d7, ama bu maalesef daha uzun (25 byte). Ancak, bu bir ilham kaynağı olabilir ve bundan bahsetmem gerektiğini düşündüm.
Bay Xcoder

2

C #, 174 bayt

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

Çevrimiçi deneyin!


Saat ve dakika ekleyebileceğinizi sanmıyorum, ayarlamanız gerekir.
Kış

1
Baytları kaydetmek için anonim bir eylem ( ()=>...) oluşturun Action<bool>. DateTime.NowAy ve güne erişirken kullanın . Genel publicolarak gerekli değildir ve Programsadece bir harf olabilir. Kullanım using D=System.DateTime;bytes.Overall güzel fikir kaydetmek için ancak çok golfed edilebilir. PPCG'ye Hoşgeldiniz!
TheLethalCoder

@TheLethalCoder tavsiye için teşekkürler! Bu benim ilk kod golf gitmek oldu ama kesinlikle daha fazla çalışacağız!
pritch90

2

PHP ve bu ortak işlevlere sahip diğer diller: yaklaşık 28 ila 29 bayt:

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

Veya alternatif olarak

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

her ikisi de yazdırılacaktır.

muhtemelen ?1:0temsile bağlı olarak. Örtük yankısı olan veya son ';' içermeyen bir dil kullanılırsa, muhtemelen bayt kesilir.

Neden değerleri değişkenlere ve geri kalanına ihtiyaç duyulmadığında
date()alıyorsunuz :) tanımlanmamış değişmez bir şey bırakıyor, örneğin, 7 May 2017 17:22:43ifadeyi 1722 - 1200 >= 507eval () öğesine iletiyor. Bayt, eşdeğerini değiştirerek kaydedildi 1722 - 1199 > 507.

Eval'ın öldüğünü kim söyledi? ;-)


2

Java, 81 bayt

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

Çevrimiçi deneyin!

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
Bu, Aralık ayını doğru şekilde ele alıyor mu? Java ile uzun zamandır çalışmadım, ancak öğleden sonra değil, 1 Aralık ila 24:01 gönderebilir.
Mark S.

İçe aktarma java.util.Dateişleminizi bayt sayısına eklemeyi unutmayın .
Jakob

2

Haskell, 135129 bayt

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

Bu ambalajı açmak oldukça can sıkıcı, belki de ipin işlenmesi

// değiştir: desen korumaları güvenli 5 bayt


2

Mathematica, 65 64 62 bayt

3 Programlar

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

Bunların her biri bir bayt daha az Mathematica'da tek bir bayt olarak sayılırsa, .

açıklamalar

  1. Date[]formdaki bir listeyi döndürür {y,m,d,h,m,s}. Yani Date[][[4;;5]]saat ve şimdiki zamanın dakika uzaklıktadır.
  2. p=Date[][[#]]&;pistediğimiz endeksleri alan ve bize tarihin bu kısımlarını veren bir işlev yapar .
  3. {60,1}.#&nokta çarpımını {60,1}ve girdiyi zamanları karşılaştırmanın bir yolunu alan anonim bir işlevdir . Bir bayt daha kısaTimeObject .
  4. p@2p[2]ay sayısına eşittir .
  5. +{12+p@2~Mod~12,0}ekler {12,0}Aralık ayında değilken ay ve bugüne kadar, ve ekler {0,0}aksi. (Teşekkürler, michi7x7!)
  6. >= karşılaştırma operatörüdür, ancak {saat, dakika} ile {düzeltilmiş ay, tarih} girişini karşılaştırılamaz ...
  7. /@haritalar {60,1}.#&parantez içinde eşitsizlik iki tarafa da, bu yüzden doğru kez karşılaştırabilirsiniz.
  8. İle başlayan programlar için {60,1}.#&, kullandıkları #büyük bir anonim işlevine girişini temsil etmek ve &sonunu belirtmek için.
  9. @Date[] Satırındaki büyük işlevi (listenin bazı bölümlerini çıkarır) tarih listesinin kendisine uygular.
  10. [Date[][[#]]&] Satırındaki büyük işlevi tarih listesinin bölümlerini ayıklayan başka bir anonim işleve uygular.

Bonus

Bir yana, eğer 01:00 ve 12:59 arasında öğle yemeği yedik, o zaman sadece 25 bayt kaydedebilirsiniz {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3).

Kodu Wolfram Cloud sanal alanına yapıştırarak ve Gear-> Hücreyi Değerlendir'e tıklayarak veya Shift + Enter veya Numpad Enter tuşlarına basarak bunların tümünü test edebilirsiniz .


Bonus notunuzun aslında geçerli bir çözüm olduğuna inanıyorum - geçerli zaman alanınız olduğu 13:01gibi24:31
Taylor Scott

@TaylorScott Kod biçimlendirmesi için teşekkürler (ancak bazı daha zor durumlarda renklendirme başarısız görünüyor). Yine de yorumunuzu anladığımdan emin değilim. Eğer 19 Temmuz'da 07:20 ise, "bonus" kodu "evet, öğle yemeği yedin" diyecektir. Bu AM geçersiz kılan bence OP test senaryoları vardır. Neyi kaçırıyorum?
Mark S.

@Mark_S. Ben - bir nedenden dolayı ben 12:59 yerine 23:59 olmak gibi okumuştu vardı-bonus kodu 12 saat eklemek için kısa bir yolu yoktur?
Taylor Scott

1
@TaylorScott Peki, çoğu ay için 12 saat eklemek istiyoruz, bu yüzden Ocak-Kasım ayları Date[]için bonusu değiştirebiliriz (Date[]+{0,12,0,0,0,0})(golf için bir yol olabilir, ancak 12UnitVector[6,2]daha uzun). Sorun şu ki, 3 Aralık gibi tarihlerde, 24:03 değil, 12:03'de öğle yemeği yiyoruz, bu yüzden Aralık hariç 12 eklememiz gerekiyor . Bu da ya 1. Aralık'ta olup olmadığımızı görmek için (cevaplarımda olduğu gibi) tarihin içine göz atmamızı ya da 2. olaydan sonra 24: XX'ye gidip gitmediğimizi inceleyen bir fonksiyon yazmamızı gerektirir. uzun.
Mark S.

1
@MarkS. 12 + Mod [# [[2]], 12]?
michi7x7

1

JavaScript (ES6), 75 bayt

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>

Bu uzun fonksiyon isimleri ...



1

R , 92 bayt

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

Çevrimiçi deneyin!

                                   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 bayt

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

Misal:

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

Tercüman kullanılabilir burada

Eski versiyon

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

2$Ped dönecek 6için 6_yerine _6istediğiniz ediyorum, böylece (-2)$, ancak için steno kullanarak bu ekstra 3 karakter dışarı iptal edebilirsiniz string olarak ($)"0" ya da ... yerine pedine $ kullanarak, başına ve daha sonra 2 son almak karakter: 49 bayt için {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mmdd$\:x}
streetster

iyi nokta. orijinal geçersizdi. daha da kısa bir versiyon
ekledim

1

JavaScript, 75 bayt

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

Aşağıdaki kodla eşdeğerdir:

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.