Tivemos uma pergunta que só falhou aos domingos


39

Inspirado por Tivemos um teste de unidade uma vez que só falhou aos domingos , escreva um programa ou função que não faça nada além de gerar um erro quando for domingo e saia normalmente em qualquer outro dia.

Regras:

  • Não é possível usar entrada ou mostrar saída através dos métodos usuais de E / S , exceto para imprimir em STDERR ou equivalente no seu idioma. Você pode imprimir em STDOUT se for um subproduto do seu erro.
  • Uma função pode retornar um valor fora dos domingos, desde que não imprima nada
  • Seu programa pode usar um domingo de qualquer fuso horário ou do fuso horário local, desde que consistente.
  • Um erro é algo que faz com que o programa seja encerrado de maneira anormal , como um erro de divisão por zero ou usando uma variável não inicializada. Isso significa que, se algum código fosse adicionado após a parte que comete erros, ele não seria executado no domingo.
    • Você também pode usar instruções que criam manualmente um erro, equivalente ao do Python raise.
    • Isso inclui erros de tempo de execução, erros de sintaxe e erros durante a compilação (boa sorte com isso!)
  • Em um erro, deve haver algum sinal que o distinga de não ter erro
  • Isso é , então o número de bytes mais curto em cada idioma vence!

Vou ter que esperar até domingo para verificar as respostas;)


2
Ao "escrever um programa ou função que não faz nada além de gerar um erro no domingo e sair normalmente em qualquer outro dia", você quer dizer que sempre que é executado no domingo, deve falhar ou quer dizer que deve haver pelo menos uma possibilidade falha um domingo. Para deixar mais claro, se falhar apenas no domingo às 14h, mas não no domingo às 15h, tudo bem?
Bromind

5
Isso teria sido ainda melhor se o sábado tivesse sido usado. Você poderia chamá-lo de "Saturday Night Error" e até trabalhar algumas letras de músicas ajustadas à pergunta.
Aaron

3
Domingos? Que tal falhar entre meia-noite e 1h ?
Draco18s

1
Não está claro na sua pergunta o que constitui um erro. Estou votando para fechar até que isso seja remediado.
Assistente de trigo

3
Na verdade não ... Como podemos distinguir a saída de um erro da saída regular. É algo como print "error"um erro? O parágrafo adicionado realmente não esclarece nada.
Assistente de trigo

Respostas:



18

PHP 7, 12 bytes

1%date("w");

No PHP 7, lança uma exceção do tipo DivisionByZeroaos domingos. O mesmo acontece se for interpretado usando HHVM .

No PHP 5, ele exibe um aviso (ativado stderr) aos domingos:

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

Em qualquer versão do PHP, ele não exibe nada nos outros dias da semana.

Execute usando a CLI:

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

ou experimente online!

Mais dois bytes pode ser espremido por stripping as aspas ( 1%date(w);), mas isso provoca um aviso (que pode ser suprimida por configurado corretamente error_reporting = E_ALL & ~E_NOTICEno php.ini).


Eu acredito que você deve especificar (no título) que esta resposta é apenas e somente para PHP7 + e HHVM, desde PHP5.6 e saída inferior sem nenhum problema. Os avisos não são erros e não param a execução do código. Se você fizer isso 1%date("w");echo "Alive!", ele vai parar em PHP7 + e HHVM, mas não em todas as outras versões desde PHP 4.
Ismael Miguel

@IsmaelMiguel, a pergunta classifica qualquer impressão como Erro Padrão como um erro, portanto, um aviso é bom o suficiente nesse caso.
Por favor, pare de ser mau

1
Citando a pergunta: "Um erro é algo que faz com que o programa seja encerrado de forma anormal , como um erro de divisão por zero ou o uso de uma variável não inicializada. Isso significa que, se algum código fosse adicionado após a parte do erro, não seria executado no domingo ". Isso não acontece com um aviso.
Ismael Miguel

@IsmaelMiguel, o parágrafo que você está citando foi adicionado à pergunta há menos de uma hora.
axiac 6/01/19

1
Citando uma versão anterior, a que estava no momento do comentário que escrevi: "[...] escreva um programa ou função que não faz nada além de gerar um erro quando é domingo e sai normalmente em qualquer outro dia . " Um aviso é contra essa linha porque o PHP sairá normalmente. Um erro seria um erro fatal ou um erro de sintaxe. Não é um aviso para dividir por 0. PHP 5.6 e anteriores não são válidos para esse desafio.
Ismael Miguel


8

Java 8, 69 43 34 bytes

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

-26 bytes graças a @ OlivierGrégoire .
-9 bytes graças a @Neil .

Explicação:

