Una vez tuvimos una pregunta que solo fallaba los domingos

39

Inspirado por Tuvimos una prueba de unidad una vez que solo falló los domingos , escribimos un programa o función que no hace nada más que arrojar un error cuando es domingo y salir con gracia cualquier otro día.

Reglas:

  • No use la entrada o muestre la salida a través de los métodos de E / S habituales , excepto para imprimir en STDERR o el equivalente de su idioma. Puede imprimir en STDOUT si es un subproducto de su error.
  • Una función puede devolver un valor los no domingos siempre que no imprima nada
  • Su programa puede usar un domingo desde cualquier zona horaria, o la zona horaria local, siempre que sea consistente.
  • Un error es algo que hace que el programa finalice de manera anormal , como un error de división por cero o el uso de una variable no inicializada. Esto significa que si se agregara un código después de la parte que contiene errores, no se ejecutará el domingo.
    • También puede usar declaraciones que creen manualmente un error, equivalente al de Python raise.
    • Esto incluye errores de tiempo de ejecución, errores de sintaxis y errores durante la compilación (¡buena suerte con eso!)
  • En un error debe haber algún signo que lo distinga de no tener error
  • Este es el , por lo que gana el bytecount más corto en cada idioma.

Tendré que esperar hasta el domingo para verificar las respuestas;)

Jo King
fuente
2
Al "escribir un programa o función que no hace nada más que arrojar un error el domingo y salir con gracia cualquier otro día", ¿quiere decir que cada vez que se ejecuta el domingo debería fallar, o quiere decir que debería haber al menos Una posibilidad es que falle un domingo. Para aclararlo, si falla solo el domingo a las 2 p.m., pero no el domingo a las 3 p.m., ¿está bien?
Bromind el
55
Esto hubiera sido aún mejor si se hubiera utilizado el sábado. Podrías haberlo llamado "Saturday Night Error" e incluso trabajar en algunas letras de canciones ajustadas a la pregunta.
Aaron
3
Domingos? ¿Qué tal fallar entre la medianoche y la 1am ?
Draco18s
1
No está claro en su pregunta qué constituye un error. Voy a votar para cerrar hasta que esto se solucione.
Wheat Wizard
3
En realidad no ... ¿Cómo podemos distinguir la salida de un error de la salida normal? ¿Es algo así como print "error"un error? El párrafo agregado realmente no aclara nada.
Wheat Wizard

Respuestas:

18

PHP 7, 12 bytes

1%date("w");

En PHP 7 arroja una excepción de tipo DivisionByZerolos domingos. Lo mismo sucede si se interpreta con HHVM .

En PHP 5 muestra una advertencia (activada stderr) los domingos:

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

En cualquier versión de PHP, no muestra nada los otros días de la semana.

Ejecutar usando la CLI:

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

o pruébalo en línea!

Dos bytes más pueden ser exprimidos por extracción de las comillas ( 1%date(w);), pero esto provoca un aviso (que puede ser suprimida por estar adecuadamente ajustado error_reporting = E_ALL & ~E_NOTICEen php.ini).

axiac
fuente
Creo que debe especificar (en el título) que esta respuesta es solo y solo para PHP7 + y para HHVM, ya que PHP5.6 y la salida inferior sin ningún problema. Las advertencias no son errores y no detienen la ejecución del código. Si lo hace 1%date("w");echo "Alive!", se detendrá en PHP7 + y HHVM, pero no en todas las otras versiones desde PHP 4.
Ismael Miguel
@IsmaelMiguel la pregunta clasifica cualquier impresión en Error estándar como un error, por lo que una advertencia es lo suficientemente buena en este caso.
Por favor, deja de ser malvado el
1
Citando la pregunta: "Un error es algo que hace que el programa finalice de manera anormal , como un error de división por cero o el uso de una variable no inicializada. Esto significa que si se agregara un código después de la parte que contiene los errores, no sería ejecutado el domingo ". Esto no sucede con una advertencia.
Ismael Miguel
@IsmaelMiguel, el párrafo que está citando se agregó a la pregunta hace menos de una hora.
axiac
1
Citando una versión anterior, la que estaba en el momento del comentario que escribí: "[...] escriba un programa o función que no haga nada más que arrojar un error cuando sea domingo, y salga con gracia en cualquier otro día ". Una advertencia está en contra de esta línea porque PHP saldrá con gracia. Un error sería un error fatal o un error de sintaxis. No es una advertencia para dividir entre 0. PHP 5.6 y anteriores no son válidos para este desafío.
Ismael Miguel
9

