Una volta avevamo una domanda che non riusciva solo la domenica


39

Ispirato da Abbiamo fatto un test unitario una volta che ha avuto esito negativo solo la domenica , scriviamo un programma o una funzione che non fa altro che lanciare un errore quando è domenica ed uscire con grazia ogni altro giorno.

Regole:

  • Non usare input o mostrare output attraverso i soliti metodi IO , tranne per stampare su STDERR o l'equivalente della tua lingua. Puoi stampare su STDOUT se è un sottoprodotto del tuo errore.
  • Una funzione può restituire un valore la domenica, a condizione che non stampi nulla
  • Il programma può utilizzare una domenica da qualsiasi fuso orario o fuso orario locale, purché sia ​​coerente.
  • Un errore è qualcosa che fa terminare il programma in modo anomalo , come un errore di divisione per zero o l'utilizzo di una variabile non inizializzata. Ciò significa che se un codice dovesse essere aggiunto dopo la parte che presenta errori, non verrebbe eseguito domenica.
    • Puoi anche usare istruzioni che creano manualmente un errore, equivalenti a quelle di Python raise.
    • Ciò include errori di runtime, errori di sintassi ed errori durante la compilazione (buona fortuna con quello!)
  • Su un errore ci deve essere qualche segno che lo distingue dal non avere alcun errore
  • Questo è , quindi vince il conteggio dei byte più breve in ogni lingua!

Dovrò aspettare fino a domenica per controllare le risposte;)


2
Con "scrivere un programma o una funzione che non fa altro che generare un errore domenica e uscire con grazia in qualsiasi altro giorno", vuoi dire che ogni volta che viene eseguito la domenica dovrebbe fallire, o vuoi dire che dovrebbe esserci almeno una possibilità fallisce una domenica. Per renderlo più chiaro, se fallisce solo la domenica alle 14:00, ma non la domenica alle 15:00, va bene?
Bromind,

5
Sarebbe stato ancora meglio se il sabato fosse stato usato. Avresti potuto chiamarlo "Saturday Night Error" e persino lavorare su alcuni testi di canzoni adattati alla domanda.
Aaron,

3
La domenica? Che ne dici di fallire tra mezzanotte e l'una ?
Draco18s

1
Dalla tua domanda non è chiaro cosa costituisca un errore. Sto votando per chiudere fino a quando non sarà posto rimedio.
Wheat Wizard

3
Non proprio ... Come possiamo distinguere l'output di un errore dall'output normale. C'è qualcosa come print "error"un errore? Il paragrafo aggiunto non chiarisce davvero nulla.
Wheat Wizard

Risposte:



18

PHP 7, 12 byte

1%date("w");

Su PHP 7 genera un'eccezione di tipo la DivisionByZerodomenica. Lo stesso succede se viene interpretato usando HHVM .

Su PHP 5 visualizza un avviso (attivo stderr) la domenica:

PHP Warning:  Division by zero in Command line code on line 1

Su qualsiasi versione di PHP, non mostra nulla negli altri giorni della settimana.

Esegui utilizzando l'interfaccia della riga di comando:

php -r '1%date("w");'

o provalo online!

Altri due byte può essere spremuto mettendo a nudo le virgolette ( 1%date(w);), ma ciò fa scattare un avviso (che può essere soppresso da impostati correttamente error_reporting = E_ALL & ~E_NOTICEin php.ini).


Credo che tu debba specificare (nel titolo) che questa risposta è solo e solo per PHP7 + e per HHVM, dal momento che PHP5.6 e uscita inferiore senza alcun problema. Gli avvisi non sono errori e non fermano l'esecuzione del codice. Se lo fai 1%date("w");echo "Alive!", si fermerà in PHP7 + e HHVM, ma non in tutte le altre versioni dal PHP 4.
Ismael Miguel

@IsmaelMiguel la domanda classifica qualsiasi stampa in Errore standard come errore, quindi un avviso è abbastanza buono in questo caso.
Per favore, smetti di essere malvagio il

1
Citando la domanda: "Un errore è qualcosa che fa terminare il programma in modo anomalo , come una divisione per errore zero o usando una variabile non inizializzata. Ciò significa che se un codice dovesse essere aggiunto dopo la parte in cui si sbaglia, non sarebbe eseguito domenica ". Questo non accade con un avviso.
Ismael Miguel,

@IsmaelMiguel il paragrafo che stai citando è stato aggiunto alla domanda meno di un'ora fa.
axiac

