일요일에만 실패한 질문이있었습니다


39

우리는 한 번만 일요일에 실패한 단위 테스트를 받았으며 , 일요일 에 오류가 발생하고 다른 날에는 정상적으로 종료되는 프로그램이나 함수를 작성했습니다.

규칙 :

  • STDERR 또는 해당 언어로 인쇄하는 것을 제외하고 일반적인 IO 방법을 통해 입력을 사용하거나 출력을 표시하지 않습니다 . 오류의 부산물 인 경우 STDOUT으로 인쇄 할 수 있습니다.
  • 어떤 것도 인쇄하지 않는 한 함수는 일요일이 아닌 날에 값을 반환 할 수 있습니다
  • 프로그램은 일관된 한 모든 시간대 또는 현지 시간대의 일요일을 사용할 수 있습니다.
  • 오류는 0으로 나누기 오류 또는 초기화되지 않은 변수 사용과 같이 프로그램 이 비정상적으로 종료 되는 것입니다 . 즉, 오류가 발생한 부분 이후에 코드를 추가하면 일요일에 실행되지 않습니다.
    • Python 's와 동등한 오류를 수동으로 생성하는 명령문을 사용할 수도 있습니다 raise.
    • 여기에는 런타임 오류, 구문 오류 및 컴파일 중 발생하는 오류가 포함됩니다 (행운을 빕니다!).
  • 오류가있을 경우 오류가없는 것과 구별되는 부호가 있어야합니다
  • 이것은 이므로 각 언어에서 가장 짧은 바이트 수가 이깁니다!

대답을 확인하기 위해 일요일까지 기다려야합니다.)


2
"일요일에는 오류를 발생시키고 다른 요일에는 정상적으로 종료하는 프로그램이나 함수를 작성하십시오"라는 말은 일요일에 실행될 때마다 실패해야한다는 의미입니까, 아니면 최소한 있어야한다는 의미입니까? 하나의 가능성은 일요일에 실패합니다. 더 명확하게하기 위해 일요일 오후 2시에 실패하지만 오후 3시에 실패하지 않으면 괜찮습니까?
Bromind

5
토요일이 사용 되었다면 훨씬 더 나았을 것입니다. 당신은 그것을 "토요일 밤 오류"라고 불렀을 수도 있고 질문에 대한 조정 된 노래 가사에서 일하기까지했습니다.
Aaron

3
일요일? 자정과 오전 1시 사이실패하는 것은 어떻습니까?
Draco18s

1
무엇이 오류인지 구성하는 질문에서 명확하지 않습니다. 이 문제가 해결 될 때까지 닫으려고합니다.
밀 마법사

3
실제로는 아닙니다 ... 오류 출력을 일반 출력과 어떻게 구별 할 수 있습니까? 같은 것입니다 print "error"오류? 추가 된 단락은 실제로 아무것도 명확하게하지 않습니다.
밀 마법사

답변:



18

PHP 7, 12 바이트

1%date("w");

PHP 7에서는 DivisionByZero일요일 에 유형 예외가 발생 합니다. HHVM을 사용하여 해석되는 경우에도 마찬가지 입니다.

PHP 5에서는 stderr일요일 에 경고가 표시됩니다 (on ).

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

어떤 PHP 버전에서도 다른 요일에는 아무것도 표시되지 않습니다.

CLI를 사용하여 실행하십시오.

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

또는 온라인으로 사용해보십시오!

따옴표 ( 1%date(w);) 를 제거하여 2 바이트를 더 압축 할 수 있지만이 경우 알림이 트리거됩니다 (에 올바르게 설정 error_reporting = E_ALL & ~E_NOTICE하여 억제 할 수 있음 php.ini).


PHP5.6 이하에서 문제없이 종료 되므로이 답변은 PHP7 + 및 HHVM에만 해당한다고 제목으로 지정 해야 한다고 생각합니다 . 경고는 오류가 아니며 코드 실행을 중지하지 않습니다. 그렇게하면 1%date("w");echo "Alive!"PHP7 + 및 HHVM에서 중지되지만 PHP 4 이후의 다른 모든 버전에서는 해당되지 않습니다.
Ismael Miguel

@IsmaelMiguel 질문은 표준 오류에 대한 인쇄를 오류로 분류 하므로이 경우 경고가 충분합니다.
악의를 그만두십시오