PHP, 15 bytes

<?@date(w)?:\n;

Asume la configuración predeterminada .

Salida los domingos

Fatal error: Undefined constant 'n' on line 1

Pruébalo en línea!

primo
fuente
2
Tenga en cuenta que esta respuesta requiere PHP 5.3+. Una alternativa podría ser en ||\nlugar de ?:\n.
Ismael Miguel
8

Java 8, 69 43 34 bytes

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

-26 bytes gracias a @ OlivierGrégoire .
-9 bytes gracias a @Neil .

Explicación:

Pruébalo aquí

  • v->{...}( parámetro no utilizadoVoid null ) es un byte más corto que ()->{...}(sin parámetro).
  • new java.util.Date().getDay()devolverá 0-6 de domingo a sábado, por 1/...lo que dará un java.lang.ArithmeticException: / by zeroerror si el valor es 0, lo que solo ocurre los domingos.
Kevin Cruijssen
fuente
1
v->{int i=1/new java.util.Date().getDay();}(43 bytes).
Olivier Grégoire
@ OlivierGrégoire Ah, java.util.Date()tiene un método para obtener el día de la semana ... Y es incluso 0 para el domingo ... No estoy seguro de cómo me perdí eso. : S
Kevin Cruijssen
Sí, generalmente las clases más antiguas tienen toda la funcionalidad en nombres más cortos. ;-)
Olivier Grégoire
1
¿Es válido para 34 bytes? Pruébalo en línea!
Neil
@Neil no era válido en el momento en que publicó, pero se hizo válido menos de una hora más tarde. ;-) Fue mi primera idea, aunque ...
Olivier Grégoire
7

Python 3 , 33 bytes

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

Pruébalo en línea!

Python 3 , 50 bytes

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

Pruébalo en línea!

Guardado ~ 3 bytes gracias a Rod .

Sr. Xcoder
fuente
1
@ Rod ¿Por qué no "Su"in time.ctime()>q(estaba editando con este)?
Sr. Xcoder
No puedo entenderlo. ¿Como funciona?
pacholik
@pacholik "Su"in time.ctime()comprueba si el día actual es domingo. Si esto es falso, la >qparte no se evalúa en absoluto y todo sale sin problemas. Pero si eso es cierto, entonces se evalúa la segunda parte de la desigualdad, y como qno está definida, esto arrojaría un NameError.
Sr. Xcoder
1
@pacholik Edit: no creo que me equivoque. Para fines de eficiencia, si la primera parte es falsa, entonces Python ni siquiera se molesta en evaluar la última parte. Sin embargo, tendré que esperar hasta el domingo para probar esto. ( Creo ) Demostración .
Sr. Xcoder
3
@pacholik Tenga en cuenta que Python encadena operadores booleanos, por lo que es equivalente a ("Su" in time.ctime()) and (time.ctime() > q).
user202729
6

Pyth , 8 7 bytes

 l-6.d9

Pruébalo en línea!

Explicación

    .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
Barra
fuente
Esto aún no es válido. Su salida ( 1.0no se genera por el error ). El OP dijo explícitamente que no lo permiten. Sin embargo, puede arreglar eso anteponiendo un solo espacio a su código
Sr. Xcoder el
Pero no se le permite salir a STDOUT a menos que sea domingo, y sí lo hace a STDOUT.
Sr. Xcoder
@ Mr.Xcoder es correcto. Los domingos no se debe enviar nada
Jo King,
@JoKing Omití totalmente esta regla, arreglada ahora
Rod
6

Haskell + Data . Fechas , 55 bytes

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

Pruébalo en línea!

Esto utiliza el hecho de que el domingo es el último día de la semana. dateWeekDaydevuelve el día de la semana como un WeekDaytipo, que simplemente se define como

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

