日曜日にのみ失敗した質問がありました


39

インスピレーションを受けた日曜日に1回だけ失敗した単体テストがあり、日曜日にエラーをスローするだけのプログラムまたは関数を作成し、他の日に正常に終了しました。

ルール:

  • 入力を使用したり、通常のIOメソッドを使用して出力を表示したりすることは、STDERRまたは同等の言語に出力する場合を除きます。エラーの副産物である場合は、STDOUTに出力できます。
  • 関数は、何も出力しない限り、非日曜日に値を返す場合があります
  • プログラムは、一貫している限り、任意のタイムゾーンまたはローカルタイムゾーンの日曜日を使用できます。
  • エラーは、ゼロ除算エラーや初期化されていない変数の使用など、プログラムを異常終了させるものです。これは、エラーが発生した部分の後にコードが追加された場合、日曜日に実行されないことを意味します。
    • Pythonに相当するエラーを手動で作成するステートメントを使用することもできますraise
    • これには、実行時エラー、構文エラー、コンパイル中のエラーが含まれます(幸運を祈ります!)
  • エラーには、エラーがないことを区別する記号が必要です。
  • これはなので、各言語で最も短いバイト数が勝ちです!

私は答えを確認するために日曜日まで待つ必要があります;)


2
「日曜日にエラーをスローするだけで他の日には正常に終了するプログラムまたは関数を作成する」とは、日曜日に実行するたびに失敗することを意味しますか、それとも少なくとも日曜日に失敗する可能性があります。より明確にするために、日曜日の午後2時にのみ失敗し、日曜日の午後3時に失敗した場合、それは問題ありませんか?
-Bromind

5
土曜日が使用されていれば、これはさらに改善されていただろう。あなたはそれを「土曜日の夜のエラー」と呼び、質問に対するいくつかの調整された歌の歌詞でさえ働いたかもしれません。
アーロン


1
あなたの質問から何がエラーを構成しているかは明らかではありません。これが修正されるまで、私は閉会を表明します。
小麦ウィザード

3
そうではない...エラーの出力と通常の出力をどのように区別できるか。print "error"エラーのようなものですか?追加された段落は、実際には何も明確にしません。
小麦ウィザード

回答:



18

PHP 7、12バイト

1%date("w");

PHP 7ではDivisionByZero、日曜日に型の例外をスローします。HHVMを使用して解釈した場合も同じことが起こります。

PHP 5では、stderr日曜日に警告(オン)が表示されます。

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!"、それはなく、PHP 4以降のすべての他のバージョンでは、PHP7 +とHHVMに停止します
イスマエルミゲル

@IsmaelMiguel質問は、標準エラーへの印刷をエラーとして分類するため、この場合は警告で十分です。
悪であるのをやめてください

1
質問の引用:「エラーとは、ゼロ除算エラーや初期化されていない変数を使用するなど、プログラムを異常終了させるものです。これは、エラーのある部分の後にコードが追加されても、日曜日に実行されます。」これは警告では発生しません。
イスマエルミゲル

@IsmaelMiguel引用している段落は、1時間以内に質問に追加されました。
axiac

1
私が書いたコメントの時点であった古いバージョンを引用します:「[...]日曜日になるとエラーをスローするだけのプログラムまたは関数を記述し、他の日には正常に終了します。 。 "。PHPは正常に終了するため、警告はこの行に対して行われます。エラーは、致命的なエラーまたは構文エラーになります。0で除算するための警告ではありません。PHP5.6以前は、このチャレンジに対して有効ではありません。
イスマエルミゲル


8

Java 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を返しますので、1/...与えるjava.lang.ArithmeticException: / by zeroだけ日曜日に起きた、値が0の場合はエラーを。


@OlivierGrégoireああ、java.util.Date()曜日を取得する方法があります。日曜日は0でもあります。:S
ケビンクルーイッセン

はい、通常、古いクラスにはすべての機能が短い名前であります。;-)
オリビエグレゴワール

1
これは34バイトで有効ですか?オンラインでお試しください!
ニール

@Neilは、投稿した時点では有効ではありませんでしたが、1時間以内に有効になりました。;-)それは...にもかかわらず、私の最初のアイデアだった
オリヴィエ・グレゴワール

7

Python 3、33バイト

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

オンラインでお試しください!

Python 3、50バイト

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

オンラインでお試しください!

Rodのおかげで約3バイト節約できました。


1
@Rodなぜそうではないのですか"Su"in time.ctime()>q(私はこれで編集していました)?
Mr Xcoder

よくわかりません。どのように機能しますか?
パチョリク

@pacholik "Su"in time.ctime()は、当日が日曜日かどうかを確認します。これがfalseの場合、>qパーツはまったく評価されず、すべてがスムーズに終了します。しかし、それが当てはまる場合、不等式の2番目の部分が評価され、q定義されていないため、これはをスローしNameErrorます。
氏Xcoder