1
"오류는 0으로 나누기 오류 또는 초기화되지 않은 변수 사용과 같이 프로그램 이 비정상적으로 종료 되는 것입니다. 이는 오류가 발생한 부분 뒤에 코드를 추가하면 오류가 발생하지 않음을 의미합니다. 일요일에 실행. ". 경고와 함께 발생하지 않습니다.
Ismael Miguel

@IsmaelMiguel 인용 한 단락이 1 시간 전에 질문에 추가되었습니다.
axiac

1
"[...] 일요일에 오류가 발생하고 다른 날에는 정상적으로 종료되는 프로그램이나 함수를 작성하고 다른 날에는 정상적으로 종료합니다. ". PHP가 정상적으로 종료되므로 경고는이 행에 위배됩니다. 오류는 치명적 오류 또는 구문 오류입니다. 0으로 나누는 경고는 없습니다. PHP 5.6 이상은이 문제에 유효하지 않습니다.
Ismael Miguel


8

자바 8, 69 43 34 바이트

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

@ OlivierGrégoire 덕분에 -26 바이트 . @Neil
덕분에 -9 바이트 .

설명:

여기에서 시도하십시오.

  • v->{...}( 미사용 Void null파라미터 )는 ()->{...}(파라미터 없음) 보다 1 바이트 짧습니다 .
  • new java.util.Date().getDay()일요일-토요일에는 0-6을 반환하므로 값이 0이면 일요일에만 발생 1/...하는 java.lang.ArithmeticException: / by zero오류가 발생합니다.


@ OlivierGrégoire Ah, java.util.Date()요일을 얻는 방법이 있습니다. 그리고 일요일에는 0도 있습니다. : S
Kevin Cruijssen

예, 일반적으로 오래된 클래스는 모든 기능을 짧은 이름으로 가지고 있습니다. ;-)
Olivier Grégoire

1
이것은 34 바이트에 유효합니까? 온라인으로 사용해보십시오!
Neil

@Neil 게시 당시에는 유효하지 않지만 1 시간 이내에 유효하게되었습니다. ;-) 그것은 나의 첫번째 생각이었다. ..
Olivier Grégoire

7

파이썬 3 , 33 바이트

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

온라인으로 사용해보십시오!

파이썬 3 , 50 바이트

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

온라인으로 사용해보십시오!

Rod 덕분에 ~ 3 바이트가 절약되었습니다 .


1
@로드 왜 안되나요 "Su"in time.ctime()>q(이것으로 편집하고 있었습니까)?
Mr. Xcoder

나는 그것을 이해할 수 없다. 어떻게 작동합니까?
pacholik

@pacholik "Su"in time.ctime()은 오늘 날짜가 일요일 인지 확인합니다. 이것이 거짓이면 >q부품이 전혀 평가되지 않고 모든 것이 부드럽게 종료됩니다. 그러나 그것이 사실이라면, 불평등의 두 번째 부분이 평가되고, q정의되지 않았으므로 이것은를 던질 것 NameError입니다.
Mr. Xcoder

1
@pacholik 편집 : 나는 내가 틀렸다고 생각하지 않습니다. 효율성을 위해 첫 번째 부분이 거짓이면 Python은 마지막 부분을 평가하지 않아도됩니다. 그래도 일요일까지 기다려야 테스트 할 수 있습니다. ( 제 생각에는 ) 데모 .
Mr. Xcoder

3
@pacholik 파이썬은 boolean 연산자를 연결하므로 ("Su" in time.ctime()) and (time.ctime() > q).
user202729

6

Pyth , 8 7 바이트

 l-6.d9

온라인으로 사용해보십시오!

설명

    .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

이것은 여전히 ​​유효하지 않습니다. 출력 은 오류에 의해1.0 생성되지 않습니다 . OP는 명시 적으로 허용하지 않는다고 말했다. 당신은하지만, 코드에 하나의 공간을 앞에 추가하여 해당 문제를 해결할 수
씨 Xcoder

그러나 일요일이 아닌 한 STDOUT으로 출력 할 수 없으며 STDOUT으로 출력 할 수 있습니다.
Mr. Xcoder

@ Mr.Xcoder가 정확합니다. 일요일이 아닌 날에는 아무것도 출력되지 않아야합니다.
Jo King