WeekDayes una instancia de Enum, por lo tanto, podemos usar succy predpara obtener el sucesor o predecesor de un día de la semana, por ejemplo, succ MondayrendimientosTuesday .

Sin embargo, Sundayes la última entrada de enumeración, por lo que llamar succ Sundayproduce el siguiente error:

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

Edición 1: ¡Gracias a nimi por -3 bytes!
Edición 2: -11 bytes ahora que las funciones están permitidas.


Programa completo: 88 81 74 69 66 bytes

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

Pruébalo en línea!

purees necesario para levantar el resultado de WeekDaynuevo a la Mónada IO. Sin embargo, Haskell ve que el programa no genera el valor de ninguna manera, por flojo que sea, la expresión no se evalúa, por lo que incluso los domingos el programa no fallará. Esta es la razón por$! se necesita, lo que obliga a la evaluación incluso si Haskell normalmente no evaluaría la expresión.


Enfoque previo con Data.Time : 127124 bytes

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

Pruébalo en línea! Estas son algunas importaciones impresionantes. Cambie d<7a, por ejemplo, d/=5para probar el fracaso un viernes Falla con la siguiente excepción:Non-exhaustive patterns in function c .

Laikoni
fuente
1
main=pure$!succ.dateWeekDay<$>getCurrentDateTime. Y, como las funciones están permitidas, puede soltar el main=.
nimi
@nimi Gracias! Sin embargo, no estoy seguro de la función, debido a la No using input or showing output through the usual IO methodsregla. Por lo que veo, el uso de una función daría como resultado una salida para no domingos, aunque esté envuelto en una acción IO.
Laikoni
Quizás tenga razón, pero por otro lado, un programa completo tiene un código de salida, que también es un método estándar.
nimi
... las reglas de desafío ahora permiten que las funciones devuelvan valores en no domingos siempre que no se impriman.
nimi
@nimi Gracias por el aviso.
Laikoni
5

05AB1E , 45 44 bytes

Como 05AB1E no tiene incorporado el día de la semana, he usado la regla de Zeller para calcularlo.

Imprime una nueva línea en stderr en caso de un domingo (observable en la vista de depuración en TIO)

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

Pruébalo en línea!

Explicación

La fórmula general utilizada es
DoW = d + [(13*(m+1))/5] + y + [y/4] + [c/4] - 2*c
Donde DoW=day of week, d=day, m=month, y=last 2 digits of year, c=centuryy y la expresión entre paréntesis ( []) es hacia abajo redondeado.

Cada mes usado en la fórmula corresponde a un número, donde Jan=13,Feb=14,Mar=3,...,Dec=12
Como tenemos el mes actual en el formato más común Jan=1,...,Dec=12 , convertimos el mes usando la fórmula
m = (m0 + 11) % 14 + 1

Como un biproducto de marzo es el primer mes, enero y febrero pertenecen al año anterior, por lo que el cálculo para determinar se yconvierte en
y = (year - (m0 < 3)) % 100

El valor final para DoWobtener es un int donde 0=Sat,1=Sun,...,6=Fri.
Ahora podemos arrojar explícitamente un error si el resultado es verdadero.

Emigna
fuente
11
05AB1E perdiendo ante Java? Todo lo que sé es mentira
Kamil Drakari
5

JavaScript, 23 bytes

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

Programa completo

La variable kno debe definirse.

JavaScript, 20 bytes por Rick Hitchcock

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

JavaScript, 19 bytes por apsillers

Date().match`Su`&&k
l4m2
fuente
1) Olvidó incluir el _=>; sin él, este es un fragmento que no está permitido por defecto. 2) Esto falsesale en días alternos cuando no debería generar nada.
Shaggy
66
1) Es un programa completo, que está permitido por el OP. 2) Si lo ejecuta como un programa, no hay salida
l4m2 el
3
/Su/.test(Date())&&kpor 20 bytes.
Rick Hitchcock el
1
new Dateversión 25 bytes(new Date/864e5%7|0)-3||p
l4m2
3
La solución de @RickHitchcock se puede acortar mediante la ejecución de la etiqueta de plantilla en su matchlugar:Date().match`Su`&&k
apsillers
5