1
Citando una versione precedente, quella accesa al momento del commento che ho scritto: "[...] scrivi un programma o una funzione che non fa altro che lanciare un errore quando è domenica e uscire con grazia in qualsiasi altro giorno . ". Un avviso è contro questa linea perché PHP uscirà con grazia. Un errore sarebbe un errore fatale o un errore di sintassi. Non è un avviso per la divisione per 0. PHP 5.6 e precedenti non sono validi per questa sfida.
Ismael Miguel,


8

Java 8, 69 43 34 byte

v->1/new java.util.Date().getDay()

-26 byte grazie a @ OlivierGrégoire .
-9 byte grazie a @Neil .

Spiegazione:

Provalo qui.

  • v->{...}( parametro non Void nullutilizzato ) è più corto di un byte di ()->{...}(nessun parametro).
  • new java.util.Date().getDay()restituirà 0-6 per domenica-sabato, quindi 1/...verrà visualizzato un java.lang.ArithmeticException: / by zeroerrore se il valore è 0, che si verifica solo la domenica.


@ OlivierGrégoire Ah, java.util.Date()ha un metodo per ottenere il giorno della settimana .. Ed è anche 0 per domenica .. Non sono sicuro di come mi sia perso. : S
Kevin Cruijssen,

Sì, di solito le classi più vecchie hanno tutte le funzionalità in nomi più brevi. ;-)
Olivier Grégoire il

1
È valido per 34 byte? Provalo online!
Neil,

@Neil non era valido al momento della pubblicazione, ma è diventato valido meno di un'ora dopo. ;-) È stata la mia prima idea, però ...
Olivier Grégoire il

7

Python 3 , 33 byte

import time
"Su"in time.ctime()>q

Provalo online!

Python 3 , 50 byte

from datetime import*
datetime.now().weekday()>5>q

Provalo online!

Risparmiato ~ 3 byte grazie a Rod .


1
@Rod Perché no "Su"in time.ctime()>q(stavo modificando con questo)?
Mr. Xcoder,

Non riesco a capirlo. Come funziona?
Pacholik,

@pacholik "Su"in time.ctime()controlla se il giorno corrente è domenica. Se questo è falso, la >qparte non viene affatto valutata e tutto esce uniformemente. Ma se questo è vero, allora la seconda parte della disuguaglianza viene valutata, e poiché qnon è definita, ciò genererebbe a NameError.
Mr. Xcoder,

1
@pacholik Modifica: non credo di sbagliarmi. Ai fini dell'efficienza, se la prima parte è falsa, Python non si preoccupa nemmeno di valutare l'ultima parte. Dovrò aspettare fino a domenica per provare questo, però. ( Penso ) Dimostrazione .
Mr. Xcoder,

3
@pacholik Notare che gli operatori booleani di catene Python sono equivalenti a ("Su" in time.ctime()) and (time.ctime() > q).
user202729

6

Pyth , 8 7 byte

 l-6.d9

Provalo online!

Spiegazione

    .d9 # Get the current day of week (0 = Monday, 6 = Sunday)
  -6    # Subtract 6 from the day
 l      # Try to calculate the log base 2 of the result of the previous operation raising a "ValueError: math domain error" on sundays
        # there is an extra space at the start, to supress the output on the other days