@ JoKing 나는이 규칙을 완전히 건너 뛰었습니다. 지금 수정되었습니다.
Rod

6

Haskell + Data.Dates , 55 바이트

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

온라인으로 사용해보십시오!

이것은 일요일이 요일의 마지막 날이라는 사실을 사용합니다. dateWeekDay요일을 WeekDay유형 으로 반환합니다.

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

WeekDay의 예입니다 Enum. 따라서 요일의 후속 작업 또는 선행 작업 (예 : 수확량)을 사용 succ하고 pred가져 오는 데 사용할 수 있습니다 .succ MondayTuesday

그러나 Sunday마지막 열거 형 항목이므로 호출 succ Sunday하면 다음 오류가 발생합니다.

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

편집 1 : -3 바이트를위한 nimi 덕분에!
편집 2 : -11 바이트는 이제 기능이 허용됩니다.


정식 프로그램 : 88 81 74 69 66 bytes

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

온라인으로 사용해보십시오!

pure결과 WeekDay를 IO Monad 로 다시 들어 올리려면 필요합니다 . 그러나 Haskell은 값이 프로그램에 의해 어떤 식 으로든 출력되지 않는다는 것을 알고 있습니다. 너무 느리고 표현식이 평가되지 않으므로 일요일에도 프로그램이 실패하지 않습니다. 이것이 $!하스켈이 일반적으로 표현식을 평가하지 않더라도 평가를 강제하는 이유 입니다.


이전 접근 방식 Data.Time: 127124 바이트

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

온라인으로 사용해보십시오! 이것들은 인상적인 수입품입니다. 금요일에 실패 테스트 d<7를 위해 예를 들어 변경하십시오 d/=5. 다음 예외로 실패합니다 : Non-exhaustive patterns in function c.


1
main=pure$!succ.dateWeekDay<$>getCurrentDateTime. 함수가 허용되면을 (를) 삭제할 수 있습니다 main=.
nimi

@nimi 감사합니다! No using input or showing output through the usual IO methods규칙 때문에 함수에 대해 잘 모르겠습니다 . 내가 아는 한, 함수를 사용하면 IO 액션으로 싸여 있지만 일요일 이외의 결과가 나옵니다.
Laikoni

어쩌면 당신이 옳을 수도 있지만 전체 프로그램에는 종료 코드가 있으며 이는 표준 방법이기도합니다.
nimi

... 챌린지 규칙을 사용하면 함수가 인쇄하지 않는 한 일요일이 아닌 시간에 값을 반환 할 수 있습니다.
nimi

@nimi 통지 해 주셔서 감사합니다.
Laikoni

5

05AB1E , 45 44 바이트

05AB1E에는 요일을 가져 오기위한 내장 기능이 없으므로 Zeller 's Rule을 사용하여 계산했습니다.

일요일 인 경우 stderr에 줄 바꿈을 인쇄합니다 (TIO의 디버그보기에서 볼 수 있음).

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

온라인으로 사용해보십시오!

설명

사용 된 화학식은
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=century괄호 및 표현은 ( []) 라운드 다운된다.

수식에 사용 된 각 월은 숫자에 해당합니다. 여기서 Jan=13,Feb=14,Mar=3,...,Dec=12
가장 일반적인 형식으로 현재 월이 Jan=1,...,Dec=12 있으므로 수식을 사용하여 월을 변환합니다.
m = (m0 + 11) % 14 + 1

월의 biproduct은 첫 달로서, 1월2월 전년에 속한다는 결정하기위한 계산은 그래서 y된다
y = (year - (m0 < 3)) % 100

DoW우리가 얻는 최종 가치 는 int where 0=Sat,1=Sun,...,6=Fri입니다.
결과가 참이면 오류를 명시 적으로 던질 수 있습니다.


11
05AB1E Java를 잃고 있습니까? 내가 아는 것은 거짓말이다
Kamil Drakari

5

자바 스크립트, 23 바이트

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

전체 프로그램.

변수 k를 정의하지 않아야합니다.

자바 스크립트, Rick Hitchcock의 20 바이트

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

자바 스크립트, apsillers의 19 바이트

Date().match`Su`&&k

1) 포함하는 것을 잊었습니다 _=>. 그것 없이는 기본적으로 허용되지 않는 스 니펫입니다. 2) 이것은 false아무것도 출력하지 않아야 할 때마다 격일로 출력 됩니다.
얽히고 설킨

