Raz mieliśmy pytanie, które zawiodło tylko w niedziele


39

Zainspirowany Mieliśmy raz test jednostkowy, który nie powiódł się tylko w niedziele , napisz program lub funkcję, która nie robi nic poza rzuceniem błędu, gdy jest niedziela, i wyjdź z gracją każdego innego dnia.

Zasady:

  • Nie używaj danych wejściowych ani nie wyświetlaj danych wyjściowych zwykłymi metodami We / Wy, z wyjątkiem drukowania do STDERR lub odpowiednika twojego języka. Możesz drukować do STDOUT, jeśli jest to produkt uboczny twojego błędu.
  • Funkcja może zwracać wartość w niedziele, o ile nic nie drukuje
  • Twój program może używać niedzieli z dowolnej strefy czasowej lub lokalnej strefy czasowej, o ile jest ona spójna.
  • Błąd to coś, co powoduje nieprawidłowe zakończenie programu , na przykład błąd dzielenia przez zero lub użycie niezainicjowanej zmiennej. Oznacza to, że jeśli po części, która zawiera błąd, zostanie dodany kod, nie zostanie wykonany w niedzielę.
    • Można także użyć instrukcji, które ręcznie tworzą błąd, równoważny z pytaniami Pythona raise.
    • Obejmuje to błędy środowiska wykonawczego, błędy składniowe i błędy podczas kompilacji (powodzenia!)
  • W przypadku błędu musi być jakiś znak, który odróżnia go od braku błędu
  • To jest , więc wygrywa najkrótsza bajt w każdym języku!

Będę musiał czekać do niedzieli, aby sprawdzić odpowiedzi;)


2
Przez „napisanie programu lub funkcji, która nie robi nic poza rzuceniem błędu w niedzielę i wyjściem z gracją każdego innego dnia”, masz na myśli, że ilekroć jest uruchamiany w niedzielę, powinien zawieść, czy masz na myśli, że przynajmniej jedna możliwość, że zawiedzie niedziela. Czy to lepiej, jeśli nie powiedzie się tylko w niedzielę o godzinie 14:00, ale nie w niedzielę o godzinie 15:00, czy jest w porządku?
Bromind

5
Byłoby jeszcze lepiej, gdyby wykorzystano sobotę. Mógłbyś to nazwać „Saturday Night Error”, a nawet pracowałeś nad poprawionymi tekstami piosenek na pytanie.
Aaron


1
Z twojego pytania nie wynika jasno, co stanowi błąd. Głosuję za zamknięciem, dopóki nie zostanie to naprawione.
Wheat Wizard

3
Niezupełnie ... Jak odróżnić wyjście błędu od zwykłego wyniku. Czy coś jest jak print "error"błąd? Dodany akapit tak naprawdę niczego nie wyjaśnia.
Wheat Wizard

Odpowiedzi:



18

PHP 7, 12 bajtów

1%date("w");

W PHP 7 generuje wyjątek typu DivisionByZerow niedziele. To samo dzieje się, jeśli zostanie zinterpretowane przy użyciu HHVM .

W PHP 5 wyświetla ostrzeżenie (włączone stderr) w niedziele:

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

W żadnej wersji PHP nie wyświetla niczego w pozostałe dni tygodnia.

Uruchom używając CLI:

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

lub wypróbuj online!

Dwa kolejne bajty mogą być ściśnięte przez odpędzenie cytaty ( 1%date(w);), ale to wyzwala zawiadomienie (które mogą być tłumione przez prawidłowo ustawione error_reporting = E_ALL & ~E_NOTICEw php.ini).


Uważam, że musisz określić (w tytule), że ta odpowiedź jest tylko i tylko dla PHP7 + i HHVM, ponieważ PHP5.6 i niższe wyjście bez problemu. Ostrzeżenia nie są błędami i nie zatrzymują wykonywania kodu. Jeśli to zrobisz 1%date("w");echo "Alive!", zatrzyma się w PHP7 + i HHVM, ale nie we wszystkich innych wersjach od PHP 4.
Ismael Miguel

@ IsmaelMiguel pytanie klasyfikuje każde drukowanie jako błąd standardowy jako błąd, więc ostrzeżenie jest wystarczająco dobre w tym przypadku.
Proszę przestańcie być źli

