Nous avons eu une fois une question qui n'a échoué que le dimanche

39

Inspiré par Nous avons eu une fois un test unitaire qui n’a échoué que le dimanche , écrivez un programme ou une fonction qui ne fait que renvoyer une erreur le dimanche et sortez gracieusement un autre jour.

Règles:

  • Aucune utilisation ou affichage de la sortie à l'aide des méthodes IO habituelles , sauf pour imprimer sur STDERR ou l'équivalent dans votre langue. Vous êtes autorisé à imprimer sur STDOUT s'il s'agit d'un sous-produit de votre erreur.
  • Une fonction peut renvoyer une valeur les jours autres que le dimanche à condition de ne rien imprimer.
  • Votre programme peut utiliser un dimanche de n’importe quel fuseau horaire ou le fuseau horaire local, à condition qu’il soit cohérent.
  • Une erreur est quelque chose qui provoque une fin anormale du programme , telle qu'une erreur de division par zéro ou l'utilisation d'une variable non initialisée. Cela signifie que si du code devait être ajouté après la partie erronée, il ne serait pas exécuté le dimanche.
    • Vous pouvez également utiliser des instructions qui créent manuellement une erreur, équivalente à celle de Python raise.
    • Cela inclut les erreurs d'exécution, les erreurs de syntaxe et les erreurs lors de la compilation (bonne chance avec ça!)
  • En cas d'erreur, il doit y avoir un signe qui le distingue de l'absence d'erreur
  • C'est du , donc le compte le plus court dans chaque langue gagne!

Je vais devoir attendre dimanche pour vérifier les réponses;)

Jo King
la source
2
Par "écrire un programme ou une fonction qui ne fait que lancer une erreur le dimanche et quitter normalement un autre jour", voulez-vous dire que chaque fois qu'il est exécuté le dimanche, il devrait échouer, ou voulez-vous dire qu'il devrait y avoir au moins une possibilité il échoue un dimanche. Pour que ce soit plus clair, s'il échoue seulement le dimanche à 14 heures mais pas le dimanche à 15 heures, est-ce que ça va?
Bromind
5
Cela aurait été encore mieux si samedi avait été utilisé. Vous auriez pu l'appeler "Saturday Night Error" et même avoir intégré des paroles de chanson ajustées à la question.
Aaron
3
Les dimanches? Pourquoi ne pas échouer entre minuit et 1 heure du matin ?
Draco18s
1
Votre question ne dit pas clairement ce qui constitue une erreur. Je vote pour fermer jusqu'à ce que cela soit corrigé.
Wheat Wizard
3
Pas vraiment ... Comment distinguer la sortie d'une erreur de la sortie normale. Est-ce que quelque chose comme print "error"une erreur? Le paragraphe ajouté ne clarifie vraiment rien.
Wheat Wizard

Réponses:

18

PHP 7, 12 octets

1%date("w");

Sur PHP 7, une exception de type est DivisionByZerolancée le dimanche. La même chose se produit si elle est interprétée avec HHVM .

Sur PHP 5, un avertissement (activé stderr) est affiché le dimanche:

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

Sur n'importe quelle version de PHP, il n'affiche rien les autres jours de la semaine.

Exécuter en utilisant le CLI:

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

ou essayez-le en ligne!

Deux autres octets peuvent être pressés par dépouillant les guillemets ( 1%date(w);) mais cela déclenche un avis (qui peut être supprimé par correctement définies error_reporting = E_ALL & ~E_NOTICEdans php.ini).

