Ho già pranzato?


15

Adori il pranzo. Tuttavia, sei a dieta e vuoi assicurarti di non pranzare accidentalmente il pranzo due volte in un giorno. Quindi è necessario creare un programma per aiutarti a essere sicuro.

Tuttavia, una complicazione è che pranzi in un programma molto strano. L'ora in cui pranzi è il MESE: GIORNO PM (puoi utilizzare UTC o il fuso orario localizzato). Esatto, se il giorno è il 14 luglio , pranzerai alle 19:14 .

Per il tuo programma, devi utilizzare la data e l'ora correnti (non accettare input) e generare un valore di verità costante se hai già pranzato per il giorno (o è ora di pranzo ora) o un valore di falsa coerente se non l'hai fatto.

Esempi: (ora in cui si esegue program => output)

  • 4 maggio 11:35 => false (pranzerai alle 17:04)
  • 3 giugno 17:45 => falso (pranzerai alle 18:03)
  • 28 luglio 20:30 => vero (hai pranzato alle 19:28)
  • 15 dicembre 15:25 => vero (hai pranzato alle 12:15)
  • 29 febbraio 14:29 => true (è esattamente l'ora di pranzo)
  • 12 ottobre 12:00 AM => false (giornata appena iniziata)

Riferimento:

Come funziona un orologio a 12 ore


Non possiamo usare invece UTC?
Mr. Xcoder,

@ Mr.Xcoder Sì, in realtà va bene. Chiarirò.
geokavel,

5
Se pranzi solo a una determinata ora del giorno, come potresti mangiarlo due volte? = p
jpmc26,

1
@MarkS. Almeno questo secolo, diciamo.
geokavel,

3
Non tutti mangiano il loro pranzo in questo modo? Sono davvero solo io?
caird coinheringaahing il

Risposte:


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

Controlla!

Questo stampa truee false, rispettivamente, per verità e falsità.

NOTA : Funziona solo fino all'anno 9999, alle 23:59:59, perché utilizza le stringhe per confrontare le date.


2
La sottostringa dei turni mi fa sempre
male

3

05AB1E , 15 18 byte

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

Provalo online!

Spiegazione

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

Non penso che funzioni. Perché sono le 00:51 UTC in questo momento, ed è in uscita 1.
geokavel

Nvm ha appena realizzato che stavo controllando non sono pm. Risolto al costo di 3 byte.
Datboi,

2

Ottava , 61 byte

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

Provalo online!

Spiegazione:

Innanzitutto le funzioni:

  • now()restituisce l'ora in un formato decimale. Le parentesi sono opzionali.
  • datestr converte un numero decimale in una stringa nel formato indicato nel secondo argomento
  • str2num converte una stringa in un numero
  • diff prende la differenza tra due numeri

Abbattersi:

Prendiamo questo dalla metà:

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

datestr(now,'mmddHHMM'): Per prima cosa prendiamo l'ora corrente nowcome input datestre specifichiamo il formato mmddHHMM. Le lettere significano: mm = month, dd = day, HH = hour, MM = minutese AMspecifica che le ore dovrebbe essere su un formato a 12 ore. Nessun separatore incluso, per mantenerlo il più corto possibile. Emette d = 07142117al momento della stesura di questa spiegazione. Mi riferirò a quella parte a partire xda ora.

[(d=x)(1:4);d(5:8)]: Memorizza la stringa sopra, come d, quindi crea un array con due elementi, i primi quattro caratteri, quindi i 5-9 caratteri. Questo :

ans =
0714
2122

Dove i numeri sono memorizzati come stringhe, non numeri. Chiameremo il risultato sopra per ysotto.

str2num(y)converte la matrice di caratteri in numeri, dove ogni riga si trasforma in un numero. Questo dà [714; 2122]. Chiameremo il risultato per z.

diff(z)>1200prende la differenza tra i due numeri e verifica se l'ora corrente è 1200 in più rispetto alla data corrente. Questo spiega AM / PM. Questo ci dà il risultato desiderato.


verifica se in realtà è PM?
michi7x7,

Lo fa adesso. :)
Stewie Griffin,

Se "mmdd" è "1201" e "HHMM" è "1215" questo dovrebbe essere vero, no? Ho dovuto usare la mod 12 del mese per tener conto di ciò in qualche modo.
michi7x7,

2

Pyth, 22 21 20 byte

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

-1 byte grazie a @ Mr.Xcoder

Prova questo!

vecchio approccio, 22 20 byte

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

Provalo!

spiegazione

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

Non &g.d6+.d4 12g.d5.d7funzionerebbe per 19 byte? Non ne sono sicuro e non l'ho ancora provato, ma ...
Mr. Xcoder,