Experimente aqui.

  • v->{...}( parâmetro não utilizadoVoid null ) é um byte menor que ()->{...}(sem parâmetro).
  • new java.util.Date().getDay()retornará 0-6 para domingo e sábado; portanto, 1/...ocorrerá um java.lang.ArithmeticException: / by zeroerro se o valor for 0, o que acontece apenas aos domingos.


@ OlivierGrégoire Ah, java.util.Date()tem um método para obter o dia da semana .. E ainda é 0 no domingo ... Não sei bem como eu perdi isso. : S
Kevin Cruijssen

Sim, geralmente as classes mais antigas têm toda a funcionalidade em nomes mais curtos. ;-)
Olivier Grégoire

1
Isso é válido para 34 bytes? Experimente online!
Neil

@ Neil não era válido no momento em que você postou, mas tornou-se válido menos de uma hora depois. ;-) Mas foi minha primeira ideia ...
Olivier Grégoire

7

Python 3 , 33 bytes

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

Experimente online!

Python 3 , 50 bytes

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

Experimente online!

Economizou ~ 3 bytes graças a Rod .


1
@ Rod Por que não "Su"in time.ctime()>q(eu estava editando com este)?
Sr. Xcoder

Não consigo entender direito. Como funciona?
Pacholik

O @pacholik "Su"in time.ctime()verifica se o dia atual é domingo. Se isso é falso, a >qpeça não é avaliada e tudo sai sem problemas. Mas se isso for verdade, a segunda parte da desigualdade é avaliada e, como qnão está definida, isso geraria a NameError.
Sr. Xcoder

1
@pacholik Edit: Eu não acho que estou errado. Para fins de eficiência, se a primeira parte é falsa, o Python nem se importa em avaliar a última parte. Vou ter que esperar até domingo para testar isso, no entanto. ( Eu acho ) Demonstração .
Sr. Xcoder

3
@pacholik Observe que o Python encadeia operadores booleanos, o que equivale a ("Su" in time.ctime()) and (time.ctime() > q).
precisa saber é o seguinte

6

Pitão , 8 7 bytes

 l-6.d9

Experimente online!

Explicação

    .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

Isso ainda é inválido. Sua saída ( 1.0não é gerada pelo erro ). O OP disse explicitamente que eles não permitem isso. Você pode corrigir isso, antecedendo um único espaço ao seu código, embora
Mr. Xcoder

Mas você não tem permissão para enviar para STDOUT, a menos que seja domingo, e você produz para STDOUT.
Xcoder

@ Mr.Xcoder está correto. Nos domingos não, nada deve ser produzido
Jo King

@JoKing Eu pulei totalmente essa regra, corrigida agora
Rod

6

Haskell + Data.Dates , 55 bytes

import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime

Experimente online!

Isso usa o fato de que o domingo é o último dia da semana. dateWeekDayretorna o dia da semana como um WeekDaytipo, que é simplesmente definido como

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

WeekDayé uma instância de Enum, portanto, podemos usar succe predobter o sucessor ou predecessor de um dia da semana, por exemplo, succ Mondayrendimentos Tuesday.

No entanto, Sundayé a última entrada da enumeração, portanto, a chamada succ Sundayresulta no seguinte erro:

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: Obrigado a nimi por -3 bytes!
Edite 2: -11 bytes agora que as funções são permitidas.


Programa completo: 88 81 74 69 66 bytes

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

Experimente online!

pureé necessário para elevar o resultado de WeekDayvolta à Mônada IO. No entanto, Haskell vê que o valor não é produzido de forma alguma pelo programa; por mais preguiçoso que seja, a expressão não é avaliada; portanto, mesmo aos domingos, o programa não falha. Isso é por que$! é necessário, o que força a avaliação, mesmo que Haskell normalmente não avalie a expressão.


Abordagem anterior com Data.Time: 127 124 bytes

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

Experimente online! Estas são algumas importações impressionantes. Mude d<7para, por exemplo, d/=5para testar a falha na sexta-feira. Falha com a seguinte excepção: Non-exhaustive patterns in function c.


1
main=pure$!succ.dateWeekDay<$>getCurrentDateTime. E, como funções são permitidas, você pode soltar o main=.
nimi

@nimi Obrigado! Não tenho certeza sobre a função, por causa da No using input or showing output through the usual IO methodsregra. Até onde eu vejo, o uso de uma função resultaria em uma saída para não-domingos, mesmo que esteja envolvida em uma ação de E / S.
Laikoni

Talvez você esteja certo, mas por outro lado, um programa completo possui um código de saída, que também é um método padrão.
Ni5

... as regras de desafio agora permitem que as funções retornem valores fora dos domingos, desde que não sejam impressas.
N