1
Cytując pytanie: „Błąd to coś, co sprawia, że ​​program kończy się nienormalnie , na przykład dzielenie przez błąd zero lub użycie niezainicjowanej zmiennej. Oznacza to, że jeśli jakikolwiek kod zostanie dodany po części, która zawiera błędy, nie będzie stracony w niedzielę. ”. Nie dzieje się tak z ostrzeżeniem.
Ismael Miguel

@ IsmaelMiguel cytowany akapit został dodany do pytania niecałą godzinę temu.
axiac

1
Cytując starszą wersję, tę, która była włączona w momencie komentarza, który napisałem: „[...] napisz program lub funkcję, która robi tylko błąd, gdy jest niedziela, i z wdziękiem wyjdź każdego innego dnia . ” Ostrzeżenie jest skierowane przeciwko tej linii, ponieważ PHP zakończy działanie z wdziękiem. Błąd byłby błędem krytycznym lub błędem składni. Brak ostrzeżenia o dzieleniu przez 0. PHP 5.6 i starsze nie są odpowiednie dla tego wyzwania.
Ismael Miguel


8

Java 8, 69 43 34 bajty

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

-26 bajtów dzięki @ OlivierGrégoire .
-9 bajtów dzięki @Neil .

Wyjaśnienie:

Wypróbuj tutaj.

  • v->{...}( nieużywany Void nullparametr ) jest o jeden bajt krótszy niż ()->{...}(brak parametru).
  • new java.util.Date().getDay()zwróci 0-6 dla niedzieli-soboty, więc 1/...da java.lang.ArithmeticException: / by zerobłąd, jeśli wartość wynosi 0, co zdarza się tylko w niedziele.


@ OlivierGrégoire Ah, java.util.Date()ma metodę, aby uzyskać dzień tygodnia .. I jest nawet 0 w niedzielę .. Nie jestem pewien, jak mi tego brakowało. : S
Kevin Cruijssen

Tak, zwykle starsze klasy mają wszystkie funkcje w krótszych nazwach. ;-)
Olivier Grégoire

1
Czy dotyczy to 34 bajtów? Wypróbuj online!
Neil

@Neil nie było ważne w momencie, gdy publikowałeś, ale stało się ważne mniej niż godzinę później. ;-) To był mój pierwszy pomysł ...
Olivier Grégoire,

7

Python 3 , 33 bajty

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

Wypróbuj online!

Python 3 , 50 bajtów

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

Wypróbuj online!

Oszczędność ~ 3 bajtów dzięki Rod .


1
@Rod Dlaczego nie "Su"in time.ctime()>q(edytowałem z tym)?
Pan Xcoder,

Nie mogę tego pojąć. Jak to działa?
pacholik

@pacholik "Su"in time.ctime()sprawdza, czy bieżącym dniem jest niedziela. Jeśli to nieprawda, >qczęść nie jest w ogóle oceniana i wszystko kończy się płynnie. Ale jeśli to prawda, wówczas druga część nierówności jest oceniana, a ponieważ qnie jest zdefiniowana, rzuciłaby ona NameError.
Pan Xcoder,

1
@pacholik Edycja: Nie sądzę, że się mylę. Jeśli chodzi o wydajność, jeśli pierwsza część jest fałszywa, Python nawet nie zadaje sobie trudu, aby ocenić ostatnią część. Jednak będę musiał poczekać do niedzieli, aby to przetestować. ( Myślę ) Demonstracja .
Pan Xcoder,

3
@pacholik Zauważ, że łańcuchy Python operatory boolowskie, więc jest to równoważne z ("Su" in time.ctime()) and (time.ctime() > q).
user202729,

6

Pyth , 8 7 bajtów

 l-6.d9

Wypróbuj online!

Wyjaśnienie

    .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

To wciąż jest nieprawidłowe. Twoje dane wyjściowe ( 1.0nie są generowane przez błąd ). PO stwierdził wyraźnie, że nie pozwala na to. Możesz to naprawić, przygotowując jedną spację do swojego kodu
Mr. Xcoder

Ale nie możesz wysyłać danych wyjściowych do STDOUT, chyba że jest to niedziela, i robisz to w STDOUT.
Pan Xcoder,

@ Mr.Xcoder jest poprawny. W niedziele nic nie powinno być wysyłane
Jo King

@JoKing Całkowicie ominąłem tę zasadę, teraz naprawioną
Rod