&g.d6+12.d4g.d5.d7sarebbe 18 in realtà. Inoltre, nel vecchio approccio non penso che tu abbia bisogno del `, e che sarebbe lungo 18 byte. Non lo so, potrei sbagliarmi.
Mr. Xcoder,

@ Mr.Xcoder se usi e poi entrambi devono essere veri, ad es. Nel tuo codice 22:17 non conta come dopo 19:15, perché i minuti sono falsi. Posso rimuovere alcuni dei `` '', ma non tutti. Grazie per avermi salvato un byte.
KarlKastor,

Ok, davvero non sapevo se fosse corretto, sto ancora imparando Pyth: P
Mr. Xcoder

Quindi, ho trovato una soluzione alternativa g++720.d5*60.d4+*60.d6.d7, ma sfortunatamente è più lunga (25 byte). Tuttavia, potrebbe essere una fonte di ispirazione e ho pensato che avrei dovuto menzionarlo.
Mr. 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));}}

Provalo online!


Non penso che puoi aggiungere ore e minuti, devi impostarli.
Inverno

1
Crea un'azione anonima ( ()=>...) Action<bool>per salvare i byte. Utilizzare DateTime.Nowquando si accede al mese e al giorno. In generale publicnon è necessario e Programpuò essere solo una lettera. Utilizzare using D=System.DateTime;per salvare byte. Nel complesso bella idea, ma potrebbe essere giocato a golf molto. Benvenuti in PPCG!
TheLethalCoder

@TheLethalCoder grazie per il consiglio! Questo è stato il mio primo tentativo al code golf ma sicuramente proverò di più!
pritch90,

2

PHP e altre lingue con queste funzioni comuni: da 28 a 29 byte circa:

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

o in alternativa

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

entrambi verranno stampati.

possibilmente con a ?1:0seconda della rappresentazione. Forse i byte vengono tagliati se viene utilizzata una lingua con eco implicito o nessun ';' finale.

Perché uno dovrebbe ottenere i valori in variabili e tutto il resto, quando non è necessario :)
date()lascia nulla come letterali che non è definito, quindi ad esempio 7 May 2017 17:22:43passa l'espressione 1722 - 1200 >= 507a eval (). Byte salvato modificandolo in equivalente 1722 - 1199 > 507.

Chi dice che eval sia morto? ;-)


2

Java, 81 byte

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

Provalo online!

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
Questo gestisce dicembre correttamente? Non lavoro con Java da molto tempo, ma sembra che potrebbe mandare dal 1 al 24 dicembre 01 invece che subito dopo mezzogiorno.
Mark S.

Non dimenticare di includere l'importazione di java.util.Datenel conteggio dei 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

questo disimballaggio è abbastanza fastidioso, forse la gestione delle stringhe è più adatta

// edit: pattern guards sicuro 5 byte


2

Mathematica, 65 64 62 byte

3 programmi

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

Questi sono ciascuno con un byte in meno se contano come un singolo byte in Mathematica.

spiegazioni

  1. Date[]restituisce un elenco nel modulo {y,m,d,h,m,s}. Così Date[][[4;;5]]sono le ore e i minuti dell'ora corrente.
  2. p=Date[][[#]]&;fa puna funzione che accetta gli indici che vogliamo e ci dà quelle parti della data.
  3. {60,1}.#&è una funzione anonima che utilizza il prodotto punto {60,1}e l'input per ottenere un modo per confrontare i tempi. È un byte più corto di TimeObject.
  4. p@2è equivalente a p[2], il numero del mese.
  5. +{12+p@2~Mod~12,0}aggiunge {12,0}il mese e la data in cui non siamo a dicembre e aggiunge {0,0}diversamente. (Grazie, michi7x7!)
  6. >= è l'operatore di confronto, ma non possiamo confrontare {ora, minuti} con {mese, data} rettificati ...
  7. /@è mappato {60,1}.#&su entrambi i lati della disuguaglianza tra parentesi, in modo da poter confrontare correttamente i tempi.
  8. Per i programmi che iniziano con {60,1}.#&, usano #per rappresentare l'input per una grande funzione anonima e &per indicare la fine.
  9. @Date[] Applica la grande funzione sulla sua riga (che estrae parti di un elenco) all'elenco date stesso.
  10. [Date[][[#]]&] Applica la grande funzione sulla sua linea a un'altra funzione anonima, che estrae parti dell'elenco di date.

indennità

A parte questo, se pranzassimo tra l'una e le 12:59, potremmo risparmiare 25 byte con solo {60,1}.#&[Date[][[#]]]&/@(4;;5>=2;;3).

Puoi testarli tutti incollando il codice nella sandbox di Wolfram Cloud e facendo clic su Gear-> Valuta cella o premendo Maiusc + Invio o Invio tastierino numerico.


Credo che la tua nota bonus sia in realtà una soluzione valida, come lo è il tuo dominio dei tempi validi 13:01 a24:31
Taylor Scott

@TaylorScott Grazie per la formattazione del codice (anche se la colorazione sembra fallire in alcuni casi più complicati). Non sono sicuro di aver capito il tuo commento, però. Se il 19 luglio è Se sono le 7:20, il codice "bonus" direbbe "sì, hai pranzato" anche se è lontano dalle 19:20. L'OP ha casi di test nell'AM, quindi penso che questo lo renda non valido. Cosa mi sto perdendo?
Mark S.

@Mark_S. Vedo - per qualche motivo avevo letto che erano le 23:59 anziché le 12:59 - non esiste un modo conciso per aggiungere 12 ore al codice bonus?
Taylor Scott,

1
@TaylorScott Bene, vogliamo aggiungere 12 all'ora per la maggior parte dei mesi, quindi da gennaio a novembre potremmo sostituire Date[]il bonus con (Date[]+{0,12,0,0,0,0})(potrebbe esserci un modo per giocare a golf, ma12UnitVector[6,2] è più lungo). Il problema è che in date come il 3 dicembre, pranziamo alle 12:03, non alle 24:03, quindi dobbiamo aggiungere 12 tranne a dicembre . Questo ci richiede di 1. dare un'occhiata all'interno della data per vedere se siamo a dicembre o meno (come nelle mie risposte), o 2. scrivere una funzione che esamina se siamo passati a 24: XX dopo il fatto, che sarebbe più a lungo.
Mark S.

1
@MarkS. 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>

Quei nomi lunghi di funzioni ...



1

R , 92 byte

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

Provalo online!

                                   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

Esempio:

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

L'interprete è disponibile qui

Vecchia versione

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

Il 2$pad si trasformerà 6in 6_anziché anziché _6, quindi vorresti (-2)$, ma puoi cancellare quei 3 caratteri extra usando la scorciatoia per string come ($)... o invece di usare $ per pad, anteporre "0" e quindi prendere gli ultimi 2 caratteri: {x:.z.P;x>"T"$":"sv -2#'"0",'($)12 0+mm dd$\:x}per 49 byte
vie

buon posto. l'originale non era valido. ho aggiunto una versione ancora più breve
skeevey,

1

JavaScript, 75 byte

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

Che equivale al seguente codice:

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

l'ultimo tpuò essere usato mentre modifica
l4m2

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

1

Python 2.7, 130 byte

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

Provalo online

Nota: potrebbe esserci un problema con il segno. Per favore, mi scuso perché seguo IST ed è abbastanza confuso perché sono le 2:28 qui. Correggi il segno se ritieni che sia sbagliato.


1

Perl, 45 caratteri

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

Se devo fornire un metodo, sarà 45 per sub c{...}. Se devo stampare say ()||0lo rende anche 47. Lo aggiungerò se è un requisito.


Credo che, poiché la domanda originale specifica you need to make a program to help you make sureche gli snippet non sono consentiti, ovvero che uno dei metodi di output elencati è generalmente considerato valido
Taylor Scott

1
abbastanza equo, fornirò quindi output. Grazie per la modifica, non ero a conoscenza del tag lingua corretto! Pensavo fosse perl -egeneralmente ok, ma altri hanno fornito funzioni, quindi l'ho modificato.
bytepusher

1

Excel, 52 50 49 byte

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

L'input è questa formula in qualsiasi cella.
L'output è TRUEo FALSE.

La gestione della data integrata di Excel aiuta molto.
La TIMEfunzione restituisce l'ora del pranzo del giorno come valore orario che, se convertito in una data, verrebbe utilizzato Jan 0, 1900. Lo confrontiamo in NOW - TODAYmodo da ottenere l'ora corrente con un valore di data di 0o Jan 0, 1900.

Salvato 2 byte grazie a Wernisch
Salvato 1 byte grazie ad Adam


Ti servono le parentesi graffe extra NOW () - OGGI ()?
Wernisch,

@Wernisch No, come risulta. Avevo presunto che avrebbe valutato la disuguaglianza prima della sottrazione, ma non l'ho verificato. Grazie.
Ingegnere Toast,

Penso che puoi salvare un byte cambiando da now()-today()amod(now(),1)
Adam

0

JavaScript, 62 caratteri

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

Codice di prova di seguito:


0

Excel VBA, 55 byte

Funzione di finestra immediata VBE anonima che non accetta input e genera un valore booleano che indica se ho pranzato alla finestra immediata VBE

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

0

Rubino , 64 + 7 = 71 byte

Richiede il -rtimeflag perché per qualche motivo Time::parseè come, l'unica funzione lo richiede dall'intero Timemodulo.

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

Provalo online! (stampa anche l'ora corrente)


0

Julia 0.6.0 99 byte

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

Julia ha una funzione integrata per utilizzare l'orologio / calendario del computer. Il mio computer è in esecuzione su Ubuntu 16.04 e già con l'orologio a 12 ore, quindi non posso dire se quello che ho fatto funziona con un'altra macchina usando un orologio diverso, ma sembra funzionare sulla mia macchina.


0

JavaScript ES6, 70 byte

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

Forse non proprio in alcuni millisecondi ...


0

Matlab, 241 byte

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

Spiegazione: Innanzitutto, ottengo la data come stringa. Quindi, isola il mese e il giorno. Poiché il problema afferma che viene sempre interpretato come PM, allora scrivo automaticamente falso se l'ora è in AM. Se l'ora corrente è in PM, allora continuo e confronto solo i numeri dell'ora.

Nota: l'ho formattato in modo leggermente diverso qui per leggibilità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.