Qual é o programa mais curto que pode prever a próxima vez que a sexta-feira cair no 13º dia do mês?
- Deve ser um programa completo de funcionamento (não apenas uma função / sub-rotina)
- É necessário imprimir a data no seguinte formato:
YYYY-MM-DD
- Permitir que o usuário forneça uma data de início como argumento de linha de comando ou por meio de
STDIN
- Se o usuário não fornecer uma data de início, use hoje como a data de início.
- Se a data de início for sexta-feira 13, o programa deverá encontrar as próximas sexta-feira 13.
Se eu fosse executar o programa hoje (16 de fevereiro de 2011), obteria a seguinte saída.
$ ./fr13th 2013-05-09
2013-09-13
$ ./fr13th 2007-06-29
2007-07-13
$ ./fr13th 2007-07-13
2008-06-13
$ ./fr13th
2011-05-13
2013-9-13
saída seria boa para o primeiro exemplo?Respostas:
Windows PowerShell, 74
Bastante direto. Um bit talvez confuso é o uso de
"Get-Date $args" | Invoke-Expression
para obter a data atual (se$args
estiver vazia) ou a data especificada$args
sem gerar um erro.Variante de 72 bytes:
Porém, leva séculos ... isso não aumenta a data e hora em um dia inteiro a cada iteração, mas apenas em 900 nanossegundos. Mas dois bytes mais curtos.
Variante de 67 bytes:
Isso é um pouco sensível ao código do idioma; se falhar na sua máquina, tente definir o formato da data para ISO-8601 previamente. :-)
Ah, e pode ser convertido em 65 bytes, como na versão de 72 bytes.
História:
for
. Comparação apenas como subtração, em vez de-eq
que salva outros dois bytes.date
string de formato Unix é um pouco menor.yyy-MM-d
é suficiente (já que o ano é sempre superior a três caracteres e o dia é sempre 13. Agradecemos a Ty Auvil por isso.fonte
iex
? Tente apenas (date $ args).$null
paraGet-Date
você receber um erro, não a data atual."date $args"|iex
no entanto, resolve para a data indicada$args
ou a data atual, que é exatamente o que queremos aqui.festança, 75
Isso é um pouco sensível à localidade; se ele falhar em sua máquina, tente
export
ingLC_ALL=C
antemão.fonte
Ruby,
9675 caracteresToma a data de stdin. Para não especificar uma data, pressione ctrl-d.
Muito obrigado pela ajuda de Ventero.
Ungolfed:
IO de amostra:
fonte
d.wday*d.day==65
é 4 caracteres mais curto. E você deve ser capaz de substituirDate.today.to_s
por"thu"
require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d
. E você pode ler a data de stdin com, emgets
vez de$*[0]
salvar outro caractere (insira EOF para obter o comportamento padrão).C #, 185
Baseado na solução C # de Andrew Koester , mas bastante modificado ao longo do caminho. Acabei por chegar a uma solução semelhante à minha solução PowerShell:
fonte
Perl (e outros), 114
Perl 5.10 ou posterior, execute com
-E 'code here'
ou-M5.010 file
. Necessidadesdate
(do coreutils para Linux) ecal
(do util-linux)Exemplo de execução:
Não tenho certeza de quando é mantido o zero inicial nos meses anteriores a outubro. Obviamente está perdido quando o ano passa; parece ser mantido quando a resposta é apenas no próximo mês. Vamos chamar esse comportamento indefinido - ei, isso é golfe!
fonte
BATER
CONCEITO USADO:
E / S DE AMOSTRA
fonte
C #
240 caracteres. O C # precisa de um modo "executar somente dentro de uma função"!
Sem golfe:
Saída de teste
fonte
D: 227 caracteres
Mais legivelmente:
A parte divertida é que, enquanto o std.datetime do D torna esse tipo de código muito fácil de escrever, também é incrivelmente detalhado - devido principalmente aos nomes de funções precisos (e, portanto, longos). Portanto, a usabilidade e a capacidade de manutenção do código são muito altas, mas a capacidade de golfabilidade do código é bastante baixa.
fonte
Python - 166 caracteres
Lê stdin, então você precisa alimentar uma linha em branco se desejar a data de hoje
fonte
SQLite, 374 caracteres
(Quebras de linha adicionadas aqui para facilitar a leitura; não incluídas na contagem.)
Requisito para "Permitir que o usuário forneça uma data de início como argumento de linha de comando ou por meio de STDIN" omitido devido a limitações técnicas.
As primeiras 4 instruções criam uma tabela (R) com uma única coluna contendo todos os números inteiros de 0 a 4095.
A 5ª declaração cria uma tabela (F) de todas as sextas-feiras 13 entre 2000-10-13 e 2340-12-13.
A sexta instrução simplesmente retorna a primeira sexta-feira 13 antes da data atual (UTC).
fonte
PHP - 103
(força bruta)
Ungolfed:
Teste:
fonte
!=
para-
. Além disso, você pode salvar até 2 caracteres, movendo-o para cima$d->modify('next fri')
na seção de incremento do loop.-r
e você não precisa da tag. Use a configuração padrão com-n
e Você não precisa@
.\n
é desnecessário.echo
em vez dedie
salvar outro byte.strtotime
em vez deDate
classe, pode salvar mais um ou dois.C #,
206194 caracteresAtualizar
Esta é uma visão um pouco diferente do problema, por isso deixei minha outra tentativa aqui na íntegra.
Aqui, estou encontrando a sexta-feira da semana "atual" e, em seguida, aumentando em 7 até encontrar uma que seja 13. Eu também usei o Joey's para formatação de loop e saída para raspar alguns caracteres.
Ungolfed:
Original:
Isso é semelhante ao de Andrew acima, mas havia diferenças suficientes. Decidi postar uma resposta separada em vez de comentar e sugerir edições.
Ungolfed:
fonte
R, 113 caracteres
Exemplo é executado:
fonte
Perl 6 , 69 bytes
Experimente online!
Graças a @ ASCII-only for -5
fonte
day-of-week==5
Javascript
ps: sim, eu sei, quebrei a primeira regra (não poderia ser apenas uma função)
Testes no shell javascript
fonte
T-SQL
359285253 caracteresEu só queria definir a solução SQLite com minha função de data detalhada não inteligente usando o procedimento T-SQL.
Atualização: Meu medo original de que fazer um incremento de um dia levasse mais espaço do que um incremento de um mês estava muito incorreto.
Resultados do teste (SSMS):
fonte
Outro Javascript, 153
Postei outra resposta javascript porque não posso comentar a primeira ...
Execute com nodeJS:
fonte
Python 3.3, 166 caracteres
A entrada está no formato
2013 1 1
,ou apenas pressione enter para usar a data de hoje (seria 11/12/2013 para esta saída)
(na verdade, há uma mistura da minha solução e da @gnibbler que conta 144 caracteres)
A linha muito legal
while t.day*t.weekday()-65:
é da solução @ gnibbler.fonte
Japt, 35 bytes
-8 bytes graças a @ASCIIOnly!
Tente!
fonte
toISOString
convertidos ao UTC, que altera a dataK
tempo loja como tempo local?Swift 4 , 310 bytes
Experimente online!
-4 graças ao TagTaco.
Infelizmente ...:
Int
s sejam usados comoBool
.??
.!=
também precisa de espaçamento, para que não seja interpretado como um desembrulhamento.fonte
VB.net (96c *)
Entrada
Então minha pontuação é dividida assim
fonte
Rebol, 136
Ungolfed:
Exemplo de uso:
fonte
Java 8,
200197 bytesExplicação:
Experimente aqui (remova o argumento para usar a data atual).
NOTA: O formato padrão do Java ao imprimir já é
yyyy-MM-dd
.fonte
05AB1E , 141 bytes
05AB1E não possui nenhum built-in para objetos ou cálculos de data. O único construído em relação às datas que possui é o ano / mês / dia / hora / minutos / segundos / microssegundos de hoje.
Portanto, por causa disso, quase todo o código que você vê são cálculos manuais para ir para o dia seguinte e calcular o dia da semana.
Principalmente derivado da minha resposta 05AB1E no desafio The Work Day Countdown (foi por isso que editei essa pergunta cerca de uma hora atrás, quando me deparei com um bug ..)
Entrada é uma sequência no formato
dd-MM-yyyy
(mas a saída está no formatoyyyy-MM-dd
, pois é uma das regras do desafio).Experimente online ou verifique todos os casos de teste .
Explicação:
fonte