6

Haskell + Data.Dates , 55 bajtów

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

Wypróbuj online!

Wykorzystuje to fakt, że niedziela jest ostatnim dniem tygodnia. dateWeekDayzwraca dzień tygodnia jako WeekDaytyp, który jest po prostu zdefiniowany jako

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

WeekDayjest przykładem Enum, więc możemy wykorzystać succi preduzyskać następcę lub poprzednika dnia tygodnia, np . succ Mondayzyski Tuesday.

Jednakże, Sundayjest to ostatni wpis enum, więc nazywając succ Sundaywyniki w następujący błąd:

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

Edycja 1: Dzięki nim za -3 bajty!
Edytuj 2: -11 bajtów teraz, gdy funkcje są dozwolone.


Pełny program: 88 81 74 69 66 bajtów

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

Wypróbuj online!

purejest potrzebny, aby podnieść wynikowy WeekDaypowrót do Monady IO. Jednak Haskell widzi, że wartość nie jest w żaden sposób wyprowadzana przez program, tak leniwe, że wyrażenie nie jest analizowane, więc nawet w niedziele program nie zawiedzie. Dlatego $!jest potrzebny, co wymusza ocenę, nawet jeśli Haskell normalnie nie oceniałby wyrażenia.


Poprzednie podejście z Data.Time: 127 124 bajtami

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

Wypróbuj online! To imponujący import. Zmień d<7np. d/=5Na test awarii w piątek. Nie z następującym wyjątkiem: Non-exhaustive patterns in function c.


1
main=pure$!succ.dateWeekDay<$>getCurrentDateTime. A ponieważ funkcje są dozwolone, możesz upuścić main=.
nimi

@nimi Dzięki! Nie jestem jednak pewien tej funkcji z powodu No using input or showing output through the usual IO methodsreguły. O ile widzę, użycie funkcji dałoby wynik w niedziele, nawet jeśli jest zawinięty w akcję IO.
Laikoni

Może masz rację, ale z drugiej strony pełny program ma kod wyjścia, który jest również standardową metodą.
nimi

... reguły wyzwalania pozwalają teraz funkcjom zwracać wartości w niedziele, o ile nie są drukowane.
nimi

@nimi Dziękuję za powiadomienie.
Laikoni

5

05AB1E , 45 44 bajtów

Ponieważ 05AB1E nie ma wbudowanej funkcji określania dnia tygodnia, skorzystałem z reguły Zellera, aby ją obliczyć.

Drukuje nową linię do stderr w przypadku niedzieli (obserwowalne w widoku debugowania na TIO)

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

Wypróbuj online!

Wyjaśnienie

O wzorze ogólnym stosuje się
DoW = d + [(13*(m+1))/5] + y + [y/4] + [c/4] - 2*c
przypadku DoW=day of week, d=day, m=month, y=last 2 digits of year, c=centuryi i wyrażenie w nawiasach ( []) jest zaokrąglone w dół.

Każdy miesiąc użyty w formule odpowiada liczbie, przy czym Jan=13,Feb=14,Mar=3,...,Dec=12
Ponieważ mamy bieżący miesiąc w bardziej popularnym formacie Jan=1,...,Dec=12 , konwertujemy miesiąc za pomocą formuły
m = (m0 + 11) % 14 + 1

Ponieważ dwuprodukt z marca jest pierwszym miesiącem, styczeń i luty należą do roku poprzedniego, więc obliczenia do ustalenia ystają się
y = (year - (m0 < 3)) % 100

Ostateczną wartością, DoWktórą otrzymujemy, jest int gdzie 0=Sat,1=Sun,...,6=Fri.
Teraz możemy jawnie zgłosić błąd, jeśli wynik jest prawdziwy.


11
05AB1E przegrywa z Javą? Wszystko, co wiem, to kłamstwo
Kamil Drakari

5

JavaScript, 23 bajty

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

Pełny program

Zmienna knie może być zdefiniowana.

JavaScript, 20 bajtów autorstwa Ricka Hitchcocka

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

JavaScript, 19 bajtów wg apsillerów

Date().match`Su`&&k

1) Zapomniałeś dołączyć _=>; bez niego jest to fragment, który domyślnie nie jest dozwolony. 2) Dane falsewyjściowe są wysyłane co drugi dzień, kiedy nic nie powinno być wysyłane.
Kudłaty

