我们曾经有一个仅在星期日失败的问题


39

我们启发,我们曾经进行过一次单元测试,该测试仅在星期日失败,编写一个程序或函数,该程序或函数除了在星期日发生错误外什么都不做,然后在其他任何一天正常退出。

规则:

  • 除了打印到STDERR或您的语言的同类产品外,请勿通过常规IO方法使用输入或显示输出。如果是错误的副产品,则可以打印到STDOUT。
  • 一个函数可能在非星期日返回一个值,只要它不打印任何内容
  • 您的程序可以使用任何时区或本地时区中的星期日,只要一致即可。
  • 错误是导致程序异常终止的某种东西,例如被零除错误或使用未初始化的变量。这意味着,如果要在出现错误的部分之后添加任何代码,则不会在星期日执行该代码。
    • 您还可以使用手动创建错误的语句,等效于Python的raise
    • 这包括运行时错误,语法错误和编译时的错误(祝您好运!)
  • 错误时必须有一些符号将其与没有错误区分开
  • 这是,因此每种语言中最短的字节数将获胜!

我要等到周日才能查看答案;)


2
“编写一个只会在周日引发错误并在其他任何一天正常退出的程序或函数”,是指在周日运行时它应该会失败,还是意味着至少应有一个它有可能在星期日失败。更清楚地说,如果它仅在星期天下午2点而不是星期三下午3点失败,是否可以?
Bromind '18年

5
如果使用星期六,那会更好。您可能将其称为“星期六晚上错误”,甚至还为该问题编写了一些调整后的歌词。
亚伦


1
从您的问题尚不清楚什么构成错误。在解决此问题之前,我将投票关闭。
小麦巫师

3
并非完全如此...我们如何区分错误输出和常规输出。有什么print "error"错误吗?添加的段落并没有真正澄清任何内容。
小麦巫师

Answers:



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);),但是这会触发通知(可通过抑制设置正确error_reporting = E_ALL & ~E_NOTICEphp.ini)。


我相信您必须(在标题中)指定此答案仅且仅适用于PHP7 +和HHVM,因为PHP5.6和更低版本的出口没有任何问题。警告不是错误,也不会停止代码的执行。如果你这样做1%date("w");echo "Alive!",它会停在PHP7 +和HHVM,但不是在自PHP 4,所有其他版本
伊斯梅尔·米格尔

该问题将@IsmaelMiguel的任何打印归类为“标准错误”,作为错误,因此在这种情况下,警告就足够了。
请停止在

1
提出问题:“错误是使程序异常终止的一种东西,例如被零除错误或使用未初始化的变量。这意味着,如果要在出现错误的部分之后添加任何代码,则不会在星期天执行。” 警告不会发生这种情况。
Ismael Miguel

@IsmaelMiguel您引用的段落已在不到一个小时前添加到问题中。
axiac

1
引用了一个较旧的版本,我写评论时使用的版本是这样的:“ [...]编写一个程序或函数,该程序或函数什么都不做,但是在星期日时抛出一个错误,并在任何一天正常退出”。警告是针对此行的,因为PHP将正常退出。错误可能是致命错误或语法错误。不是警告除以0。PHP5.6和更早版本对此挑战无效。
Ismael Miguel


8

Java 8,69 43 34字节

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

-26个字节,感谢@OlivierGrégoire
-9个字节感谢@Neil

说明:

在这里尝试。

  • v->{...}未使用的Void null参数)比()->{...}(无参数)短一个字节。
  • new java.util.Date().getDay()将在周日至周六返回0-6,因此如果值是0(仅在周日发生),1/...则会产生java.lang.ArithmeticException: / by zero错误。


@OlivierGrégoire啊,java.util.Date()确实有一种获取星期几的方法。.周日甚至是0。.不确定我是怎么错过的。:S
Kevin Cruijssen

是的,通常,较早的类使用短名称提供所有功能。;-)
OlivierGrégoire18年

1
这对34个字节有效吗?在线尝试!
尼尔

@Neil在您发布时无效,但在不到一个小时后生效。;-)这是我的第一个主意……
OlivierGrégoire18年

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(我正在编辑这个)?
Xcoder先生18年

我不太明白。它是如何工作的?
pacholik

@pacholik "Su"in time.ctime()检查当前日期是否为星期日。如果这是错误的,>q则根本不会评估零件,并且一切都会顺利进行。但是,如果是这样,则对不等式的第二部分进行求值,由于q未定义,因此将抛出NameError
Xcoder先生18年