Questo non è ancora valido. Il tuo output ( 1.0non è generato dall'errore ). L'OP ha affermato esplicitamente che non lo consentono. Puoi risolverlo anteponendo un singolo spazio al tuo codice, però
Mr. Xcoder

Tuttavia, non è consentito eseguire l'output su STDOUT a meno che non sia domenica e non si esegue l'output su STDOUT.
Mr. Xcoder,

@ Mr.Xcoder è corretto. Nelle domeniche non dovrebbe essere emesso nulla
Jo King

@JoKing Ho completamente saltato questa regola, risolto ora
Rod

6

Haskell + Data.Dates , 55 byte

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

Provalo online!

Questo utilizza il fatto che la domenica è l'ultimo giorno della settimana. dateWeekDayrestituisce il giorno della settimana come un WeekDaytipo, che è semplicemente definito come

data WeekDay = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday

WeekDayè un esempio di Enum, quindi possiamo usare succe predottenere il successore o il predecessore di un giorno feriale, ad esempio i succ Mondayrendimenti Tuesday.

Tuttavia, Sundayè l'ultima voce enum, quindi la chiamata succ Sundayprovoca il seguente errore:

fail_on_sunday.hs: succ{WeekDay}: tried to take `succ' of last tag in enumeration
CallStack (from HasCallStack):
  error, called at .\Data\Dates.hs:56:34 in dates-0.2.2.1-6YwCvjmBci55IfacFLnAPe:Data.Dates

Modifica 1: Grazie a nimi per -3 byte!
Modifica 2: -11 byte ora che le funzioni sono consentite.


Programma completo: 88 81 74 69 66 byte

import Data.Dates
main=pure$!succ.dateWeekDay<$>getCurrentDateTime

Provalo online!

pureè necessario per WeekDayriportare il risultante nella IO Monade. Tuttavia, Haskell vede che il valore non viene emesso in alcun modo dal programma, per quanto pigro sia, l'espressione non viene valutata, quindi anche la domenica il programma non fallirebbe. Questo è il motivo per cui $!è necessario, il che forza la valutazione anche se Haskell normalmente non valuterà l'espressione.


Approccio precedente con Data.Time: 127 124 byte

import Data.Time.Clock
import Data.Time.Calendar.WeekDate
c(_,_,d)|d<7=d
main=getCurrentTime>>=(pure$!).c.toWeekDate.utctDay

Provalo online! Queste sono alcune importazioni impressionanti. Passare d<7ad es. d/=5Per testare l'errore di venerdì Non riesce con la seguente eccezione: Non-exhaustive patterns in function c.


1
main=pure$!succ.dateWeekDay<$>getCurrentDateTime. E, poiché le funzioni sono consentite, è possibile eliminare main=.
nimi,

@nimi Grazie! Non sono sicuro della funzione però, a causa della No using input or showing output through the usual IO methodsregola. Per quanto vedo, l'uso di una funzione comporterebbe un output per le domeniche, anche se è racchiuso in un'azione IO.
Laikoni,

Forse hai ragione, ma d'altra parte un programma completo ha un codice di uscita, che è anche un metodo standard.
nimi,

... le regole di sfida ora consentono alle funzioni di restituire valori non di domenica, purché non vengano stampate.
nimi,

@nimi Grazie per l'avviso.
Laikoni,

5

05AB1E , 45 44 byte

Poiché 05AB1E non ha un built-in per ottenere il giorno della settimana, ho usato la regola di Zeller per calcolarlo.

Stampa una nuova riga su stderr in caso di domenica (osservabile nella vista di debug su TIO)

žežf11+14%Ì13*5÷žgžf3‹-т%D4÷žgт÷©4÷®·(O7%i.ǝ

Provalo online!

Spiegazione

La formula generale utilizzata è
DoW = d + [(13*(m+1))/5] + y + [y/4] + [c/4] - 2*c
Dove DoW=day of week, d=day, m=month, y=last 2 digits of year, c=centurye ed espressione tra parentesi ( []) abbassato arrotondata.

Ogni mese utilizzato nella formula corrisponde a un numero, dove Jan=13,Feb=14,Mar=3,...,Dec=12
Poiché abbiamo il mese corrente nel formato più comune, Jan=1,...,Dec=12 convertiamo il mese utilizzando la formula
m = (m0 + 11) % 14 + 1

Essendo un biprodotto di marzo il primo mese, gennaio e febbraio appartengono all'anno precedente, quindi il calcolo per la determinazione ydiventa
y = (year - (m0 < 3)) % 100

Il valore finale per DoWnoi è un int dove 0=Sat,1=Sun,...,6=Fri.
Ora possiamo esplicitamente lanciare un errore se il risultato è vero.


11
05AB1E sta perdendo su Java? Tutto quello che so è una bugia
Kamil Drakari il

5

JavaScript, 23 byte

Date().slice(1)>'um'&&k

Programma completo.

La variabile knon deve essere definita.

JavaScript, 20 byte di Rick Hitchcock

/Su/.test(Date())&&k

JavaScript, 19 byte per apsillers

Date().match`Su`&&k

1) Hai dimenticato di includere il _=>; senza di essa si tratta di uno snippet che non è consentito per impostazione predefinita. 2) Questo falseviene emesso a giorni alterni quando non dovrebbe emettere nulla.
Shaggy

6
1) È un programma completo, che è consentito dall'OP. 2) Se lo esegui come programma, non c'è output
l4m2

3
/Su/.test(Date())&&kper 20 byte.
Rick Hitchcock,

1
new Dateversione 25 byte(new Date/864e5%7|0)-3||p
l4m2

3
La soluzione di @RickHitchcock può essere invece resa più breve eseguendo il template-tag su match:Date().match`Su`&&k
apsillers

5

VBA / VBScript, 22 20 byte

Salvato 2 byte grazie a Taylor Scott.

a=1/(Weekday(Now)-1)

Questo dovrebbe essere eseguito nella finestra immediata. Weekday()restituisce da 1 (domenica) a 7 (sabato) in modo da creare un errore di divisione per zero domenica. Altrimenti, nessuna uscita.

Error Message


Mi hai battuto per una risposta di un'ora - 19 byte:?1/(Weekday(Now)-1)
Taylor Scott

1
@TaylorScott Ho dimenticato che Nowè valido senza ()in VBA ma non riesco a usare la stampa perché penso che tutto l'output sia vietato a meno che non si verifichi un errore. No using input or showing output through the usual IO methods, except to print to STDERR. Tuttavia, salvato 2 byte.
ingegnere Toast il

1
Avevo appena scritto questi 20 byte esatti come una soluzione VBScript, e poi ho pensato di vedere se esistesse già un linguaggio in stile VB ed eccolo qui. Quindi, questo funziona anche con VBScript e probabilmente anche con altri linguaggi in stile VB.

@EngineerToast Penso che dovresti contrassegnarlo come un poliglotta con VBScript
Taylor Scott,

@TaylorScott Non l'ho mai fatto prima. L'ho fatto bene?
ingegnere Toast l'

4

Rubino, 15 byte

1/Time.now.wday

wdayrestituirà 0 domenica causando un ZeroDivisionError: diviso per 0 errore. Ad esempio: 1/Time.new(2018,1,7).wday.


4

Perl 5 , 13 byte

1/(gmtime)[6]

Provalo online!

Ported @ biketire's answerj

rimosso 3 byte con il promemoria di @ mik


1
gmtimeinvece di localtimesoddisfare anche le regole, ed è più corto di 3 byte
mik

3

jq, 42 caratteri

(Codice 39 caratteri + opzione riga comandi 3 caratteri)

now|strftime("%w")|strptime("%d")|empty

Sto solo provando un approccio diverso qui: analizza il numero del giorno della settimana (0..6) come numero del giorno del mese (1..31).

Esecuzione di esempio:

bash-4.4$ TZ=UTC faketime 2018-01-06 jq -n 'now|strftime("%w")|strptime("%d")|empty'

bash-4.4$ TZ=UTC faketime 2018-01-07 jq -n 'now|strftime("%w")|strptime("%d")|empty'
jq: error (at <unknown>): date "0" does not match format "%d"

Nota che jq gestisce solo le date UTC.

Provalo online!



3

VBA 18 byte

Questo si basa sulla funzione integrata che date()restituisce un numero di giorno che rimane 1 se diviso per 7, quindi potrebbe essere specifico del sistema operativo e / o della CPU.

a=1/(date mod 7-1)

Funziona nella finestra immediata del progetto VBA.


2
Benvenuti in PPCG! In generale, sono apprezzate una spiegazione e un collegamento a un compilatore / interprete online.
FantaC

@tfbninja - ok aggiornamento
JohnRC

e, se necessario, istruzioni per l'uso, ad es. chiamata di funzione o variabile
FantaC

Bel golf, stavo per pubblicare questo post da solo dopo aver visto l'altra risposta!
Greedo,

3

R , 31 byte 30 byte

if(format(Sys.Date(),'%u')>6)a

Provalo online!

Nessuna uscita la domenica, la Error: object 'a' not founddomenica.

format(Sys.Date(),'%u')era il modo più breve che potessi trovare per arrivare nei giorni feriali, produce un numero di classe di caratteri per il giorno della settimana, con 7 per la domenica. Possiamo confrontare con un 7 numerico e, se vero, tentare di usare un oggetto indefinito.

Salvataggio di un byte grazie a Giuseppe!


>6è un byte più breve.
Giuseppe

2

Ocaml, 46 byte

open Unix
let()=1/(gmtime(time())).tm_wday;()

e in ocaml REPL, possiamo ottenere risultati migliori rimuovendo lete il finale :():

$ open Unix;;1/(gmtime(time())).tm_wday;;<CR>

che è 41 byte (incluso 1 byte per il ritorno a capo).


1
Benvenuti in PPCG!
Laikoni,

1
È possibile far funzionare questo codice su Provalo online ?
Laikoni,

Mmh ... il comando di compilazione è ocamlopt unix.cmxa <file>, non so come dare l'opzione di compilazione su tio. Stasera
indagherò

Il tio usa un interprete REPL (simili), quindi dovresti usare la seconda possibilità. Tuttavia, non sembra avere la libreria Unix (o non consentire l'accesso ad essa, per qualsiasi motivo)
Bromind

2

SAS, 36 byte

%put %eval(1/(1-%index(&sysday,Su)))

2

TI-Basic 84+, 23 byte

getDate
0/(1-dayOfWk(Ans(1),Ans(2),Ans(3

Richiede comandi di data e ora, che sono solo 84+ e superiori.


2

MATL , 12 byte

vZ'8XOs309>)

L'errore prodotto la domenica è:

  • In esecuzione su Octave:

    MATL run-time error: The following Octave error refers to statement number 9:  )
    ---
    array(1): out of bound 0
    
  • In esecuzione su Matlab:

    MATL run-time error: The following MATLAB error refers to statement number 9:  )
    ---
    Index exceeds matrix dimensions
    

Per invertire il comportamento (errore in qualsiasi giorno tranne la domenica), aggiungere ~dopo >.

Provalo online!

Spiegazione

Questo sfrutta il fatto che

  • l'indicizzazione in un array vuoto con l'indice logico falseè valida (e il risultato è un array vuoto, che non produce output); mentre

  • l'indicizzazione con truecausa un errore perché nell'array manca una prima voce.

Codice commentato:

v       % Concatenate stack. Gives empty array
Z'      % Push current date and time as a number
8XO     % Convert to date string with format 8: gives 'Mon', 'Tue' etc
s       % Sum of ASCII codes. Gives 310 for 'Sun', and less for others
309>    % Greater than 309? Gives true for 'Sun', false for others
)       % Index into the empty array
        % Implicit display. Empty arrays are not displayed (not even newline)

2

Q, 20 byte

if[1=.z.d mod 7;'e]

.zd restituisce la data corrente. mod fa il modulo della data corrente, che restituisce un int. Se la data è di domenica, il .zd mod 7 restituisce 1. Se 1 = 1, (di domenica), e l'errore viene generato usando l'operatore 'Per brevità, l'errore è solo il carattere e.


3
Benvenuti in PPCG!
Martin Ender,

2

C # (.NET Core) , 55 54 48 byte

Provalo online!

Salvato 1 byte grazie a Shaggy

5 byte salvati grazie a Emigna

Salvato 1 byte grazie a Kevin Cruijssen

_=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}

Fortunatamente quella domenica è indicizzata 0 in enum, altrimenti avrebbe dovuto essere (System.DayOfWeek)7



3
Ricevi using Systemgratis in C #? Se è così penso che potresti fare ()=>{var k=1/(int)DateTime.Now.DayOfWeek;}per 42 . Altrimenti 49 con l'esplicitoSystem.
Emigna

3
@Emigna mi ha battuto; ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}è più corto. E puoi salvare un altro byte utilizzando un parametro vuoto inutilizzato anziché nessun parametro (ovvero v->{...}invece di ()->{...})
Kevin Cruijssen,

1
40 byte: ()=>1/(int)System.DateTime.Now.DayOfWeek. Provalo qui .
Ayb4btu,


2

C,  68  55 byte

Grazie a @Ken YN per aver salvato 13 byte!

#import<time.h>
f(n){time(&n);n/=gmtime(&n)->tm_wday;;}

Provalo online!


Elimina l'intermedio dper ottenere n/=gmtime(&n)->tm_wday;54 byte (ma non sono sicuro che mi piacciano tutti questi avvisi del compilatore ...)
Ken YN,

@ KenY-N Grazie!
Steadybox

1

R , 40 byte

stopifnot(weekdays(Sys.Date(),T)!="Sun")

Provalo online!

weekdaysrestituisce il giorno della settimana della data, con un argomento facoltativo abbreviate, che si accorcia Sundaya Sun, salvando un singolo byte.

stopifnotgenera un errore se, per ogni argomento, non lo allsono TRUEe genera un errore con un messaggio che indica il primo elemento del quale non lo è TRUE, quindi l'errore èError: "Sun" is not TRUE




1

Gema , 40 personaggi

\A=@subst{Su=\@err\{S\}\;*=;@datime}@end

Ho dovuto specificare un messaggio di errore, quindi scegline uno breve: "S".

Esecuzione di esempio:

bash-4.4$ faketime 2018-01-06 gema '\A=@subst{Su=\@err\{S\}\;*=;@datime}@end'

bash-4.4$ faketime 2018-01-07 gema '\A=@subst{Su=\@err\{S\}\;*=;@datime}@end'
S

1

impaurito , 21 byte

if!os.date"%w"error()

os.date"%w"restituisce il giorno corrente della settimana nel formato 0-6, dove 0 è domenica. Ottenere la logica non è vero solo quando il giorno della settimana è 0, quindi domenica. Quindi solo una base if(a){error()}assicurerà che questo programma si romperà solo di domenica

Provalo online!



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.