axiac
la source
Je crois que vous devez spécifier (dans le titre) que cette réponse est uniquement et uniquement pour PHP7 + et pour HHVM, puisque PHP5.6 et la sortie inférieure se déroulent sans aucun problème. Les avertissements ne sont pas des erreurs et n'arrêtent pas l'exécution du code. Si vous le faites 1%date("w");echo "Alive!", cela s'arrêtera dans PHP7 + et HHVM, mais pas dans toutes les autres versions depuis PHP 4.
Ismael Miguel
@IsmaelMiguel, la question considère toute impression comme erreur standard comme une erreur. Un avertissement suffit donc dans ce cas.
S'il vous plaît, arrêtez d'être méchant le
1
En citant la question: "Une erreur est quelque chose qui provoque une fin anormale du programme , telle qu'une erreur de division par zéro ou l'utilisation d'une variable non initialisée. Cela signifie que si du code devait être ajouté après la partie qui d'erreur, il ne serait pas exécuté le dimanche ". Cela n'arrive pas avec un avertissement.
Ismael Miguel
@IsmaelMiguel, le paragraphe que vous citez a été ajouté à la question il y a moins d'une heure.
axiac
1
Citant une version plus ancienne, celle qui était allumée au moment du commentaire que j’écrivais: "écrivez un programme ou une fonction qui ne fait que [...] créer une erreur quand il est dimanche et qui se termine normalement un autre jour. . ". Un avertissement est contre cette ligne car PHP se fermera normalement. Une erreur serait une erreur fatale ou une erreur de syntaxe. Pas un avertissement pour la division par 0. PHP 5.6 et les versions antérieures ne sont pas valables pour ce défi.
Ismael Miguel
9

PHP, 15 octets

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

Suppose les paramètres par défaut .

Sortie le dimanche

Fatal error: Undefined constant 'n' on line 1

Essayez-le en ligne!

primo
la source
2
Notez que cette réponse nécessite PHP 5.3+. Une alternative pourrait être à la ||\nplace de ?:\n.
Ismael Miguel
8

Java 8, 69 43 34 octets

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

-26 octets grâce à @ OlivierGrégoire .
-9 octets grâce à @Neil .

Explication:

Essayez ici.

  • v->{...}( paramètre non utiliséVoid null ) est un octet plus court que ()->{...}(pas de paramètre).
  • new java.util.Date().getDay()retournera 0-6 pour dimanche-samedi, donc 1/...donnera une java.lang.ArithmeticException: / by zeroerreur si la valeur est 0, ce qui n'arrive que le dimanche.
Kevin Cruijssen
la source
1
v->{int i=1/new java.util.Date().getDay();}(43 octets).
Olivier Grégoire
@ OlivierGrégoire Ah, java.util.Date()a une méthode pour obtenir le jour de la semaine .. Et il est même 0 pour dimanche .. Je ne sais pas comment j'ai raté ça. : S
Kevin Cruijssen
Oui, les classes plus anciennes ont généralement toutes les fonctionnalités dans des noms plus courts. ;-)
Olivier Grégoire
1
Est-ce valable pour 34 octets? Essayez-le en ligne!
Neil
@Neil n'était pas valide au moment où vous avez posté votre message mais est devenu valide moins d'une heure plus tard. ;-) C'était ma première idée, cependant ...
Olivier Grégoire
7

Python 3 , 33 octets

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

Essayez-le en ligne!

Python 3 , 50 octets

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

Essayez-le en ligne!

Sauvegardé ~ 3 octets grâce à Rod .

M. Xcoder
la source
1
@Rod Pourquoi pas "Su"in time.ctime()>q(je montais avec celui-ci)?
M. Xcoder
Je ne peux pas tout à fait comprendre. Comment ça marche?
Pacholik
@pacholik "Su"in time.ctime()vérifie si le jour actuel est le dimanche. Si c'est faux, la >qpièce n'est pas du tout évaluée et tout se passe bien. Mais si cela est vrai, alors la deuxième partie de l'inégalité est évaluée et, comme elle qn'est pas définie, cela produirait un NameError.
M. Xcoder
1
@pacholik Edit: Je ne pense pas que je me trompe. Pour des raisons d'efficacité, si la première partie est falsy, Python ne se donne même pas la peine d'évaluer la dernière partie. Je vais devoir attendre dimanche pour tester cela, cependant. ( Je pense ) Démonstration .
M. Xcoder
3
@pacholik Notez que Python enchaîne les opérateurs booléens, ce qui équivaut à ("Su" in time.ctime()) and (time.ctime() > q).
user202729
6

Pyth , 8 7 octets

 l-6.d9

Essayez-le en ligne!

Explication

    .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
Barre
la source
Ceci est toujours invalide. Votre sortie ( 1.0n'est pas générée par l'erreur ). Le PO a dit explicitement qu'il ne le permettait pas. Vous pouvez résoudre ce problème en ajoutant un espace à votre code, cependant
M. Xcoder
Mais vous n'êtes pas autorisé à sortir vers STDOUT à moins que ce ne soit dimanche, et vous produirez vers STDOUT.
M. Xcoder
@ Mr.Xcoder est correct. Les dimanches autres que rien ne devrait sortir
Jo King
@JoKing J'ai totalement ignoré cette règle, corrigée maintenant
Rod
6