1
@pacholik编辑:我不认为我错了。为了提高效率,如果第一部分是虚假的,那么Python甚至不会理会最后一部分。不过,我必须等到周日才能对此进行测试。(我认为示范
Xcoder先生18年

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先生,18年

但是除非星期天,否则不允许输出到STDOUT,并且必须输出到STDOUT。
Xcoder先生18年

@ Mr.Xcoder是正确的。在非周日没有什么应该被输出
乔金

@JoKing我完全跳过了此规则,现在已解决
Rod

6

Haskell + Data.Dates,55字节

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

在线尝试!

这利用了以下事实:星期日是一周的最后一天。dateWeekDayWeekDay类型返回星期几,简单定义为

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需要将结果WeekDay返回到IO 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操作中也是如此。
Laikoni '18

也许您是对的,但另一方面,完整的程序具有退出代码,这也是一种标准方法。
nimi

...挑战规则现在允许函数在非星期日返回值,只要它们不打印即可。
nimi

@nimi感谢您的通知。
Laikoni

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

由于三月是第一个月的副产品,一月二月属于上一年,因此确定的计算y成为
y = (year - (m0 < 3)) % 100

DoW我们得到的最终值是int where 0=Sat,1=Sun,...,6=Fri
现在,如果结果为true,则可以显式引发错误。


11
05AB1E输给Java?我所知道的一切都是谎言
Kamil Drakari '18

5

JavaScript,23字节

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

完整程序。

k不能定义变量。

JavaScript,20字节,作者:Rick Hitchcock

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

JavaScript,apsillers为19个字节

Date().match`Su`&&k

1)您忘记包含_=>; 没有它,这是默认情况下不允许的代码段。2)false每隔一天输出一次,不输出任何东西。
毛茸茸的

6
1)这是一个完整的程序,由OP允许。2)如果您将其作为程序运行,则不会输出
l4m2,18年

3
/Su/.test(Date())&&k20个字节
里克·希区柯克

1
new Date版本25字节(new Date/864e5%7|0)-3||p
l4m2

3
@RickHitchcock的解决方案可以通过以下方式使模板标签执行缩短matchDate().match`Su`&&k
一倍

5

VBA / VBScript,22 20字节

由于泰勒·斯科特节省了2个字节。

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

这应该在立即窗口中运行。Weekday()返回1(星期日)至7(星期六),因此这会在周日创建零除错误。否则,无输出。

错误信息


您击败我一个小时的答案-19个字节:?1/(Weekday(Now)-1)
泰勒·斯科特

1
@TaylorScott我忘Now()在没有VBA的情况下它是有效的,但是我不能使用print,因为我认为除非出现错误,否则所有输出都是不允许的。No using input or showing output through the usual IO methods, except to print to STDERR。仍然保存2个字节。
工程师敬酒

1
我刚写了这20个字节作为VBScript解决方案,然后我想看看是否已经提交了现有的VB风格的语言。因此,这适用于VBScript以及其他VB风格的语言。

@EngineerToast我认为您应该将此标记为VBScript的多语言版本
Taylor Scott

@TaylorScott我以前没有做过。我做对了吗?
Engineer Toast

4

Ruby,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 '18年

@tfbninja -确定更新
JohnRC

以及必要时的使用说明,例如函数调用或变量
FantaC

高尔夫不错,在看到另一个答案后就将自己发布了!
Greedo

3

R31字节 30字节

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

在线尝试!

在非星期日(Error: object 'a' not found星期日)无输出。

format(Sys.Date(),'%u')这是我找到工作日的最短方法,它输出一周中某天的字符类编号,而星期日则为7。我们可以将其与数字7进行比较,如果为true,则尝试使用未定义的对象。

感谢Giuseppe,节省了一个字节!


>6短一个字节。
朱塞佩

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

1
是否可以使此代码在“ 在线试用”上工作?
Laikoni'1

嗯......的编译命令是ocamlopt unix.cmxa <文件>,我不知道如何在tio上提供编译选项。我将在今天晚上进行调查
Bromind

tio使用(simili)REPL解释器,因此您应该使用第二种可能性。但是,它似乎没有Unix库(或出于任何原因不允许访问它)
Bromind

2

SAS,36个字节

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

2

TI-Basic 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
    

要反转行为(除星期天以外的任何一天都会出错),请在~之后添加>

在线尝试!

说明

这利用了以下事实:

  • 用逻辑索引索引到一个空数组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字节

在线尝试!

感谢Shaggy,节省了1个字节

感谢Emigna,节省了5个字节

感谢Kevin Cruijssen节省了1个字节

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

幸运的是,星期日在枚举中被索引为0,否则它将需要 (System.DayOfWeek)7



3
您可以using System免费获得C#吗?如果是这样,我认为您可以()=>{var k=1/(int)DateTime.Now.DayOfWeek;}42岁。否则显式地使用49System.
Emigna '18

3
@Emigna击败了我;()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}更短。你可以通过使用一个保存更多字节,而不是没有参数的空未使用的参数(即v->{...}代替()->{...}
凯文Cruijssen

1
40个字节:()=>1/(int)System.DateTime.Now.DayOfWeek在这里尝试
Ayb4btu


2

C, 68  55字节

感谢@Ken YN节省了13个字节!

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

在线尝试!


删除中间体d以获得n/=gmtime(&n)->tm_wday;54个字节(但我不确定我是否喜欢所有这些编译器警告...)
Ken YN

@ KenY-N谢谢!
Steadybox

1

R,40个字节

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

在线尝试!

weekdays返回日期的工作日,并带有可选参数abbreviate,该参数缩短SundaySun,并保存一个字节。

stopifnot引发错误如果对于每个参数,不allTRUE,和引发错误与指示第一元件,其是不是一个消息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()}确保该程序仅在星期天出错

在线尝试!



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.