6
1) Jest to pełny program, na który zezwala PO. 2) Jeśli uruchomisz go jako program, nie ma wyjścia
l4m2

3
/Su/.test(Date())&&kna 20 bajtów.
Rick Hitchcock,

1
new Datewersja 25 bajtów(new Date/864e5%7|0)-3||p
l4m2

3
Zamiast tego rozwiązanie @RickHitchcock można skrócić, wykonując matchzamiast tego szablon-tag :Date().match`Su`&&k
apsillers

5

VBA / VBScript, 22 20 bajtów

Zaoszczędź 2 bajty dzięki Taylor Scott.

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

Powinno to zostać uruchomione w oknie natychmiastowym. Weekday()zwraca od 1 (niedziela) do 7 (sobota), więc w niedzielę powstaje błąd dzielenia przez zero. W przeciwnym razie brak danych wyjściowych.

Error Message


Pobiłeś mnie do odpowiedzi o godzinę - 19 bajtów:?1/(Weekday(Now)-1)
Taylor Scott

1
@TaylorScott Zapomniałem, że Nowjest poprawny bez ()VBA, ale nie mogę użyć print, ponieważ uważam, że wszystkie dane wyjściowe są niedozwolone, chyba że wystąpią błędy. No using input or showing output through the usual IO methods, except to print to STDERR. Mimo to zapisano 2 bajty.
Inżynier Toast

1
Właśnie napisałem dokładnie 20 bajtów jako rozwiązanie VBScript, a potem pomyślałem, że sprawdzę, czy już został przesłany istniejący język w stylu VB i oto on. To działa dla VBScript i prawdopodobnie także dla innych języków w stylu VB.

@EngineerToast Myślę, że powinieneś oznaczyć to jako poliglota z VBScript
Taylor Scott

@TaylorScott Nie robiłem tego wcześniej. Czy zrobiłem to dobrze?
Inżynier Toast

4

Rubin, 15 bajtów

1/Time.now.wday

wdayzwróci 0 w niedzielę powodując błąd ZeroDivisionError: podzielony przez błąd 0. Na przykład: 1/Time.new(2018,1,7).wday.



3

jq, 42 znaki

(39 znaków kod + 3 znaki opcja wiersza poleceń)

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

Próbuję tutaj innego podejścia: parsuj numer dnia tygodnia (0..6) jako numer dnia miesiąca (1..31).

Przykładowy przebieg:

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"

Pamiętaj, że jq obsługuje tylko daty UTC.

Wypróbuj online!



3

VBA 18 bajtów

Zależy to od wbudowanej funkcji date()zwracającej liczbę dni, która jest równa 1, jeśli jest podzielona przez 7, więc może być specyficzna dla systemu operacyjnego i / lub procesora.

a=1/(date mod 7-1)

Działa w oknie Natychmiastowe projektu VBA.


2
Witamy w PPCG! Ogólnie rzecz biorąc, mile widziane jest wyjaśnienie i link do kompilatora / tłumacza online.
FantaC

@tfbninja - ok aktualizacja
JohnRC

oraz, jeśli to konieczne, instrukcje użytkowania, np. wywołanie funkcji lub zmienna
FantaC

Miłego grania, właśnie miałem to opublikować po zobaczeniu innej odpowiedzi!
Greedo,

3

R , 31 bajtów 30 bajtów

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

Wypróbuj online!

Brak wyników w niedziele, Error: object 'a' not foundw niedziele.

format(Sys.Date(),'%u')był najkrótszym sposobem, w jaki udało mi się uzyskać dzień powszedni, wyświetla liczbę klas postaci na dzień tygodnia, z liczbą 7 na niedziele. Możemy porównać do liczby 7 i jeśli prawdziwa próba użycia niezdefiniowanego obiektu.

Oszczędność bajtu dzięki Giuseppe!


>6jest bajt krótszy.
Giuseppe,

2

Ocaml, 46 bajtów

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

i w ocaml REPL, możemy osiągnąć lepiej, usuwając leti końcowy :():

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

czyli 41 bajtów (w tym 1 bajt na powrót karetki).


1
Witamy w PPCG!
Laikoni

1
Czy to możliwe, aby ten kod działał na Wypróbuj online ?
Laikoni