6
1) 전체 프로그램이며 OP에서 허용합니다. 2) 프로그램으로 실행하면 출력이 없습니다
l4m2

3
/Su/.test(Date())&&k20 바이트
Rick Hitchcock

1
new Date버전 25 바이트(new Date/864e5%7|0)-3||p
l4m2

3
@RickHitchcock의 솔루션은 match대신 템플릿 태그를 실행하여 짧게 만들 수 있습니다 .Date().match`Su`&&k
apsillers

5

VBA / VBScript, 22 20 바이트

Taylor Scott 덕분에 2 바이트를 절약했습니다.

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

직접 실행 창에서 실행해야합니다. Weekday()1 (일요일)부터 7 (토요일)까지 반환하므로 일요일에 0으로 나누기 오류가 발생합니다. 그렇지 않으면 출력이 없습니다.

에러 메시지


당신은 한 시간-19 바이트 대답으로 나를 이길?1/(Weekday(Now)-1)
테일러 스콧

1
@TaylorScott VBA에서 Now유효하지 않은 것을 잊어 버렸지 ()만 오류가 없으면 모든 출력이 허용되지 않는다고 생각하기 때문에 인쇄를 사용할 수 없습니다. No using input or showing output through the usual IO methods, except to print to STDERR. 여전히 2 바이트를 절약했습니다.
엔지니어 토스트

1
방금 VBScript 솔루션 으로이 정확한 20 바이트를 작성한 다음 기존 VB 스타일 언어가 이미 제출되어 있는지 확인하고 싶습니다. 따라서 이것은 VBScript 및 다른 VB 스타일 언어에서도 작동합니다.

@EngineerToast VBScript를 사용하여 이것을 폴리 글롯으로 표시해야한다고 생각합니다.
Taylor Scott

@TaylorScott 나는 전에 그렇게하지 않았습니다. 내가 제대로 했어?
엔지니어 토스트

4

루비, 15 바이트

1/Time.now.wday

wday일요일에 0을 반환하여 ZeroDivisionError : 0으로 나눈 오류를 발생시킵니다. 예를 들면 다음과 같습니다 1/Time.new(2018,1,7).wday..



3

jq, 42 자

(39 자 코드 + 3 자 명령 행 옵션)

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

다른 접근법을 시도해보십시오 : 요일 번호 (0..6)를 월 요일 번호 (1..31)로 구문 분석하십시오.

샘플 실행 :

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"

jq는 UTC 날짜 만 처리합니다.

온라인으로 사용해보십시오!



3

VBA 18 바이트

이것은 date()7로 나눈 경우 나머지 1을 반환하는 내장 함수에 의존 하므로 OS 및 / 또는 CPU에 따라 다를 수 있습니다.

a=1/(date mod 7-1)

VBA 프로젝트 즉시 실행 창에서 실행됩니다.


2
PPCG에 오신 것을 환영합니다! 일반적으로, 온라인 컴파일러 / 통역사에 대한 설명과 링크가 인정됩니다.
FantaC

@tfbninja-업데이트 확인
JohnRC

필요한 경우 함수 호출 또는 변수와 같은 사용법에 대한 지침
FantaC

멋진 골프, 다른 답변을 본 후 나 자신을 게시하려고했습니다!
Greedo

3

R , 31 바이트 30 바이트

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

온라인으로 사용해보십시오!

일요일이 아닌 일요일에는 출력되지 않습니다 Error: object 'a' not found.

format(Sys.Date(),'%u')요일을 얻는 가장 짧은 방법이었고 요일에는 문자 클래스 번호를 출력하고 일요일에는 7을 출력합니다. 우리는 숫자 7과 비교할 수 있으며, 참이면 정의되지 않은 객체를 사용하려고 시도합니다.

주세페 덕분에 바이트를 절약했습니다!


>6바이트가 짧습니다.
Giuseppe

2

Ocaml, 46 바이트

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

그리고 OCaml의 REPL에서, 우리는 제거하여 더 잘 달성 할 수있는 let최종를 :():

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

이는 41 바이트입니다 (캐리지 리턴에 1 바이트를 가정 함).


1
PPCG에 오신 것을 환영합니다!
Laikoni

1
이 코드를 온라인 에서 사용해 볼 수 있습니까?
Laikoni