Haskell + Data.Dates , 55 octets

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

Essayez-le en ligne!

Ceci utilise le fait que le dimanche est le dernier jour de la semaine. dateWeekDayrenvoie le jour de la semaine en tant que WeekDaytype, qui est simplement défini comme

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

WeekDayest une instance de Enum, nous pouvons donc utiliser succet predobtenir le successeur ou le prédécesseur d’un jour de la semaine, par exemple, les succ Mondayrendements Tuesday.

Toutefois, il Sundays’agit de la dernière entrée enum. L’appel succ Sundayentraîne donc l’erreur suivante:

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

Edit 1: Merci à nimi pour -3 octets!
Edit 2: -11 octets maintenant que les fonctions sont autorisées.


Programme complet: 88 81 74 69 66 octets

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

Essayez-le en ligne!

pure est nécessaire pour lever le résultat WeekDay ramener dans la Monad IO. Cependant, Haskell voit que le programme n'émet aucune valeur. Aussi paresseux qu'il soit, l'expression n'est pas évaluée. Ainsi, même le dimanche, le programme n'échoue pas. C'est pourquoi il $!est nécessaire, ce qui force l'évaluation même si normalement Haskell n'évalue pas l'expression.


Approche précédente avec Data.Time: 127 124 octets

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

Essayez-le en ligne! Ce sont des importations impressionnantes. Changez d<7par exemple d/=5pour tester l’échec un vendredi. Ne parvient pas à l'exception suivante: Non-exhaustive patterns in function c.

Laikoni
la source
1
main=pure$!succ.dateWeekDay<$>getCurrentDateTime. Et, comme les fonctions sont autorisées, vous pouvez supprimer le fichier main=.
nimi
@nimi Merci! Je ne suis pas sûr de la fonction cependant, à cause de la No using input or showing output through the usual IO methodsrègle. Autant que je sache, l'utilisation d'une fonction produirait une sortie pour les jours non dimanches, même si elle est encapsulée dans une action IO.
Laikoni
Vous avez peut-être raison, mais par contre, un programme complet a un code de sortie, qui est également une méthode standard.
Nimi
... les règles de challenge permettent désormais aux fonctions de renvoyer des valeurs les dimanches non imprimés tant qu'elles ne sont pas imprimées.
nimi
@nimi Merci pour la notification.
Laikoni
5

05AB1E , 45 44 octets

Comme 05AB1E n'est pas construit pour obtenir le jour de la semaine, j'ai utilisé la règle de Zeller pour le calculer.

Imprime une nouvelle ligne sur stderr en cas de dimanche (observable dans la vue de débogage sur TIO)

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

Essayez-le en ligne!

Explication

La formule générale est utilisé
DoW = d + [(13*(m+1))/5] + y + [y/4] + [c/4] - 2*c
DoW=day of week, d=day, m=month, y=last 2 digits of year, c=centuryet et l' expression entre parenthèses ([] ) est arrondie vers le bas.

Chaque mois utilisé dans la formule correspond à un nombre, où Jan=13,Feb=14,Mar=3,...,Dec=12
Comme nous avons le mois en cours dans le format le plus courant, Jan=1,...,Dec=12 nous convertissons le mois en utilisant la formule
m = (m0 + 11) % 14 + 1

En tant que biproduit de Mars étant le premier mois, Janvier et Février appartiennent à l'année précédente, de sorte que le calcul pour la détermination ydevient
y = (year - (m0 < 3)) % 100

La valeur finale pour DoWnous obtenons est un int où 0=Sat,1=Sun,...,6=Fri.
Maintenant, nous pouvons explicitement renvoyer une erreur si le résultat est vrai.

Emigna
la source
11
05AB1E perdre à Java? Tout ce que je sais est un mensonge
Kamil Drakari
5

JavaScript, 23 octets

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

Programme complet.

La variable kne doit pas être définie.

JavaScript, 20 octets par Rick Hitchcock

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

JavaScript, 19 octets par apsillers