@nimi Obrigado pelo aviso.
Laikoni

5

05AB1E , 45 44 bytes

Como o 05AB1E não foi incorporado para obter o dia da semana, usei a Regra de Zeller para calculá-lo.

Imprime uma nova linha para stderr no caso de um domingo (observável na exibição de depuração no TIO)

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

Experimente online!

Explicação

A fórmula geral utilizado é
DoW = d + [(13*(m+1))/5] + y + [y/4] + [c/4] - 2*c
Onde DoW=day of week, d=day, m=month, y=last 2 digits of year, c=centurye e expressão entre parêntesis ([] ) é arredondado para baixo.

Cada mês usado na fórmula corresponde a um número, onde Jan=13,Feb=14,Mar=3,...,Dec=12
Como temos o mês atual no formato mais comum Jan=1,...,Dec=12 , convertemos o mês usando a fórmula
m = (m0 + 11) % 14 + 1

Como um biproduto de março sendo o primeiro mês, janeiro e fevereiro pertencem ao ano anterior, o cálculo para determinação yse torna
y = (year - (m0 < 3)) % 100

O valor final DoWque obtemos é um int onde 0=Sat,1=Sun,...,6=Fri.
Agora, podemos lançar explicitamente um erro se o resultado for verdadeiro.


11
05AB1E perdendo para Java? Tudo que eu sei é uma mentira
Kamil Drakari

5

JavaScript, 23 bytes

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

Programa completo.

A variável knão deve ser definida.

JavaScript, 20 bytes por Rick Hitchcock

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

JavaScript, 19 bytes por apsillers

Date().match`Su`&&k

1) Você esqueceu de incluir o _=>; sem ele, esse é um trecho que não é permitido por padrão. 2) Isso sai falsetodos os dias quando não deve produzir nada.
Shaggy

6
1) É um programa completo, permitido pelo OP. 2) Se você executá-lo como um programa, não há saída
l4m2

3
/Su/.test(Date())&&kpor 20 bytes.
Rick Hitchcock

1
new Dateversão 25 bytes(new Date/864e5%7|0)-3||p
l4m2 5/01/19

3
A solução de @RickHitchcock pode ser reduzida pela execução de tag de modelo match:Date().match`Su`&&k
apsillers

5

VBA / VBScript, 22 20 bytes

Economizou 2 bytes graças a Taylor Scott.

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

Isso deve ser executado na janela imediata. Weekday()retorna 1 (domingo) a 7 (sábado), criando um erro de divisão por zero no domingo. Caso contrário, nenhuma saída.

Mensagem de erro


Você me responde em uma hora por uma hora - 19 Bytes:?1/(Weekday(Now)-1)
Taylor Scott

1
@TaylorScott Esqueci que Nowé válido sem o ()VBA, mas não posso usar a impressão porque acho que toda saída é proibida, a menos que ocorra um erro. No using input or showing output through the usual IO methods, except to print to STDERR. Ainda assim, salvou 2 bytes.
Engenheiro Toast

1
Acabei de escrever esses 20 bytes exatos como uma solução VBScript e pensei em verificar se já havia uma linguagem de estilo VB já enviada e aqui está. Portanto, isso funciona para o VBScript e provavelmente para outras linguagens no estilo VB.

@EngineerToast Eu acho que você deve marcar este como um poliglota com VBScript
Taylor Scott

@TaylorScott Eu não fiz isso antes. Eu fiz certo?
Engineer Toast

4

Ruby, 15 bytes

1/Time.now.wday

wdayretornará 0 no domingo, causando um erro ZeroDivisionError: dividido por 0. Por exemplo: 1/Time.new(2018,1,7).wday.


4

Perl 5 , 13 bytes

1/(gmtime)[6]

Experimente online!

Ported @ biketire's answerj

removeu 3 bytes com o lembrete de @ mik


1
gmtimeao invés de localtimetambém se reunirá com as regras, e é de 3 bytes mais curto
mik

3

jq, 42 caracteres

(Opção de linha de comando com código de 39 caracteres + 3 caracteres)

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

Apenas tentando uma abordagem diferente aqui: analise o número do dia da semana (0..6) como o número do dia do mês (1..31).

Exemplo de execução:

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"

Observe que jq lida apenas com datas UTC.

Experimente online!



3

VBA 18 bytes

Isso depende da função integrada que date()retorna um número de dia que resta 1 se dividido por 7, portanto, pode ser específico do sistema operacional e / ou da CPU.

a=1/(date mod 7-1)

Ele é executado na janela Imediata do projeto VBA.


2
Bem-vindo ao PPCG! Em geral, uma explicação e um link para um compilador / intérprete on-line são apreciados.
FantaC