Mmh ... 컴파일 명령은 ocamlopt unix.cmxa <file>입니다 .tio에서 컴파일 옵션을 제공하는 방법을 모르겠습니다. 오늘 저녁에 조사하겠습니다
Bromind

tio는 (simili) REPL 인터프리터를 사용하므로 두 번째 가능성을 사용해야합니다. 그러나 유닉스 라이브러리가없는 것 같습니다 (또는 어떤 이유로 든 액세스를 허용하지 않습니다)
Bromind


2

TI 기본 84+, 23 바이트

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

84+ 이상의 날짜 및 시간 명령이 필요합니다.


2

MATL , 12 바이트

vZ'8XOs309>)

일요일에 발생한 오류는 다음과 같습니다.

  • 옥타브에서 실행 :

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

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

동작을 반전 시키려면 (일요일을 제외한 모든 날의 오류) ~after를 추가하십시오 >.

온라인으로 사용해보십시오!

설명

이것은 사실을 이용합니다

  • 논리 인덱스를 사용하여 빈 배열로 인덱싱하는 false것이 유효합니다 (결과는 빈 배열이므로 출력이 생성되지 않음). 그런데, ...한데

  • true배열에 첫 번째 항목이 없기 때문에 인덱싱 하면 오류 가 발생합니다.

주석이 달린 코드 :

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 바이트

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

.zd는 현재 날짜를 반환합니다. mod는 현재 날짜의 모듈로를 수행하며 int를 반환합니다. 날짜가 일요일이면 .zd mod 7은 1을 반환합니다. 1 = 1이면 (일요일) '연산자를 사용하여 오류가 발생합니다. 간결하게하기 위해 오류는 e 문자입니다.


3
PPCG에 오신 것을 환영합니다!
Martin Ender

2

C # (. NET 코어) , 55 54 48 바이트

온라인으로 사용해보십시오!

Shaggy 덕분에 1 바이트 절약

Emigna 덕분에 5 바이트 절약

Kevin Cruijssen 덕분에 1 바이트 절약

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

일요일이 열거 형에서 0으로 색인되어 있거나 그렇지 않으면 (System.DayOfWeek)7



3
당신은받을 수 있나요 using SystemC #에서 무료로? 그렇다면 당신이 할 수있는 생각 ()=>{var k=1/(int)DateTime.Now.DayOfWeek;}에 대해 (42) . 그렇지 않으면 명시 적으로 49System.
Emigna

3
@Emigna가 나를 이겼습니다. ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}더 짧습니다. 그리고 매개 변수없이 빈 사용되지 않은 매개 변수를 사용하여 하나 이상의 바이트를 절약 할 수 있습니다 (예 : v->{...}대신 ()->{...})
Kevin Cruijssen

1
40 바이트 : ()=>1/(int)System.DateTime.Now.DayOfWeek. 여기서 사용해보십시오 .
Ayb4btu


2

C,  68  55 바이트

13 바이트를 절약 한 @Ken YN에게 감사합니다!

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

온라인으로 사용해보십시오!


54 바이트 d를 얻기 n/=gmtime(&n)->tm_wday;위해 중간체 를 삭제하십시오 (그러나 모든 컴파일러 경고가 마음에 들지 않습니다 ...)
Ken YN

@ KenY-N 감사합니다!
Steadybox

1

R , 40 바이트

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

온라인으로 사용해보십시오!

weekdays선택적 인수로 날짜의 요일을 반환 abbreviate, 짧아 SundaySun단일 바이트를 저장.

stopifnot각 인수에 대해 not all이 아닌 TRUE경우 오류가 발생하고 첫 번째 요소가 아닌 요소를 나타내는 메시지와 함께 TRUE오류가 발생하므로 오류는Error: "Sun" is not TRUE




1

Gema , 40 자

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

오류 메시지를 지정해야하므로 짧은 메시지 "S"를 선택하십시오.

샘플 실행 :

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

펑키 , 21 바이트

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

os.date"%w"현재 요일을 0-6 형식으로 반환합니다. 여기서 0은 일요일입니다. 논리가 아닌 것은 요일이 0 일 때만 일요일이므로 일요일입니다. 그런 다음 기본적 if(a){error()}으로이 프로그램은 일요일에만 오류가 발생합니다.

온라인으로 사용해보십시오!



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.