1
@pacholik編集:私は間違っているとは思わない。効率化のために、最初の部分が偽物である場合、Pythonは最後の部分を評価することすらしません。ただし、これをテストするには日曜日まで待つ必要があります。(思うデモンストレーション
氏Xcoder

3
@pacholik Pythonはブール演算子を連結しているため、これはと同等("Su" in time.ctime()) and (time.ctime() > q)です。
user202729

6

Pyth8 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に出力します。
Xcoder氏18年

@ Mr.Xcoderは正しいです。日曜日以外では何も出力されません
ジョーキング

@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あるため、を使用succpredて、平日の後続または先行を取得できます(例:succ Mondayyields)Tuesday

ただし、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バイト

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

オンラインでお試しください!

pure結果をWeekDayIO Monadに戻すために必要です。ただし、Haskellは、プログラムによって値が出力されないため、そのままでは式が評価されないため、日曜日であってもプログラムは失敗しません。これが$!必要な理由で、Haskellが通常式を評価しない場合でも評価を強制します。


以前のアプローチData.Time127 124バイト

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アクションにラップされていても、非日曜日の出力が生成されます。
ライコニ

あなたは正しいかもしれませんが、一方で、完全なプログラムには終了コードがあり、これも標準的な方法です。
nimi

...チャレンジルールにより、関数は印刷しない限り、日曜日以外でも値を返すことができます。
nimi

@nimiお知らせありがとうございます。
ライコニ

5

05AB1E45 44バイト

05AB1Eには曜日を取得するための組み込み機能がないため、Zellerのルールを使用して計算しました。

日曜日の場合、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 weekd=daym=monthy=last 2 digits of yearc=centuryおよび括弧内の式([])切り捨てれます。

式で使用される各月は数字に対応しJan=13,Feb=14,Mar=3,...,Dec=12
ます。より一般的な形式で現在の月があるのでJan=1,...,Dec=12 、式を使用して月を変換します
m = (m0 + 11) % 14 + 1

3月が最初の月である副産物として、1月2月は前年に属しているため、決定の計算は次のようにyなります。
y = (year - (m0 < 3)) % 100

DoW取得する最終的な値はint 0=Sat,1=Sun,...,6=Friです。
結果がtrueの場合、明示的にエラーをスローできるようになりました。


11
05AB1EはJavaに負けましたか?私が知っているすべては嘘です
カミルドラカリ

5

JavaScript、23バイト

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

完全なプログラム。

変数kは定義しないでください。

JavaScript、Rick Hitchcockによる20バイト

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

JavaScript、apsillersによる19バイト

Date().match`Su`&&k

1)を含めるのを忘れた_=>; これがないと、これはデフォルトで許可されないスニペットです。2)これfalseは、何も出力しないはずの1日おきに出力します。
シャギー

6
1)完全なプログラムであり、OPで許可されています。2)プログラムとして実行した場合、出力はありません
l4m2

3
/Su/.test(Date())&&k20バイト。
リックヒッチコック

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バイト

テイラースコットのおかげで2バイト節約できました。

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

これは、イミディエイトウィンドウで実行する必要があります。Weekday()1(日曜日)から7(土曜日)を返すため、日曜日にゼロ除算エラーが発生します。それ以外の場合、出力はありません。

エラーメッセージ


あなたは1時間で私に答えを打ちました-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
これらの正確な20バイトをVBScriptソリューションとして記述したところ、既存のVBスタイルの言語が既に送信されているかどうかを確認したいと思いました。したがって、これはVBScriptおよびおそらく他のVBスタイル言語でも機能します。

私はあなたがVBScriptのとポリグロットとしてこれをマークするべきだと思います@EngineerToast
テイラー・スコット

@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

ここで別のアプローチを試してみてください:月の日番号(1..31)として週の日番号(0..6)を解析します。

サンプル実行:

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-OK更新
-JohnRC

そして、必要に応じて、使用方法の指示、例えば関数呼び出しや変数
-FantaC

素敵なゴルフ、他の答えを見た後、これを自分で投稿しようとしていました!
グリード

3

R31バイト 30バイト

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

オンラインでお試しください!

日曜日以外、日曜日には出力がありませんError: object 'a' not found

format(Sys.Date(),'%u')は平日を取得するための最短の方法で、曜日には文字クラスの番号を、日曜日には7を出力します。数値7と比較することができ、真の場合は未定義のオブジェクトを使用しようとします。

ジュゼッペのおかげでバイトを節約できました!


>61バイト短いです。
ジュゼッペ

2

Ocaml、46バイト

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

そしてocaml REPLでは、letとfinalを削除することでより良い結果を得ることができます:()

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

これは41バイトです(キャリッジリターン用に1バイトを含む)。


1
PPCGへようこそ!
ライコニ

1
このコードをオンライン試すことは可能ですか?
ライコニ

Mmh ...コンパイルコマンドはocamlopt unix.cmxa <file>です。tioでコンパイルオプションを指定する方法がわかりません。今晩調査します
Bromind

tioは(simili)REPLインタープリターを使用するため、2番目の可能性を使用する必要があります。ただし、Unixライブラリがないようです(または、何らかの理由でアクセスできないようにします)
Bromind


2

TI-Basic 84 +、23バイト

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

日付と時刻のコマンドが必要です。これは84以上のみです。


2

MATL、12バイト

vZ'8XOs309>)

日曜日に生成されるエラーは次のとおりです。

  • Octaveでの実行:

    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へようこそ!
マーティンエンダー

2

C#(.NET Core)55 54 48バイト

オンラインでお試しください!

シャギーのおかげで1バイト節約

Emignaのおかげで5バイト節約

Kevin Cruijssenのおかげで1バイト節約

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

日曜日がenumで0にインデックス付けされているか、そうでない場合は (System.DayOfWeek)7



3
using SystemC#で無料で入手できますか?もしそうなら、私はあなたができると思う()=>{var k=1/(int)DateTime.Now.DayOfWeek;}のために42。それ以外の場合は明示的に49System.
エミグナ

3
@Emignaが私を打ち負かしました。()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}短いです。そして、あなたは使用することで、1つの以上のバイトを保存することができ、空の未使用のパラメータの代わりに、パラメータなし(すなわちv->{...}の代わりに()->{...}
ケビンCruijssen

1
40バイト:()=>1/(int)System.DateTime.Now.DayOfWeekここで試してみてください
Ayb4btu



1

R、40バイト

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

オンラインでお試しください!

weekdaysオプションの引数とともに日付の曜日を返しますabbreviate。これはに短縮さSundaySun、1バイトを節約します。

stopifnot各引数に、ない場合はエラーがスロー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.