@tfbninja - ok update
JohnRC

e, se necessário, instruções sobre como usar, por exemplo, chamada de função ou variável
FantaC

Bom golfe, estava prestes a publicar isso depois de ver a outra resposta!
Greedo

3

R , 31 bytes 30 bytes

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

Experimente online!

Nenhuma saída fora dos domingos, Error: object 'a' not found aos domingos.

format(Sys.Date(),'%u')foi a maneira mais curta que consegui encontrar para o dia da semana; ele gera um número de classe de personagem para o dia da semana, com 7 para os domingos. Podemos comparar com um numérico 7 e, se verdadeiro, tentar usar um objeto indefinido.

Guardou um byte graças a Giuseppe!


>6é um byte mais curto.
Giuseppe

2

Ocaml, 46 bytes

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

e no ocaml REPL, podemos obter melhores resultados removendo oe letfinal :():

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

que é 41 bytes (incluindo 1 byte para o retorno de carro).


1
Bem-vindo ao PPCG!
Laikoni

1
É possível fazer esse código funcionar em Experimente online ?
Laikoni

Mmh ... o comando compile é ocamlopt unix.cmxa <file>, não sei como dar a opção de compilação no tio. Vou investigar esta noite
Bromind

O tio usa um interpretador REPL (semelhante), portanto, você deve usar a segunda possibilidade. No entanto, ele não parece ter a biblioteca Unix (ou não permitir o acesso a ele, por qualquer motivo)
Bromind

2

SAS, 36 bytes

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

2

TI-Basic 84+, 23 bytes

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

Precisa de comandos de data e hora, que são 84+ e superiores.


2

MATL , 12 bytes

vZ'8XOs309>)

O erro produzido aos domingos é:

  • Em execução na oitava:

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

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

Para inverter o comportamento (erro em qualquer dia, exceto aos domingos), adicione ~depois >.

Experimente Online!

Explicação

Isso explora o fato de que

  • a indexação em uma matriz vazia com o índice lógico falseé válida (e o resultado é uma matriz vazia, que não produz saída); enquanto que

  • a indexação com truecausa um erro porque a matriz não possui uma primeira entrada.

Código comentado:

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 bytes

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

.zd retorna a data atual. mod faz o módulo da data atual, que retorna um int. Se a data for domingo, .zd mod 7 retornará 1. Se 1 = 1 (no domingo) e o erro for gerado usando o operador 'Para brevidade, o erro é apenas o caractere e.


3
Bem-vindo ao PPCG!
Martin Ender

2

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

Experimente online!

Guardado 1 byte graças a Shaggy

Guardado 5 bytes graças a Emigna

Guardado 1 byte graças a Kevin Cruijssen

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

Sorte que domingo é indexado 0 em enum ou então ele precisaria ser (System.DayOfWeek)7



3
Você recebe using Systemgratuitamente em C #? Se sim, acho que você poderia fazer ()=>{var k=1/(int)DateTime.Now.DayOfWeek;}por 42 . Caso contrário, 49 com o explícitoSystem.
Emigna

3
@Emigna me venceu; ()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}é mais curto. E você pode salvar mais um byte usando um parâmetro não utilizado vazia em vez de nenhum parâmetro (ou seja, v->{...}em vez de ()->{...})
Kevin Cruijssen

1
40 bytes: ()=>1/(int)System.DateTime.Now.DayOfWeek. Experimente aqui .
precisa saber é o seguinte


2

C,  68  55 bytes

Agradecemos ao @Ken YN por salvar 13 bytes!

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

Experimente online!


Largar o intermediário dpara obter n/=gmtime(&n)->tm_wday;para 54 bytes (mas não tenho certeza se eu gosto de todos estes avisos do compilador ...)
Ken YN

@ KenY-N Obrigado!
Steadybox

1

R , 40 bytes

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

Experimente online!

weekdays retorna o dia da semana da data, com um argumento opcional abbreviate , que reduz SundayparaSun , salvando um único byte.

stopifnotlança um erro se, para cada argumento, não allsão TRUE, e gera um erro com uma mensagem indicando o primeiro elemento que não é TRUE, por isso, o erro éError: "Sun" is not TRUE




1

Gema , 40 caracteres

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

Tinha que especificar uma mensagem de erro, então escolha uma pequena: "S".

Exemplo de execução:

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 bytes

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

os.date"%w"retorna o dia da semana atual no formato 0-6, onde 0 é domingo. Obter a lógica disso não é verdade apenas quando o dia da semana é 0, então domingo. Então apenas um básicoif(a){error()} garantirá que este programa apenas erros no domingo

Experimente online!



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.