VBA / VBScript, 22 20 bytes

Guardado 2 bytes gracias a Taylor Scott.

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

Esto debe ejecutarse en la ventana Inmediato. Weekday()devuelve 1 (domingo) a 7 (sábado) por lo que esto crea un error de división por cero el domingo. De lo contrario, no hay salida.

Mensaje de error

Tostadas de ingeniero
fuente
Me ganaste una respuesta por una hora - 19 Bytes:?1/(Weekday(Now)-1)
Taylor Scott
1
@TaylorScott Olvidé que Nowes válido sin el ()VBA pero no puedo usar print porque creo que no se permite la salida a menos que se produzca un error. No using input or showing output through the usual IO methods, except to print to STDERR. Aún así, guardado 2 bytes.
Engineer Toast el
1
Acababa de escribir estos 20 bytes exactos como una solución VBScript, y luego pensé en ver si había un lenguaje de estilo VB ya presentado y aquí está. Entonces, esto funciona para VBScript y probablemente también para otros lenguajes de estilo VB.
@EngineerToast Creo que deberías marcar esto como un políglota con VBScript
Taylor Scott el
@ TaylorScott No he hecho eso antes. ¿Lo hice bien?
Engineer Toast el
4

Rubí, 15 bytes

1/Time.now.wday

wdaydevolverá 0 el domingo causando un error ZeroDivisionError: dividido por 0. Por ejemplo: 1/Time.new(2018,1,7).wday.

Biketire
fuente
4

Perl 5 , 13 bytes

1/(gmtime)[6]

Pruébalo en línea!

Portado @ biketire's answerj

eliminado 3 bytes con el recordatorio de @ mik

Xcali
fuente
1
gmtimeen lugar de localtime, cubrirán también las reglas, y es de 3 bytes más corto
MIK
3

jq, 42 caracteres

(Código de 39 caracteres + opción de línea de comando de 3 caracteres)

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

Intentando un enfoque diferente aquí: analizar el número del día de la semana (0..6) como el número del día del mes (1..31).

Ejecución de muestra:

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"

Tenga en cuenta que jq solo maneja fechas UTC.

Pruébalo en línea!

hombre trabajando
fuente
3

C, 35, 34 27 bytes

f(n){n/=time(0)/86400%7^3;}

-7 bytes con agradecimiento a @MartinEnder y @Dennis

Pruébalo en línea!

Alnitak
fuente
3
Bienvenido a PPCG!
Martin Ender
3

VBA 18 bytes

Esto se basa en la función incorporada que date()devuelve un número de día que queda 1 si se divide entre 7, por lo que puede ser específico del sistema operativo y / o de la CPU.

a=1/(date mod 7-1)

Se ejecuta en la ventana Inmediato del proyecto VBA.

JohnRC
fuente
2
Bienvenido a PPCG! En general, se agradece una explicación y un enlace a un compilador / intérprete en línea.
FantaC
@tfbninja - ok actualización
JohnRC
y, si es necesario, instrucciones sobre cómo usar, por ejemplo, llamada a función o variable
FantaC
¡Buen golf, estaba a punto de publicar esto yo mismo después de ver la otra respuesta!
Greedo
3

R , 31 bytes 30 bytes

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

Pruébalo en línea!

No hay salida en no domingos, Error: object 'a' not foundlos domingos.

format(Sys.Date(),'%u')fue la forma más corta que pude encontrar para obtener el día de la semana, emite un número de clase de personaje para el día de la semana, con 7 para los domingos. Podemos compararlo con un 7 numérico, y si es verdadero intento de usar un objeto indefinido.

¡Ahorré un byte gracias a Giuseppe!

Gregor
fuente
>6Es un byte más corto.
Giuseppe
2

Ocaml, 46 bytes

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

y en el ocaml REPL, podemos lograr mejores eliminando el lety el final :():

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

que es de 41 bytes (incluido 1 byte para el retorno de carro).

