Como hoje marca a ocasião do 26º segundo bissexto a ocorrer, seu desafio será produzir a data e a hora de cada segundo bissexto em GMT ou UTC que ocorreu até agora, bem como o que ocorre hoje.
Entrada
Não há entrada.
Saída
1972-06-30 23:59:60
1972-12-31 23:59:60
1973-12-31 23:59:60
1974-12-31 23:59:60
1975-12-31 23:59:60
1976-12-31 23:59:60
1977-12-31 23:59:60
1978-12-31 23:59:60
1979-12-31 23:59:60
1981-06-30 23:59:60
1982-06-30 23:59:60
1983-06-30 23:59:60
1985-06-30 23:59:60
1987-12-31 23:59:60
1989-12-31 23:59:60
1990-12-31 23:59:60
1992-06-30 23:59:60
1993-06-30 23:59:60
1994-06-30 23:59:60
1995-12-31 23:59:60
1997-06-30 23:59:60
1998-12-31 23:59:60
2005-12-31 23:59:60
2008-12-31 23:59:60
2012-06-30 23:59:60
2015-06-30 23:59:60
Regras
Como duvido que haja muitos recursos internos que permitam segundos bissextos, eu os permitirei.
As brechas padrão não são permitidas.
O menor código vence.
O formato da data deve ter um mês preenchido com zero e um ano com 4 dígitos, além de hora militar e um espaço que separa a hora da data. Colocar UTC
no final é opcional. Sua escolha de traços ou barras.
EDIT: Sim, como previsto, isso se tornou um desafio de codificação. Se apenas a codificação pudesse resolver o problema do segundo salto, ... todo o nosso código seria muito mais prático. Talvez precisemos de algumas idéias para desafios mais divertidos com usos práticos?
fonte
Respostas:
CJam,
72706964 bytesExperimente on-line no intérprete CJam .
Idéia
Começamos codificando cada segundo de salto como 2 * (Y - 1972) + D , onde D é 1 se ocorrer em dezembro e 0 em caso contrário.
A matriz de todos os segundos bissextos codificados é:
Vamos chamar essa matriz L .
Como a matriz está em ordem crescente, podemos armazenar as diferenças consecutivas em vez dos números reais:
Tratando esta matriz como os dígitos de um número base 15, obtemos o número inteiro
quais dígitos na base 240 (convertidos para caracteres) são
Código
fonte
R,
7875 bytesBuilt-ins, você diz? Bem...
R tem uma variável automática
.leap.seconds
que contém a data e a hora de cada inserção de segundo de salto, fornecida na hora local do sistema. A partir da versão 3.2.0 do R, isso não inclui hoje, então eu adicionei isso manualmente.Ungolfed + explicação:
Você pode experimentá-lo online !
fonte
HTML, 594 bytes
¯ \ _ (ツ) _ / ¯
fonte
working
código htmlcode golf
desafios.C,
160146141140 bytesPrimeira publicação, não tenho certeza do que são "brechas padrão". Tenho avisos de impressão, é claro.
160 bytes:
A idéia original é codificar segundos bissextos usando dois bits por ano: um para junho e outro para dezembro. A codificação é consumida um bit de cada vez pelo loop while interno. Sem um número inteiro de 128 bits, o loop while externo é necessário. O resto é tudo contabilidade e matemática. :-)
141 bytes:
A aplicação das dicas sugeridas reduz para 146 bytes. Encontrei uma maneira de simplificar a condição while externa (de Y <2000 a apenas Z), diminuindo-a para 141 bytes. Tão perto de um tweet!
140 bytes:
Percebi que o traço na data poderia ser eliminado, tornando o dia negativo. Não é possível fazê-lo com o mês também devido ao zero inicial em junho. Mas pelo menos ele se encaixa em um tweet agora!
Versão bonita:
Versão bônus:
Eu eliminei o loop externo deslocando um número inteiro de 64 bits para outro, mas são 150 bytes, devido ao bastante longo "não assinado muito longo"; se eu pudesse usar algo como "uint64", seria 138 bytes.
fonte
for
loop salvará alguns bytes. Entre,int main()
->main()
. Você pode achar isso muito útil.X>>=1
é o mesmo queX/=2
,6*(2-Z)
é o mesmo que12-6*Z
e4362608640
é um byte menor que0x104082000
. Aint
frentemain()
é desnecessária e, se você mudarmain()
paramain(Z)
, poderá remover a declaraçãoZ=1
.if(X&1)printf(...);
comX&1?printf(...):1;
o que economiza 1 bytewhile(X){...}
usar vírgulas para remover os chavetas -while(X)X&1?printf("%d-%02d-%d 23:59:60\n",Y,6*(2-Z),31-Z):1,Y+=Z^=1,X>>=1;
salvando outros 2 bytesPython 3, 91
Usa a codificação e a formatação de string do Sp3000 , mas armazena os valores em um objeto Python de 3 bytes, em vez de um número mágico.
A codificação precisa apenas de 86 dos 256 valores possíveis de um bytes; portanto, é usado um intervalo de caracteres imprimíveis para torná-la mais agradável.
fonte
Brainfuck, 806
Você pode executá-lo neste intérprete online.
fonte
Python 2,
111104 bytesCodificação base e mais codificação base.
fonte
GNU sed + data: 112
As distribuições comuns do Linux também contam com os segundos bissextos. Usando GNU sed e date:
GNU sed + data: 90
Protegendo alguns caracteres cortando o caminho:
GNU sed + date ajustado por Toby Speight: 84
Versão profundamente golfada proposta nos comentários:
fonte
date
(GNU 8.23) exibe aqueles como o primeiro segundo do próximo minuto. O que você está usando para entender o minuto de 60 segundos?-r
bandeira, substituindodate
com os///e
modificador, e substituindo%Y-%m-%d
com%F
emdate
: TZ = UTCsed -nr 's/^([0-9]+).*/date -d "1900-1-1 \1sec" "+%F %T"/ep' /u*/s*/z*/leap*
1899-12-31 \1sec
para a data e codificar23:59:60
como o tempo:sed -nr 's/^([0-9]+).*/date -d "1899-12-31 \1sec" "+%F 23:59:60"/ep' /u*/s*/z*/leap*
JavaScript ( ES6 ) 125
A nova linha dentro `` é significativa e contada.
Para testar, execute o snippet abaixo (sendo EcmaScript 6, somente Firefox)
fonte
PHP, 198 bytes
Infelizmente, não sei se posso inserir
\n
a função de data. Nesse caso, isso é 3 bytes a menos por causa de.""
.fonte
(int)
e remover algum espaço em branco. A data gera um erro; se o fuso horário padrão não estiver definido, silencie-o com um@
. 187 bytes:foreach([.5,1,2,3,4,5,6,7,8,9.5,10.5,11.5,13.5,16,18,19,20.5,21.5,22.5,24,25.5,27,34,37,40.5,43.5]as$d){$h=$d-ceil($d);echo@date("Y-m-d 23:59:60",mktime(0,0,0,-6*$h,31+$h,$d+1972))."\n";}
Código de máquina 8086 + DOS, 92 bytes
Hexdump do código:
Para executar, escreva os 92 bytes em um
com
arquivo -e execute no Windows ou no DOSBox de 32 bits.O código usa um bitmap com 87 bits, um a cada meio ano. Os bits são organizados em grupos de 16, a partir de MSB.
Decodificando o bitmap:
Por causa da estrutura do código, alguns bits são perdidos durante a decodificação, então tive que repeti-los. Essa repetição não incha o bitmap porque eu tive que preencher de 87 a 96 bits de qualquer maneira.
Após imprimir (ou não imprimir) o segundo bissexto, o código aumenta a data em meio ano, usando manipulações nos códigos ASCII da mensagem de saída.
Código fonte (pode ser montado com
tasm
):fonte
Pitão -
88bytesConverte em char para compactar os dados e salva os dados
06-30
versus12-31
como número binário.(há um espaço lá no final)
Experimente aqui online .
fonte
Python 2,
123121116114111 111Consegui reduzi-lo bastante, mas não sei quanto tempo ele pode ficar mais curto. Eu tentei usar
exec
, mas a formatação fica muito cara.Eu usei uma codificação base 16 da tabela na página vinculada da Wikipedia.
Editar: o uso da codificação hexadecimal é menor que a base 36 (consulte a versão menos prática).
Experimente aqui
Menos golfe:
fonte
C,
155149147 bytesAqui está outra abordagem em C, usando strings e codificação de comprimento de execução. Não é tão conciso quanto minha outra solução C, mas talvez possa ser melhorado?
155 bytes:
Usando uma string para armazenar o mês / dia.
149 bytes:
Eliminando a sequência de mês / dia.
147 bytes:
Eliminando a inicialização do ano.
144 bytes:
Se eu recodificasse o buffer para fazer com que a contagem de pulsos se aplicasse antes (e não depois) da execução, poderia reordenar as instruções no loop while externo, usar o operador de vírgula e eliminar os chavetas, economizando 2 bytes.
Posso salvar outro byte, tornando o dia negativo (como na minha outra solução).
Bonita:
Explicação:
As execuções são codificadas em bytes. Cada byte tem um bit para dizer se é junho ou dezembro, 3 bits para uma contagem de comprimento, 3 bits para uma contagem de ignorados e 1 bit alto não utilizado.
A contagem de pulos é o número de anos para pular depois de uma corrida; é compensado por -1 para permitir dois segundos bissextos em 1972. A duração é de quantos anos consecutivos; provavelmente pode ser compensado com +1, mas não está atualmente.
Portanto, um byte significa: "Faça LENGTH anos de JUNHO (ou DEZEMBRO) anos de pulo segundos e pule SKIP-1 anos" antes de passar para o próximo byte.
Os bytes são deslocados em 33 para torná-los legíveis e evitar codificação sofisticada.
Isso significa que, embora tenhamos pular bits suficientes para cobrir 1998-2005, estamos fora do intervalo ASCII, portanto, temos um comprimento extra de zero. Além disso, 1979 aparece por si só porque o comprimento 1972-1979 é muito longo.
Há bits suficientes nos bytes, portanto esses problemas podem ser corrigidos.
fonte
q / kdb +,
959493 bytesExplicação
Para cada ano + 1 , codifique para anos desde 1905 como um caractere ASCII, por exemplo:
6h$x
voltas"D"
voltar para68
. Comoq
a época da data é2000.01.01
, subtraímos95
e executamos a conversão de números inteiros para data"d"$"m"$-12*95-6h$x
.A razão pela qual +1 foi acima é subtrair o número de dias a partir do início do próximo ano para obter o ano real de 31 de dezembro ou 30 de junho, ou seja, 1 ou 185 dias. Portanto,
"DEFGHIJKSUV[^eh"
representa os anos com um segundo de salto em dezembro e"DMNOQXYZ]lo"
para os de junho. A subtração de emparelhamento é feita via(a;b){x-y}'(c;d)
, ondea
eb
são os anos que serão subtraídosc
e od
número de dias, respectivamente." "0:([]...)
prepara os resultados para fornecer a formatação correta, com uma pequena ressalva de que um cabeçalho da coluna será gerado.1_
larga esse cabeçalho e finalmente se aplicaasc
para obter a ordem correta.edit : 're-base' para subtrair 95 anos em vez de 100 (salvando 1 caractere).
edit 2 : reordenando o posicionamento dos operandos dentro da função de conversão de números inteiros até a data.
fonte
Python,
204201Você pode jogar com ele em repl.it .
Edit: completamente derrotado! As respostas de compactação são incrivelmente curtas.
fonte
PHP, 164 bytes
Esta é apenas uma modificação da idéia de @ Voitcus
fonte
Python,
221217Algumas idéias
Basicamente,
d(x)
descomprime um vetor de 3 números inteiros a partir de um único número inteiro de 2 dígitos.d(x)
é construída como a função inversa (ao longo dos 26 segundos bissextos às vezes) dec(v)
, que por sua vez é uma função de compressão que transforma um triplo como (1998,12,31) em um número como 85. Para derivar a lista [20 , 21 ... 28,58] Eu projetei outro algoritmo para verificar se a função de compressão é bijetiva sobre o domínio. Ou seja, assegurei-me de que o programa a seguir não produz duplicatas e usei sua saída como a lista do programa acima.A função de compactação
c(v)
foi projetada para ser bijetiva usando um esquema muito simples. Vamos tomar como exemplo (1998, 12, 31).Eu escrevi o programa para verificar se isso é verdade e depois defini
d(x)
como o inverso dec(v)
. No nosso exemplo, c ((1998, 12, 31)) é 85 ed (85) é impresso corretamente1998-12-31 23:59:60
.fonte
q=x%10
e substituaq
porx%10
todos os lugares. É mais curto. Também dou uma descrição útil de alguns jogos de golfe adicionais em seu programa aqui . Eu recomendo visualizar a página Dicas para Golfe em Python .gzip, 114 bytes
Hexdump:
1f8b080853f9975502006c006dd04b0a80300c84e1bde01dbc40218fa6697aff8309e2a6fa6f3f86cc10adb426a3b95ce62b6a0d398f07d59aeb8e4ed80983701026e1242cc0a9307e1aa11306615211b59710527b3961270cba9994fc7fc944829092faeedc313e7803993cfafb20020000
Crie um arquivo com os bytes descritos acima.
Extraia usando o gunzip ou outro programa de descompressão para obter um novo arquivo chamado "l". Este arquivo contém a saída desejada.
fonte