Hmm ... polecenie kompilacji to ocamlopt unix.cmxa <plik>, nie wiem jak dać opcję kompilacji na tio.
Zbadam

Tio używa (podobnego) interpretera REPL, więc powinieneś skorzystać z drugiej możliwości. Wydaje się jednak, że nie ma biblioteki uniksowej (lub z jakiegokolwiek powodu nie zezwala na dostęp do niej)
Bromind


2

TI-Basic 84+, 23 bajty

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

Wymaga poleceń daty i godziny, które są w wersji 84+ i wyższej.


2

MATL , 12 bajtów

vZ'8XOs309>)

Błąd występujący w niedziele to:

  • Uruchamianie na Octave:

    MATL run-time error: The following Octave error refers to statement number 9:  )
    ---
    array(1): out of bound 0
    
  • Uruchamianie na Matlabie:

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

Aby odwrócić zachowanie (błąd w dowolnym dniu oprócz niedziel), dodaj ~po >.

Wypróbuj online!

Wyjaśnienie

Wykorzystuje to fakt, że

  • indeksowanie do pustej tablicy z indeksem logicznym falsejest poprawne (a wynikiem jest pusta tablica, która nie generuje danych wyjściowych); natomiast

  • indeksowanie za pomocą truepowoduje błąd, ponieważ w tablicy brakuje pierwszego wpisu.

Skomentowany kod:

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 bajtów

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

.zd zwraca bieżącą datę. mod robi modulo bieżącej daty, która zwraca wartość int. Jeśli data jest niedziela, .zd mod 7 zwraca 1. Jeśli 1 = 1, (w niedzielę), a błąd jest zgłaszany za pomocą operatora „Dla zwięzłości błąd jest tylko znakiem e.


3
Witamy w PPCG!
Martin Ender

2

C # (.NET Core) , 55 54 48 bajtów

Wypróbuj online!

Zaoszczędził 1 bajt dzięki Kudłatemu

Zaoszczędź 5 bajtów dzięki Emignie

Zaoszczędził 1 bajt dzięki Kevinowi Cruijssenowi

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

Na szczęście niedziela jest indeksowana w enum 0, bo inaczej by tak było (System.DayOfWeek)7



3
Czy dostaniesz using Systemza darmo w C #? Jeśli tak, myślę, że możesz zrobić ()=>{var k=1/(int)DateTime.Now.DayOfWeek;}za 42 . W przeciwnym razie 49 z wyraźnymSystem.
Emigna

3
@Emigna mnie pobiła; ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}jest krótszy. I możesz zaoszczędzić jeszcze jeden bajt, używając pustego nieużywanego parametru zamiast żadnego parametru (tj. v->{...}Zamiast ()->{...})
Kevin Cruijssen

1
40 bajtów: ()=>1/(int)System.DateTime.Now.DayOfWeek. Wypróbuj tutaj .
Ayb4btu


2

C,  68  55 bajtów

Dzięki @Ken YN za oszczędność 13 bajtów!

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

Wypróbuj online!


Upuść półprodukt, daby uzyskać n/=gmtime(&n)->tm_wday;54 bajty (ale nie jestem pewien, czy podoba mi się te wszystkie ostrzeżenia kompilatora ...)
Ken YN

@ KenY-N Thanks!
Steadybox

1

R , 40 bajtów

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

Wypróbuj online!

weekdayszwraca dzień tygodnia daty, z opcjonalnym argumentem abbreviate, który skraca Sundaysię Sun, oszczędzając jeden bajt.

stopifnotzgłasza błąd, jeśli dla każdego argumentu nie allma TRUE, i zgłasza błąd z komunikatem wskazującym, że pierwszy element nie jest TRUE, więc błąd jestError: "Sun" is not TRUE


Sprowadziłem to do 31 z nieco innym podejściem
Gregor


1

Gema , 40 znaków

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

Musiałem podać komunikat o błędzie, więc wybierz krótki: „S”.

Przykładowy przebieg:

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

Funky , 21 bajtów

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

os.date"%w"zwraca bieżący dzień tygodnia w formacie 0–6, gdzie 0 oznacza niedzielę. Zrozumienie tego nie jest prawdą tylko wtedy, gdy dniem tygodnia jest 0, czyli niedziela. Wtedy tylko podstawowa if(a){error()}zapewni, że ten program będzie zawierał błędy tylko w niedzielę

Wypróbuj online!



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.