Imprimir as datas de todos os domingos em 2017 no seguinte formato: dd.mm.yyyy
.
Saída esperada:
01.01.2017
08.01.2017
15.01.2017
22.01.2017
29.01.2017
05.02.2017
12.02.2017
19.02.2017
26.02.2017
05.03.2017
12.03.2017
19.03.2017
26.03.2017
02.04.2017
09.04.2017
16.04.2017
23.04.2017
30.04.2017
07.05.2017
14.05.2017
21.05.2017
28.05.2017
04.06.2017
11.06.2017
18.06.2017
25.06.2017
02.07.2017
09.07.2017
16.07.2017
23.07.2017
30.07.2017
06.08.2017
13.08.2017
20.08.2017
27.08.2017
03.09.2017
10.09.2017
17.09.2017
24.09.2017
01.10.2017
08.10.2017
15.10.2017
22.10.2017
29.10.2017
05.11.2017
12.11.2017
19.11.2017
26.11.2017
03.12.2017
10.12.2017
17.12.2017
24.12.2017
31.12.2017
code-golf
kolmogorov-complexity
date
ShinMigami13
fonte
fonte
Respostas:
Python 2 , 81 bytes
Experimente online!
Nenhuma biblioteca de datas, calcula as datas diretamente. O principal truque é tratar o
dd.mm
valor decimal. Por exemplo,16.04.2017
(16 de abril) corresponde ao número16.04
. O número é impresso formatado comoxx.xx
em.2017
anexo.O dia e o mês são calculados aritmeticamente. Cada semana adiciona 7 dias, conforme
x+=7
. Tomar ox
módulo30.99
lida com a substituição subtraindo30.99
sempre que o número do dia fica muito grande. Combina-31
para redefinir os dias e+0.01
incrementar o mês.A rolagem assume que cada mês tem 31 dias. Os meses com menos dias são ajustados empurrando
x
para cima em determinados números da semana com+[8,8,8,17,25,38,47].count(x/7)
. Essa lista é dos números das semanas que terminam nesses curtos meses, e8
triplicou porque fevereiro é 3 dias antes de 31.Essa lista pode ser compactada em uma string, assumindo valores ASCII mais 40. O deslocamento de
+40
poderia ser evitada usando caracteres não imprimíveis e poderia ser acessada mais curta como um objeto de bytes no Python 3.fonte
'888z!}+'.count(chr(x%146))
salva um byte.PHP, 48 bytes
PHP, 46 bytes (para deslocamentos UTC não negativos)
fonte
gmdate
por segurança do fuso horário? Ele falha no onlinephpfunctions.com. Ótimo trabalho em todos os outros aspectos!Python 2 ,
9079 bytes-5 bytes com a ajuda do xnor (evite contar as próprias semanas)
-1 byte graças ao xnor (adicione novamente e para 605000 como 605e3)
Experimente online!
0
segundos desde a época são 00:00:00 de 1º de janeiro de 1970, o que, como 2017, não foi um ano bissexto.605000
segundos é 1 semana, 3 minutos, 20 segundos. Adicionar 52 dessas "semanas" não nos leva além da meia-noite.fonte
605e3
. Porém, eu tenho algumas idéias :) #Bash + coreutils, 44 bytes
pode salvar 2 bytes
-u
se GMT for assumido-f
para odate
qual economiza 10 bytes;@0
é 1970-1-1605000
é uma semana (604800
) mais 200 s@32000000
é só um pouco mais de um anofonte
seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Y
economiza 10 bytes. Você provavelmente deveria reivindicar isso como Bash + coreutils , no entanto.PowerShell,
5147Bastante direto. 01-01-2017 é domingo, assim como todos os sete dias seguintes. Podemos salvar dois bytes se precisarmos que o script esteja funcionando durante toda a minha vida:
fonte
(date 2017-1-1)+7.*$_
. Veja esta respostaint
tiques e cordas por dias até agora. Bom saber.Excel VBA
1069179 byteseconomizou 15 bytes graças a @Radhato
Supondo que 1/1/2017 seja domingo, ele salvará mais 12 bytes.
Obrigado @ Toothbrush 66 bytes
Editar: (Sub e End Sub não são necessários) 52 bytes
fonte
Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sub
é um código VBA perfeitamente válido e tem apenas 66 bytes. O fato de o Editor VBA adicionar espaços extras é irrelevante.PHP, 67 bytes
Usando o fato de o PHP atribuir automaticamente o valor 1 a variáveis de loop não declaradas e usando tempos de época do Linux,
fonte
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);
deve estar okphp -r
de modo que você não precisa<?php
e?>
e, portanto, pode contar isso como59 bytes
como @JonathanAllan disse corretamente. Você não precisa dos suportes$t
. Alguns outros campos de golfe e você acabar comfor(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);
a51 bytes
(na minha fuso horário). Você pode substituir "\ n" por uma quebra de linha real, que é de apenas 1 byte, portanto, é 51 byte.gmdate
vez dadate
segurança do fuso horário.k6, 32 bytes
Breve explicação:
Infelizmente, isso parece funcionar apenas no intérprete de código fechado e sob solicitação.
fonte
Pyke ,
2624 bytesExperimente online!
Ou 11 bytes
Se permitido ignorar o formato de saída
Experimente online!
fonte
R,
796758 bytesSendo domingo, primeiro de janeiro, esse snippet cria uma sequência de dias, a cada 7 dias, de 01-01-2017 a 31-12-2017, formata-os no formato desejado e imprime-os.
fonte
print(as.Date("2017-01-01")+seq(7,365,7))
Befunge-98 (PyFunge) ,
99959385 bytes, linha à direitaTodas as otimizações foram feitas pelo @JoKing, muito obrigado a eles
Experimente online!
Eu senti como se estivéssemos perdendo alguma esostericidade aqui, então fiz uma solução na minha língua esostérica favorita.
Explicação :
>8><><>><><>
Codifica a duração dos 12 meses.s
Armazene o dia anterior no espaço em branco.:1g2/
Obtenha um valor ASCII da linha inferior e divida-o por dois. Isso nos dá a duração de um determinado mês. Ex: 8 = 56 em ASCII => 56 / 2 = 28 => O mês (fevereiro) tem 28 dias10g\%
Obtenha o dia salvo anteriormente e module-o pela duração do mês, o que nos permite fazer a transição da data para o próximo mês.:d1p
Salve uma cópia do novo dia atualizado10g\`+
Teste se a data antiga > nova data => fizemos a transição para o próximo mês => adicione 1 ao contador do mês:b`
Teste se o contador do mês> 11 significa que atingimos o final do ano (usando a indexação 0)#@_
Com base no anterior, se encerrar o programa:1\0d1g
Reordenar a pilha então fica assim:Month, 1, Month, 0, Day
#
pule o próximo instrução (duh)1+:a/'0+,a%'0+,'.,
Converta o número em 1 indexação, imprima, adicione um.
no fimj;
Use o 0 da pilha para não pular e use o;
para ir para a programação de impressão novamente e use o 1 para pular na;
próxima vez.a"7102"4k,
Imprimir2017\n
d1g
Obtenha o valor do dia novamente7+
Adicione uma semana antes de repetirfonte
JavaScript,
111106 bytesNota: O console do Stack Exchange não é longo o suficiente para exibir a lista inteira, então aqui está a primeira metade como um snippet separado:
O formato personalizado me custa 40 bytes ...
fonte
Perl 5 , 64 bytes
Experimente online!
A tarefa dada foi em 2017, e não em qualquer ano, então eu codifiquei:
O POSIX é um módulo principal e é sempre instalado com o Perl5. Fazendo o mesmo sem usar módulos em 101 bytes, removendo o espaço em branco:
fonte
Ruby, 75 bytes
Solução simples para descobrir as datas com
Time
.fonte
t=Time.new 1
e, em seguida, fazert.strftime"%d.%m.2017"
com -1 byte.SAS,
5250 bytesEconomizou 2 bytes graças a @ user3490.
fonte
data;
vez dedata c;
e isso economiza 2 bytes. Eu acho que você precisa de um pensamentorun;
.data _null_
? Além disso, arun
declaração está implícita se estiver faltando.datan
convenção de nomenclatura.Mathematica
9084 bytesBastante prolixo. numbermaniac e Scott Milner salvaram 5 e 1 bytes, respectivamente.
fonte
Most@
? A saída parece ser idêntica sem ela.Most
estava lá para evitar o primeiro domingo de 2018. Eu havia testado o código originalmente, semMost
, durante anos, 2011, 2012; nesse caso, o primeiro domingo de 2012 está incluído na saída. (Foi por isso que o incluí no código.) Estranhamente,Most
não é necessário para 2017-18. NemMost
tem nenhum efeito aparente no resultado. Misterioso!VBA, 81 bytes (talvez 64)
Meu primeiro post. Desenvolva a solução newguy removendo o cheque para dias da semana e apenas especificando a cada 7 dias. A remoção das datas economiza 12 bytes por peça. 42736 é 1/1/2017. O formato da data de saída depende da configuração do sistema. Isso é permitido? Nesse caso, são 64 bytes porque você não precisa do método de formatação .
fonte
For i=0To 52
eFormat(42736+i*7,"dd.mm.yyyy")
. Além disso, você pode simplesmente usar emNext
vez deNext i
.AHK , 67 bytes
Nada de mágico acontece aqui. Tentei encontrar um meio mais curto do que
FormatTime
mas falhei.fonte
Java 8+,
10410099 bytesJava 5+,
109105104 bytesUsa os recursos de data do
printf
formato.Teste você mesmo!
Poupança
fonte
T-SQL, 94 bytes
se você não gosta de SQL GOTO ou WHILE, aqui está uma solução CTE de 122 bytes
fonte
08.01.2017
não01.01.2017
Ruby, 60 + 7 = 67 bytes
Usa a
-rdate
bandeira.fonte
Groovy,
8177636056 bytesO acima pode ser executado como um script groovy.
Minha primeira entrada de código de golfe. Felizmente, o ano de 1970 não foi um ano bissexto, portanto, pode ser usado como base.
Graças a Dennis, aqui está uma: Experimente on-line!
fonte
53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}
52 bytes. Defender a honra de Groovy aqui ...C #,
138111102 bytesEconomizou mais 9 bytes graças a Johan du Toit !
Economizou 27 bytes graças às sugestões de Kevin Cruijssen !
Função anônima que imprime todos os domingos em 2017.
Programa completo com método ungolfed:
fonte
.AddDays(7*i++)
? Então não há necessidade do.DayOfWeek<1
cheque. Sabemos que 01-01-2017 é um domingo e, a partir daí, podemos continuar adicionando 7 dias.System
s lá -System.DateTime
eSystem.Console.Write
?()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));};
using
instruções devem ser incluídas na contagem de bytes.using
instruções necessárias para executar o código devem ser contadas. Veja esta Meta questão: Preciso usar importações ou posso chamar explicitamente uma classe?C #,
110109 bytesVocê pode aproveitar este programa online aqui
Nesta solução, nós:
Use Data de automação OLE (OADate) para evitar "AddDay ()" da data e hora.
FromOADate()
parece grande, mas é igual anew DateTime(2017,1,1)
Inicie o loop no último domingo de 2016. para permitir incrementar
+=
apenas com o operador . Este operador retorna o valor após a conclusão do incremento.Aumente por 7 dias para pular de domingo a domingo antes de imprimir a data.
Paramos quando o último domingo de 2017 foi atingido.
Use emDebug
vez deConsole
para salvar dois caracteresEvite ter declaração e atribuição explícita de variável
fonte
using System;
e alternar paraConsole
fromDebug
(que é um pouco desonesto, mas posso (não encontra nenhum comentário sobre o meta).Debug
porConsole
uma vezDebug
exigiu um específico incluem. No entanto, não cumpri o 'sistema de uso' porque meu concorrente nesse idioma não o faz. Além disso, você não pode codificar fora de uma classe que exigia ser definida dentro de um espaço para nome. Tenho certeza de que a maioria das respostas em c # deste site não inclui isso. Então, e agora, jogamos todas essas respostas no lixo? Nós votamos contra todos eles para forçá-los a cumprir? Nesse caso, a comunidade também pode banir o c # do codegolf.using
diretiva ou qualificar totalmente os métodos e tipos; por favor, não leve isso para o lado pessoal. Sou jogador de golfe C # há muito tempo e aprecio o quão arbitrárias as regras parecem, então gosto de cutucar as pessoas na direção certa quando posso. Eu especificamente 'direciono' respostas C # porque estou relativamente bem informado sobre o assunto.using System;
(suponho que não foi intencional), ou seja, 109 bytes.TSQL,
112105 bytesDemo
Sintaxe de conversão T-SQL
fonte
DAY
pord
. Faz o mesmo.'20170101'
por42734
. Datas são números. Hora é a parte decimal do número.JavaScript (ES6), 123 bytes
É o meu primeiro post aqui, olá!
Esta solução usa dados codificados e foi projetada para funcionar especificamente para o ano de 2017. Ela não depende de APIs de data / hora.
Quanto aos dígitos da sequência
155274263153
, cada dígito é um número próprio e indica o primeiro domingo de cada mês consecutivo. A produção para o ano inteiro pode ser gerada adicionando sucessivamente 7 a elas.E o número mágico
2633
usado no loop?Bem ...
2633
(decimal) está101001001001
em binário. Agora, o que isso1
significa? A partir da direita, o 1º, 4º, 7º, 10º e 12º bits são definidos. Isso corresponde aos meses que têm cinco domingos, em oposição aos que têm apenas quatro. Golfed até esta expressão puro, que inicialmente ficou assim:for(j=0;j<4+ +[0,3,6,9,11].includes(i);j++)
.Eu acho que as partes restantes são bastante auto-explicativas.
fonte
ECMAScript 2015
paraJavascript (ES6)
, mas ... você quebrou meu código e tive que revertê-lo.a=
código está realmente quebrado .T-SQL,
7977 bytesDepois de ajudar Salman A a melhorar sua resposta . Eu decidi escrever o meu usando um loop e
PRINT
.Eu terminei com esta solução de 90 bytes.
Então olhei para o líder atual em T-SQL, que era de 94 bytes do WORNG ALL com esta resposta . Esse cara tinha encontrado truques muito bons.
@
GOTO
vez de LOOP realFORMAT
vez deCONVERT
. (Apenas SSMS2012 +)Usando esses truques, esta solução foi reduzida para a solução abaixo da qual são 79 bytes.
fonte
Oitava , 37 bytes
Muito mais curto que todos os outros idiomas que não são de golfe, e ainda está empatado com o Jelly! Muito bem Octave! :)
Experimente online!
Felizmente, ano
2 AD
parece exatamente o mesmo que ano2017 AD
. Começa e termina em um domingo, e também não é um ano bissexto. Isso economiza muitos bytes, pois367:7:737
é um pouco menor que736696:7:737060
.Isso converte o número de dias desde que
01.01.0001
, em uma sequência no formatoDD.mm
, com um final.2017
.fonte
Haskell ,
133130 bytesExperimente online!
Sem uma biblioteca de calendários,
148144140 bytesIsso é engraçado, já que o uso de um operador para a função de preenchimento economiza dois bytes, embora o segundo argumento não seja utilizado, porque menos parênteses são necessários -
p(last l)
é maior quelast l!l
. Funciona calculandoday/month
pares subtraindo as datas de início acumuladas do mês a partir do dia do ano. As datas de início do mês são compactadas como (scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]
). O número do mês é o número de elementos positivos e o número do dia é o último elemento positivo.Experimente online!
fonte
C #,
116114113 bytesfor(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
Pode ser executado nas janelas interativas do Visual Studio (ou em qualquer outro C # REPL baseado em Roslyn)
Até 113 bytes: graças a Kevin Cruijssen.
fonte
for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
using System;
e usandoConsole.WriteLine(string)