Uma data pode ser representada por um número inteiro não assinado como tal: AAAAMMDD. O que você precisa fazer é escrever o programa ou a função mais curta que identifique a data mais recente cujo número foi divisível por um determinado número n
(incluindo a data de hoje) e, em seguida, retorna essa data no formato mostrado acima. Se nunca houve uma data (entre 00000101 e hoje inclusive) divisível pelo número inteiro especificado, você deve retornar -1.
Exemplos
Current Date Input Output
30 July, 2014 4 20140728
30 July, 2014 7 20140729
28 July, 2014 4 20140728
28 July, 2014 7 20140722
28 July, 5 90000 -1
Entrada
Você pode ler do STDIN ou usar um argumento de função ou até esperar que a entrada seja armazenada em uma variável. A entrada será um número inteiro não assinado.
Saída
Escreva para STDOUT ou retorne (ou salve em uma variável) o número inteiro que representa a data no formato AAAAMMDD.
Restrições
Você pode usar qualquer biblioteca padrão oferecida por seu idioma. Aplicam-se brechas padrão .
Condições vencedoras
Este é um código de golfe , pelo que o menor programa (em bytes) vence. Em caso de empate, a resposta com mais votos vence.
Respostas:
Mathematica,
9360 bytesEspera que a entrada seja armazenada
n
.Observe que a linha vertical
∣
é o caractere unicode para "divide", que contei como 3 bytes (UTF-8).Edit: Encontrou um truque para evitar as
DateString
especificações inchadas e de formato :).Edit: esqueci totalmente do
-1
requisito. Corrigido agora.Aqui está uma explicação
Observe que eu usei, em
|
vez de∣
na explicação, porque o Unicode mexe com monoespaçamento.fonte
Python 2-150
Obrigado @ chill0r pela sugestão de remover days = e Jason S pela dica de que o bloco try pode ser reduzido para uma linha.
fonte
days=
not-=d.timedelta(days=1)
. Isso funciona bem também (pelo menos em python3)int(t.strftime("%Y%m%d"))
e soltere
, (2) use uma linhatry
porque sót-=d.timedelta(1)
precisa estar nela.strftime
em datas mais antigas funciona em python3, verificado e eu recebo um erro em python2 #C # 136
Com as especificações revisadas, uma função que pega um int não assinado e retorna um int.
152 caracteres com entrada / saída variável
Aproveitando os requisitos fracos de entrada / saída, a entrada deve ser armazenada na variável
n
(atualmente contando todos os caracteres, exceto o literal inteiro), e a saída é fornecida com a variávels
.204 caracteres com STDIN / STDOUT:
fonte
T-SQL (2012) - 148
Supõe que há uma variável livre @n com o valor n.
fonte
Golflua
9086Uma versão não-gasta de Lua seria,
fonte
MATLAB: 61
Assume que o divisor está armazenado
n
. O resultado será armazenado em uma variável chamadaans
.Versão comentada:
Irá gerar um erro se nenhum resultado for encontrado, mas a resposta ainda está disponível na variável, apesar disso.
O erro pode ser evitado ao custo de 2 caracteres extras:
fonte
PHP (92 = 85 + 7)
Espera que a entrada seja armazenada
$n
.Acabei de me lembrar por que não gosto mais de PHP =)
EDIT: Agora o -1 das especificações também está implementado.
fonte
JavaScript (ES6) 115
Espera o número na variável n, resultado armazenado na variável r. Cada dia é verificado, começando com a data atual e diminuindo - deve haver uma maneira melhor.
Além disso, usando as funções de data javascript padrão, todas as datas são gregorianas até o ano 1 (com anos bissextos incorretos antes da reforma gregoriana).
fonte
C # - 144 (ou 124 no LINQPad) + 1 para cada dígito em
n
Esta espera a entrada estar na variável
n
. Ao final da execução, o valor desejado estará na variávelr
. Isso considera00010101
a primeira data, no entanto, porque a data00000101
não existe. Sugestões para melhoria são sempre bem-vindas.Versão do LINQPad:
fonte
Groovy -
301300 caracteresMuito simples (e lento), sem truques para esconder o fato de que ele usa o Joda Time.
Golfe:
Exemplo de execução (em 30/07/2014):
Ungolfed:
fonte
R,
146139Boa sorte com uma data que não funciona.
microbenchmark
relatórios leva cerca de meio segundo para voltar 15 dias. Em 31 de julho de 2014, isso levaria cerca de 20 milhões de segundos (~ 23 dias) para cuspir-1
, pelo menos de acordo com a parte de trás do envelope.edit : alguns atalhos nos comentários
fonte
!d
é menor qued==F
e!z%%n
quez%%n==0
. Além disso, transformaras.numeric(gsub("-","",...)
uma função também deve reduzir a contagem de caracteres. Ainda bem, bom trabalho!as.real
muitas vezes é uma alternativa boa e mais curtaas.numeric
.as.real
está extinto a partir do R 3.0.0. Mas ainda temosas.double
qual é um personagem mais curto.paste0
no meu.Rprofile
naturalmente :) #Matlab 104
Ungolfed:
EDIT: Consegui otimizar um pouco, mas @DennisJaheruddin tem a solução real aqui
fonte
-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Python 3 -
151148 bytes, geradoresObrigado @ nyuszika7h pela
import*
sugestãofonte
Ruby 103
Entrada
Espera que o valor do divisor esteja presente na variável
n
.Saída
O valor de retorno da
f
funçãoExemplo online: http://ideone.com/LoYxG4
fonte
Java: 373 caracteres
Esta é uma porta da resposta Groovy e usa o Joda Time.
Golfe:
Amostras de execuções (com joda-time-2.4.jar no caminho de classe:
Ungolfed:
fonte
java.time.*
na versão mais recente do Java.Bash + coreutils (8.21), 67 bytes
seq
gera números inteiros de 1 a 9 9 , um por linha e formata-o como-<x>day
date -f
qual interpreta cada linha e gera a data formatada em umadc
expressão como[pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p
(espaços adicionados para facilitar a leitura)[pq]
defina uma macro para imprimir o topo da pilha e saiasp
salvar macro no registro p[pq]
defina uma macro para pressionar -1, imprima a parte superior da pilha e saiasq
salvar macro no registro q20140728
inteiro de data incorporadod
parte superior duplicada da pilhaA1
push 101 (00000101)=q
pop 2 principais valores da pilha: compare a data e 101 e chame a macroq
se igual7
divisor de pressão%
divisor pop e divida, divida e empurre o restante0
empurre 0=p
pop 2 principais valores da pilha: compare o restante e 0 e chame a macrop
se iguald
parte superior duplicada da pilhap
é chamada: imprime a data inteira e fechadc
completamentedc
expressões são canalizadasdc
para avaliação. Depois dedc
imprimir o valor certo e sair, o restante do pipeline é derrubadoSaída:
Como esse programa gera números inteiros de 1 a 9 9 , ele será válido por mais de um milhão de anos no futuro. Espero que esta limitação seja aceitável ;-)
Obrigado @ WumpusQ.Wumbley por reduzir o retorno de -1.
fonte
|grep .||echo -1
até o fim do pipeline, ou o uso zsh onde você pode expansões ninho comoecho ${$(cmd):-1}
(isso vai custar-lhe uma barra invertida em outros lugares ...)sizeof time_t
problema, já que o limite em que quebra é 2 ** 31 segundos antes de 1/1/1970. Minha instalação mais antiga também é pateticamente de 32 bitsPYTHON: 134 bytes
Não vou conseguir vencer o líder atual, e não é muito melhor do que a melhor resposta em Python, mas decidi postar minha melhor solução em Python.
Ungolfed:
fonte
from datetime import*
vez deimport datetime as d
, emtimedelta(1)
vez ded.timedelta(1)
e emyield
vez dereturn
.JavaScript (ES5) - 94
Ele espera a entrada na variável
x
e coloca a saída emo
.fonte
k4
(84)(73)Este é apenas um corte inicial com o primeiro algoritmo que veio à mente; Tenho certeza de que é possível melhorar tanto em desempenho quanto em duração.
Esta versão codifica a parte "today" (essa é a
.z.D
); altere-o para uma data literal (yyyy.mm.dd
) ou um número inteiro no sistema q date (dias desde 1 de janeiro de 2000) para executar os casos de teste. (q não analisará literais de datas anteriores ao início do século XVIII, portanto, para datas anteriores a isso, você precisará calcular o valor e usar o número inteiro apropriado diretamente. 1 de janeiro de "AD 0", nas especificações, vira -se-730457
, que é usado no código de função. 28 de julho, 5 AD, a partir do último caso de teste, acaba por ser-728450
.)Os casos de teste fornecidos:
editar:
Essa é uma abordagem diferente que usa um dos operadores de convergência para diminuir a data até encontrar uma divisível ou cruzar o limite de 1/1/0000. Também faz a conversão de data para número inteiro de maneira ligeiramente diferente.
Os casos de teste, desta vez todos de uma vez:
fonte
VBA 343 bytes (módulo)
fonte
Sub d(i):a=Now:b=a:Do Until b/i=Int(b/i):a=DateAdd("d",-1,a):b=Format(a,"yyyymmdd"):If b="01000101"Then:b=-1:Exit Sub:Loop:Debug.?b:End Sub
para 139 BytesPowerShell - 76
Isso depende do número que está sendo armazenado na variável
$n
.fonte