Bromind
fuente
1
Bienvenido a PPCG!
Laikoni
1
¿Es posible hacer que este código funcione en Probar en línea ?
Laikoni
Mmh ... el comando de compilación es ocamlopt unix.cmxa <file>, no sé cómo dar la opción de compilación en tio. Investigaré esta noche
Bromind el
El tio usa un intérprete REPL (simili), por lo que debe usar la segunda posibilidad. Sin embargo, no parece tener la biblioteca de Unix (o no permitir el acceso a ella, por ningún motivo)
Bromind
2

SAS, 36 bytes

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

TI-Basic 84+, 23 bytes

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

Necesita comandos de fecha y hora, que son 84+ y superiores solamente.

Timtech
fuente
2

MATL , 12 bytes

vZ'8XOs309>)

El error producido los domingos es:

  • Corriendo en Octave:

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

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

Para invertir el comportamiento (error en cualquier día excepto los domingos), agregue ~después >.

Pruébalo en línea!

Explicación

Esto explota el hecho de que

  • la indexación en una matriz vacía con el índice lógico falsees válida (y el resultado es una matriz vacía, que no produce salida); mientras

  • indexar con truecausa un error porque la matriz carece de una primera entrada.

Código comentado:

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)
Luis Mendo
fuente
2

Q, 20 bytes

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

.zd devuelve la fecha actual. mod hace el módulo de la fecha actual, que devuelve un int. Si la fecha es un domingo, .zd mod 7 devuelve 1. Si 1 = 1, (el domingo), y el error se genera utilizando el operador 'Por brevedad, el error es solo el carácter e.

tkg
fuente
3
Bienvenido a PPCG!
Martin Ender
2

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

Pruébalo en línea!

Guardado 1 byte gracias a Shaggy

Guardado 5 bytes gracias a Emigna

Guardado 1 byte gracias a Kevin Cruijssen

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

Afortunadamente ese domingo está indexado 0 en enumeración o de lo contrario habría sido necesario (System.DayOfWeek)7

LiefdeWen
fuente
1
54 bytes ?
Shaggy
3
¿Obtiene using Systemgratis en C #? Si es así, creo que podrías hacerlo ()=>{var k=1/(int)DateTime.Now.DayOfWeek;}por 42 . De lo contrario 49 con lo explícitoSystem.
Emigna
3
@Emigna me ganó; ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}Es más corto. Y puede guardar un byte más utilizando un parámetro vacío no utilizado en lugar de ningún parámetro (es decir, en v->{...}lugar de ()->{...})
Kevin Cruijssen
1
40 Bytes: ()=>1/(int)System.DateTime.Now.DayOfWeek. Pruébalo aquí .
Ayb4btu
2

Groovy , 16 bytes

1/new Date().day

Pruébalo en línea!

RandomOfAmbr
fuente
Bienvenido a PPCG!
Martin Ender
¡Gracias! Además, gracias por editar! No estaba seguro de qué patio de recreo en línea elegir. Ahora sé. :)
RandomOfAmbr
2

C,  68  55 bytes

¡Gracias a @Ken YN por guardar 13 bytes!

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

Pruébalo en línea!

Steadybox
fuente
Suelta el intermedio dpara obtener n/=gmtime(&n)->tm_wday;54 bytes (pero no estoy seguro de que me gusten todas estas advertencias del compilador ...)
Ken YN
@ KenY-N ¡Gracias!
Steadybox
1

R , 40 bytes

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

Pruébalo en línea!

weekdaysdevuelve el día de la semana de la fecha, con un argumento opcional abbreviate, que acorta Sundaya Sun, el ahorro de un solo byte.

stopifnotarroja un error si, para cada argumento, no allson TRUE, y arroja un error con un mensaje que indica que el primer elemento no es TRUE, entonces el error esError: "Sun" is not TRUE

Giuseppe
fuente
1

Gema , 40 personajes

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

Tenía que especificar un mensaje de error, así que elija uno corto: "S".

Ejecución de muestra:

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
hombre trabajando
fuente
1

Funky , 21 bytes

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

os.date"%w"devuelve el día actual de la semana en formato 0-6, donde 0 es domingo. Obtener el no lógico de eso solo es cierto cuando el día de la semana es 0, entonces el domingo. Entonces solo un básicoif(a){error()} asegurará que este programa solo produzca errores el domingo

Pruébalo en línea!

Un taco
fuente