Date().match`Su`&&k
l4m2
la source
1) Vous avez oublié d'inclure le _=>; sans cela, il s'agit d'un extrait qui n'est pas autorisé par défaut. 2) Cela sort falsetous les deux jours quand il ne devrait rien sortir.
Shaggy
6
1) C'est un programme complet, autorisé par l'OP. 2) Si vous l'exécutez en tant que programme, il n'y a pas de sortie
l4m2
3
/Su/.test(Date())&&kpour 20 octets.
Rick Hitchcock
1
new Dateversion 25 octets(new Date/864e5%7|0)-3||p
l4m2
3
La solution de @RickHitchcock peut être raccourcie par une exécution de template-tag sur match:Date().match`Su`&&k
apsillers
5

VBA / VBScript, 22 à 20 octets

2 octets sauvés grâce à Taylor Scott.

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

Cela devrait être exécuté dans la fenêtre immédiate. Weekday()renvoie 1 (dimanche) à 7 (samedi), ce qui crée une erreur de division par zéro le dimanche. Sinon, pas de sortie.

Error Message

Rôti d'ingénieur
la source
Vous m'avez battu à une réponse d'une heure - 19 octets:?1/(Weekday(Now)-1)
Taylor Scott
1
@TaylorScott j'ai oublié que Nowc'est valide sans le ()dans VBA mais je ne peux pas utiliser print car je pense que toutes les sorties sont interdites sauf si elles sont erronées. No using input or showing output through the usual IO methods, except to print to STDERR. Toujours, enregistré 2 octets.
Ingénieur Toast
1
Je venais tout juste d’écrire ces 20 octets sous forme de solution VBScript, puis j’ai pensé que j’aimerais vérifier s’il existait déjà un langage de type VB, et qu’il est ici. Donc, cela fonctionne pour VBScript et probablement aussi pour d’autres langages de style VB.
@EngineerToast Je pense que vous devriez marquer cela comme un polyglotte avec VBScript
Taylor Scott
@TaylorScott Je ne l'avais jamais fait auparavant. L'ai-je bien fait?
Ingénieur Toast
4

Ruby, 15 octets

1/Time.now.wday

wdayretournera 0 dimanche causant une erreur ZeroDivisionError: divisée par 0. Par exemple: 1/Time.new(2018,1,7).wday.

Biketire
la source
4

Perl 5 , 13 octets

1/(gmtime)[6]

Essayez-le en ligne!

Ported @ biketire's answerj

supprimé 3 octets avec le rappel de @ mik

Xcali
la source
1
gmtimeau lieu de localtimesera également conforme aux règles, et est de 3 octets plus court
mik
3

jq, 42 caractères

(Option de ligne de commande code 39 caractères + 3 caractères)

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

Essayez simplement une approche différente ici: analysez le numéro du jour de la semaine (0..6) en tant que numéro du jour du mois (1..31).

Échantillon échantillon:

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"

Notez que jq ne gère que les dates UTC.

Essayez-le en ligne!

homme au travail
la source
3

C, 35, 34 27 octets

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

-7 octets avec merci à @MartinEnder et @Dennis

Essayez-le en ligne!

Alnitak
la source
3
Bienvenue chez PPCG!
Martin Ender
3

VBA 18 octets

Cela repose sur la fonction intégrée date()renvoyant un numéro de jour restant pour 1 si divisé par 7. Cela peut donc être spécifique au système d'exploitation et / ou à la CPU.

a=1/(date mod 7-1)

Il s'exécute dans la fenêtre Immédiate du projet VBA.

JohnRC
la source
2
Bienvenue chez PPCG! En général, une explication et un lien vers un compilateur / interprète en ligne sont appréciés.
FantaC
@tfbninja - mise à jour ok
JohnRC
et, si nécessaire, des instructions d'utilisation, par exemple, appel de fonction ou variable
FantaC
Beau golf, était sur le point de poster moi-même après avoir vu l'autre réponse!
Greedo
3

R , 31 octets 30 octets

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

Essayez-le en ligne!

Pas de sortie en dehors des dimanches, Error: object 'a' not found les dimanches.

format(Sys.Date(),'%u')C’est le moyen le plus rapide que j’ai trouvé d’obtenir un jour de la semaine. Il donne un numéro de classe de caractères pour le jour de la semaine et 7 pour le dimanche. Nous pouvons comparer à un nombre numérique 7, et si vrai tenter d'utiliser un objet non défini.

Enregistré un octet grâce à Giuseppe!

Gregor
la source
>6est un octet plus court.
Giuseppe
2

Ocaml, 46 octets

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

et dans l’ocaml REPL, nous pouvons obtenir de meilleurs résultats en supprimant le letet le final :():

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

soit 41 octets (y compris 1 octet pour le retour de transport).

Bromind
la source
1
Bienvenue chez PPCG!
Laikoni
1
Est-il possible de faire fonctionner ce code sur Essayez-le en ligne ?
Laikoni
Mmh ... la commande de compilation est ocamlopt unix.cmxa <fichier>, je ne sais pas comment donner l'option de compilation à tio. Je vais enquêter ce soir
Bromind
Le tio utilise un interprète (similaire) REPL, vous devriez donc utiliser la deuxième possibilité. Cependant, il ne semble pas avoir la bibliothèque Unix (ou ne pas en permettre l'accès, pour quelque raison que ce soit)
Bromind
2

SAS, 36 octets

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

TI-Basic 84+, 23 octets

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

Nécessite des commandes de date et d’heure, à partir de 84 ans seulement.

Timtech
la source
2

MATL , 12 octets

vZ'8XOs309>)

L'erreur produite le dimanche est la suivante:

  • Courir sur Octave:

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

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

Pour inverser le comportement (erreur chaque jour sauf le dimanche), ajoutez ~après >.

Essayez-le en ligne!

Explication

Cela exploite le fait que

  • l'indexation dans un tableau vide avec l'index logique falseest valide (et le résultat est un tableau vide, qui ne produit aucune sortie); tandis que

  • l'indexation avec trueprovoque une erreur car il manque une première entrée dans le tableau.

Code commenté:

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
la source
2

Q, 20 octets

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

.zd renvoie la date actuelle. mod fait le modulo de la date actuelle, ce qui retourne un int. Si la date est un dimanche, .zd mod 7 renvoie 1. Si 1 = 1, (le dimanche) et si une erreur est générée à l'aide de l'opérateur 'Par souci de brièveté, l'erreur est simplement le caractère e.

tkg
la source
3
Welcome to PPCG!
Martin Ender
2

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

Try it online!

Saved 1 byte thanks to Shaggy

Saved 5 byte thanks to Emigna

Saved 1 byte thanks to Kevin Cruijssen

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

Lucky that Sunday is indexed 0 in enum or else it would've needed to be (System.DayOfWeek)7

LiefdeWen
la source
1
54 bytes?
Shaggy
3
Do you get using System for free in C#? If so I think you could do ()=>{var k=1/(int)DateTime.Now.DayOfWeek;} for 42. Otherwise 49 with the explicit System.
Emigna
3
@Emigna beat me to it; ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;} is shorter. And you can save one more byte by using an empty unused parameter instead of no parameter (i.e. v->{...} instead of ()->{...})
Kevin Cruijssen
1
40 bytes: ()=>1/(int)System.DateTime.Now.DayOfWeek. Try it here.
Ayb4btu
2

Groovy, 16 bytes

1/new Date().day

Try it online!

RandomOfAmbr
la source
Welcome to PPCG!
Martin Ender
Thanks! Also, thanks for editing! I was not sure which online playground to choose. Now I know. :)
RandomOfAmbr
2

C,  68  55 bytes

Thanks to @Ken Y-N for saving 13 bytes!

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

Try it online!

Steadybox
la source
Drop the intermediate d to get n/=gmtime(&n)->tm_wday; for 54 bytes (but I'm not sure I like all these compiler warnings...)
Ken Y-N
@KenY-N Thanks!
Steadybox
1

R, 40 bytes

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

Try it online!

weekdays returns the weekday of the date, with an optional argument abbreviate, which shortens Sunday to Sun, saving a single byte.

stopifnot throws an error if, for each argument, not all are TRUE, and throws an error with a message indicating the first element of which isn't TRUE, so the error is Error: "Sun" is not TRUE

Giuseppe
la source
Got it down to 31 with a slightly different approach
Gregor
1

Gema, 40 characters

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

Had to specify an error message, so choose a short one: “S”.

Sample run:

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
manatwork
la source
1

Funky, 21 bytes

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

os.date"%w" returns the current day of the week in 0-6 format, where 0 is sunday. Getting the logical not of that is only true when the weekday is 0, so Sunday. Then just a basic if(a){error()} will assure that this program only errors on sunday

Try it online!

ATaco
la source