Imprimir todos os domingos em 2017

27

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
ShinMigami13
fonte
1
Possível fraude de planejar seus domingos ? Este é um ano específico.
Xnor
1
Fiz uma check-in Planeje seus domingos antes de postar, mas ele solicita a impressão dos domingos em um determinado mês. @xnor
ShinMigami13
1
Algum motivo específico para esse formato de saída específico? Você pode abrir um pouco.
Rɪᴋᴇʀ
4
Na verdade, eu gosto disso como um desafio kolmogorov com texto exato. Acertar a formatação da data tem algumas otimizações interessantes.
precisa saber é o seguinte
5
De qualquer forma, acho que os votos próximos devem ser retirados.
Erik the Outgolfer

Respostas:

16

Python 2 , 81 bytes

x=0
exec"print'%05.2f.2017'%(x%30.99+1.01);x+=7+'0009ANW'.count(chr(x/7+40));"*53

Experimente online!

Nenhuma biblioteca de datas, calcula as datas diretamente. O principal truque é tratar o dd.mmvalor decimal. Por exemplo, 16.04.2017(16 de abril) corresponde ao número 16.04. O número é impresso formatado como xx.xxem .2017anexo.

O dia e o mês são calculados aritmeticamente. Cada semana adiciona 7 dias, conformex+=7 . Tomar o xmódulo 30.99lida com a substituição subtraindo 30.99sempre que o número do dia fica muito grande. Combina -31para redefinir os dias e +0.01incrementar o mês.

A rolagem assume que cada mês tem 31 dias. Os meses com menos dias são ajustados empurrando xpara 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, e 8triplicou 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.

xnor
fonte
Que resposta legal! '888z!}+'.count(chr(x%146))salva um byte.
Lynn
10

PHP, 48 bytes

while($t<53)echo gmdate("d.m.2017
",605e3*$t++);

PHP, 46 bytes (para deslocamentos UTC não negativos)

while($t<53)echo date("d.m.2017
",605e3*$t++);
user63956
fonte
1
Não deveria ser gmdatepor segurança do fuso horário? Ele falha no onlinephpfunctions.com. Ótimo trabalho em todos os outros aspectos!
Titus
9

Python 2 , 90 79 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)

from time import*
i=0
exec"print strftime('%d.%m.2017',gmtime(i));i+=605e3;"*53

Experimente online!

0segundos desde a época são 00:00:00 de 1º de janeiro de 1970, o que, como 2017, não foi um ano bissexto. 605000segundos é 1 semana, 3 minutos, 20 segundos. Adicionar 52 dessas "semanas" não nos leva além da meia-noite.

Jonathan Allan
fonte
Aqui está uma maneira mais curta de gerar a progressão aritmética.
Xnor
@xnor Obrigado, eu estava trabalhando no mesmo tipo de coisa e estava tentando ir mais baixo, mas o 81 parece muito para ir com a abordagem da biblioteca.
Jonathan Allan
@xnor ... ou não.
Jonathan Allan
1
Agradável! O número pode ser 605e3. Porém, eu tenho algumas idéias :) #
1140
7

Bash + coreutils, 44 bytes

seq -f@%f 0 605e3 32e6|date -uf- +%d.%m.2017

pode salvar 2 bytes -use GMT for assumido


  • @0 é 1970-1-1
  • 605000 é uma semana (604800 ) mais 200 s
    • 200 seg. deve funcionar, pois existem apenas 52 semanas em um ano
  • @32000000 é só um pouco mais de um ano
tsh
fonte
seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Yeconomiza 10 bytes. Você provavelmente deveria reivindicar isso como Bash + coreutils , no entanto.
Digital Trauma
7

PowerShell, 51 47

0..52|%{date((date 2017-1-1)+7.*$_)-u %d.%m.%Y}

Bastante 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:

0..52|%{date((date 17-1-1)+7.*$_)-u %d.%m.%Y}
Joey
fonte
1
Você pode salvar alguns bytes se, em vez de uma string, adicionar um número representando dois dias, ou seja (date 2017-1-1)+7.*$_. Veja esta resposta
Danko Durbić
@ DankoDurbić: Oh, uau. Eu só sabia adicionar inttiques e cordas por dias até agora. Bom saber.
Joey
5

Excel VBA 106 91 79 bytes

Sub p()
For i = #1/1/2017# To #12/31/2017#
If Weekday(i) = 1 Then MsgBox i
Next
End Sub

economizou 15 bytes graças a @Radhato

Supondo que 1/1/2017 seja domingo, ele salvará mais 12 bytes.

Sub p()
For i = #1/1/2017# To #12/31/2017#
MsgBox i
i = i + 6
Next
End Sub

Obrigado @ Toothbrush 66 bytes

Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sub

Editar: (Sub e End Sub não são necessários) 52 bytes

For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next
Rohan
fonte
Pode ser melhorada através chanching para i = 42736 Para 43100 para For i = # 1/1/2017 # Para nº 12/31/2017 # e, em seguida, removendo Format (...) substituir com apenas i
Radhato
@ Radhato, mas isso não aumentaria o tamanho dos bytes?
Rohan
Eu acho que a reduz a 96 .. pelo menos isso é o que eu contados lol
Radhato
Sim, sim. Graças
Rohan
1
@newguy 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.
Escova de dentes
4

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,

<?php for(;54>$t+=1;)echo date("d.m.Y\n",604800*($t)+1482624000);?>
ShinMigami13
fonte
Bem-vindo ao PPCG! Acredito que isso possa ser contado como 59 bytes (embora eu não pratique golfe no PHP).
Jonathan Allan
4
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);deve estar ok
tsh
2
Sempre bom ver novos jogadores de PHP! Você está autorizado a usar php -rde modo que você não precisa <?phpe ?>e, portanto, pode contar isso como 59 bytescomo @JonathanAllan disse corretamente. Você não precisa dos suportes $t. Alguns outros campos de golfe e você acabar com for(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);a 51 bytes(na minha fuso horário). Você pode substituir "\ n" por uma quebra de linha real, que é de apenas 1 byte, portanto, é 51 byte.
Christoph
1
Graças @ Christoph Eu estou tentando para fora uma outra abordagem, será atualizado em breve
ShinMigami13
Além de todas as outras dicas, você pode usar em gmdatevez da datesegurança do fuso horário.
Titus
4

k6, 32 bytes

`0:("."/|"."\)'$2017.01.01+7*!53

Breve explicação:

                2017.01.01+7*!53 /add 0, 7, 14, ..., 364 to January 1st
   ("."/|"."\)'$                 /convert to string, turn Y.m.d into d.m.Y
                                 /   split by ".", reverse, join by "."
`0:                              /output to stdout (or stderr), line by line

Infelizmente, isso parece funcionar apenas no intérprete de código fechado e sob solicitação.

Executando o comando no intérprete de código fechado.

zgrep
fonte
4

Pyke , 26 24 bytes

53 Fy17y"RVs6)c"%d.%m.%Y

Experimente online!

53 F                     - for i in range(53):, printing a newline between each
    y17y"                -  Create a time object with the year 2017. (Month and days are initialised to 1.)
         RV  )           -  Repeat i times:
           s6            -   Add 1 week
              c"%d.%m.%Y -  Format in "dd.mm.yyyy" time

Ou 11 bytes

Se permitido ignorar o formato de saída

y17y"52VDs6

Experimente online!

y17y"       - Create a time object with the year 2017. (Month and days are initialised to 1.)
     52V    - Repeat 52 times:
        D   -  Duplicate the old time
         s6 -  Add 1 week
Azul
fonte
3

R, 79 67 58 bytes

cat(format(seq(as.Date("2017/01/01"),,7,53),"\n%d.%m.%Y"))

Sendo 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.

plannapus
fonte
Isso deve reduzi-lo a 41 bytesprint(as.Date("2017-01-01")+seq(7,365,7))
contagem
@count Graças mas não iria imprimir a saída necessária (ou seja, "2017/01/01" em vez de "2017/01/01")
plannapus
3

Befunge-98 (PyFunge) , 99 95 93 85 bytes, linha à direita

Todas as otimizações foram feitas pelo @JoKing, muito obrigado a eles

s :1g2/10g\%:d1p10g\`+:b`#@_:1\0d1g#;1+:a/'0+,a%'0+,'.,j;a"7102"4k,d1g7+
>8><><>><><>

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.
sArmazene 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 dias
10g\%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.
:d1pSalve uma cópia do novo dia atualizado
10g\`+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\0d1gReordenar 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 fim
j;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,Imprimir 2017\n
d1gObtenha o valor do dia novamente 7+Adicione uma semana antes de repetir

IQuick 143
fonte
@ JoKing Omc uma otimização tão óbvia! Como eu pude sentir falta daquele? Obrigado.
IQuick 143
1
Mais alguns bytes desativados. Experimente online! Um de alterar a -17 salto para um comentário em vez disso, um de utilizar 0 indexação com base para o contador mês e um de alterá-lo para um one-liner
Jo Rei
@ JoKing Uau, você jogou muito golfe lá. Deixe-me adicioná-lo à resposta.
IQuick 143 de
1
Inferno, por que não tornar os dias 0 indexados também? 85 bytes
Jo King
3

JavaScript, 111 106 bytes

for(i=14833e8;i<1515e9;i+=605e6)console.log(new Date(i).toJSON().replace(/(....).(..).(..).*/,'$3.$2.$1'))

Nota: 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:

for(i=14833e8;i<15e11;i+=605e6)console.log(new Date(i).toJSON().replace(/(....).(..).(..).*/,'$3.$2.$1'))

O formato personalizado me custa 40 bytes ...

Neil
fonte
2

Perl 5 , 64 bytes

use POSIX;print strftime"%d.%m.%Y\n",0,0,0,7*$_+1,0,117for 0..52

Experimente online!

A tarefa dada foi em 2017, e não em qualquer ano, então eu codifiquei:

  • 117 (que é perlish para o ano de 2017, 1900 + 117)
  • +1 porque 1º de janeiro é domingo em 2017
  • 0..52 porque 2017 tem 53 domingos

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:

$$_[5]==117&&printf"%02d.%02d.%d\n",$$_[3],$$_[4]+1,$$_[5]+1900
  for map[gmtime(($_*7+3)*86400)],0..1e4
Kjetil S.
fonte
2

Ruby, 75 bytes

Solução simples para descobrir as datas com Time.

t=Time.new 2017
365.times{puts t.strftime("%d.%m.%Y")if t.sunday?
t+=86400}
Caracol_
fonte
1
Se você adicionar uma semana inteira (604800 segundos), não precisará procurar um domingo, repita 53 vezes.
GB
1
Se você fizer o truque sugerido por @GB e não verificar mais o domingo, também poderá inicializar com t=Time.new 1e, em seguida, fazer t.strftime"%d.%m.2017"com -1 byte.
Valor Ink
2

SAS, 52 50 bytes

Economizou 2 bytes graças a @ user3490.

data;do i=20820to 21184 by 7;put i ddmmyyp10.;end;
J_Lard
fonte
Você não precisa especificar um conjunto de dados - basta usar em data;vez de data c;e isso economiza 2 bytes. Eu acho que você precisa de um pensamento run;.
user3490
@ user3490 Obrigado, eu não estava ciente disso. Eu acho que é o equivalente a data _null_? Além disso, a rundeclaração está implícita se estiver faltando.
J_Lard
Não é bem equivalente - você acaba com um conjunto de dados de saída seguindo a datanconvenção de nomenclatura.
user3490
2

Mathematica 90 84 bytes

Bastante prolixo. numbermaniac e Scott Milner salvaram 5 e 1 bytes, respectivamente.

Column[#~DateString~{"Day",".","Month",".","Year"}&/@DayRange["2017","2018",Sunday]]
DavidC
fonte
Você precisa do Most@? A saída parece ser idêntica sem ela.
numbermaniac
1
@numbermaniac, Obrigado. Mostestava lá para evitar o primeiro domingo de 2018. Eu havia testado o código originalmente, sem Most, 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, Mostnão é necessário para 2017-18. Nem Mosttem nenhum efeito aparente no resultado. Misterioso!
22417
1

VBA, 81 bytes (talvez 64)

Sub p()
For i = 0 To 52
MsgBox format(42736 + i * 7, "dd.mm.yyyy")
Next i
End Sub

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 .

MsgBox #1/1/2017# + i * 7
Broke Daddy
fonte
Você também pode remover grande parte do espaço em branco que é auto-formatado. Por exemplo, e For i=0To 52e Format(42736+i*7,"dd.mm.yyyy"). Além disso, você pode simplesmente usar em Nextvez de Next i.
Engineer Toast
1

AHK , 67 bytes

d=20170101
Loop,52{
FormatTime,p,%d%,dd.MM.yyyy
Send,%p%`n
d+=7,d
}

Nada de mágico acontece aqui. Tentei encontrar um meio mais curto do que FormatTime mas falhei.

Engenheiro Toast
fonte
1

Java 8+, 104 100 99 bytes

()->{for(int t=0;t<53;)System.out.printf("%1$td.%1$tm.2017%n",new java.util.Date(t++*604800000L));}

Java 5+, 109 105 104 bytes

void f(){for(int t=0;t<53;)System.out.printf("%1$td.%1$tm.2017%n",new java.util.Date(t++*604800000L));}

Usa os recursos de data do printfformato.

Teste você mesmo!

Poupança

  1. 104 -> 100: alterou os valores do loop e o multiplicando.
  2. 100 -> 99: jogou golfe no circuito
Olivier Grégoire
fonte
1

T-SQL, 94 bytes

DECLARE @ INT=0,@_ DATETIME='2017'W:SET @+=1SET @_+=7PRINT FORMAT(@_,'dd.MM.yyy')IF @<52GOTO W

se você não gosta de SQL GOTO ou WHILE, aqui está uma solução CTE de 122 bytes

WITH C AS(SELECT CAST('2017'AS DATETIME)x UNION ALL SELECT x+7FROM C WHERE X<'12-31-17')SELECT FORMAT(x,'dd.MM.yyy')FROM C
WORNG ALL
fonte
a sua primeira solução começa em 08.01.2017não01.01.2017
grabthefish
1
Muito bons truques na sua solução. Bom trabalho. Não pude resistir a emprestá-los. ;)
AXMIM 14/04
1

Ruby, 60 + 7 = 67 bytes

Usa a -rdatebandeira.

(d=Date.new 1).step(d+365,7){|d|puts d.strftime"%d.%m.2017"}
Value Ink
fonte
1

Groovy, 81 77 63 60 56 bytes

d=new Date(0);53.times{printf('%td.%<tm.2017%n',d);d+=7}

O 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!

Krystian
fonte
Bem-vindo à programação de quebra-cabeças e código de golfe! Caso você esteja interessado, aqui está um link permanente: Experimente on-line!
Dennis
Obrigado @ Dennis Eu não sabia que isso existia :)
Krystian
Você pode salvar quatro bytes movendo a data dentro do bloco de horas,, 53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}52 bytes. Defender a honra de Groovy aqui ...
Matias Bjarland
1

C #, 138 111 102 bytes

Economizou mais 9 bytes graças a Johan du Toit !

Economizou 27 bytes graças às sugestões de Kevin Cruijssen !

()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));}

Função anônima que imprime todos os domingos em 2017.

Programa completo com método ungolfed:

using System;

class P
{
    static void Main()
    {
        Action f =
        ()=>
        {
            for (int i = 0; i < 53; )
                Console.Write(new DateTime(2017, 1, 1).AddDays(7 * i++).ToString("dd.MM.yyyy\n"));
        };



        f();
    }
}
adrianmp
fonte
1
Não é mais fácil usar apenas .AddDays(7*i++)? Então não há necessidade do .DayOfWeek<1cheque. Sabemos que 01-01-2017 é um domingo e, a partir daí, podemos continuar adicionando 7 dias.
Kevin Cruijssen
2
Não tenho certeza disso - em todos os códigos de golfe que participo, sempre usei o espaço para nome completo - mas você não está perdendo alguns Systems lá - System.DateTimee System.Console.Write?
auhmaan
Legal, mas você pode salvar alguns bytes:()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));};
Johan du Toit
@auhmaan: Sim, os espaços para nome completos devem ser usados ​​ou as usinginstruções devem ser incluídas na contagem de bytes.
raznagul
3
@adrianmp: As usinginstruçõ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?
raznagul
1

C #, 110 109 bytes

using System;()=>{for(int i=42729;i<43100;Console.Write(DateTime.FromOADate(i+=7).ToString("dd.MM.yyy\n")));}

Você 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 em Debugvez de Consolepara salvar dois caracteres

  • Evite ter declaração e atribuição explícita de variável

AXMIM
fonte
A menos que especificado de outra forma, nossos padrões dizem que você deve fornecer uma função ou programa (por exemplo, não um trecho) e precisa qualificar Debug e DateTime : eu recomendo adicionar using System;e alternar para Consolefrom Debug(que é um pouco desonesto, mas posso (não encontra nenhum comentário sobre o meta).
VisualMelon
1
@VisualMelon Eu cumpridas "fornecer uma função" e também tenho substituir Debugpor Consoleuma vez Debugexigiu 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.
AXMIM
Essas 'regras' são exatamente o que a comunidade estabeleceu ao longo do tempo (e documentou na meta). Não diminuímos as respostas, comentamos e também não as votamos. Quando eles os consertam, somos livres para votar. As outras duas respostas em C # têm comentários sugerindo que eles devem adicionar a usingdiretiva 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.
VisualMelon
1
@VisualMelon Fair bastante, eu sou apenas um transeunte aqui de qualquer maneira. Então, eu aceitarei suas regras enquanto estiver aqui. Portanto, tentei fazer com que minha resposta desse certo.
AXMIM
1
Parece bom para mim! +1 para a abordagem original. E você não precisa do espaço depois using System;(suponho que não foi intencional), ou seja, 109 bytes.
VisualMelon
1

TSQL, 112 105 bytes

SELECT CONVERT(VARCHAR,DATEADD(d,number*7,42734),104)FROM master..spt_values WHERE type='p' AND number<53

Demo

Sintaxe de conversão T-SQL

Salman A
fonte
Você pode salvar 2 bytes substituindo DAYpor d. Faz o mesmo.
AXMIM
+1 Você pode salvar outros 3 bytes substituindo '20170101'por 42734. Datas são números. Hora é a parte decimal do número.
AXMIM
1

JavaScript (ES6), 123 bytes

É o meu primeiro post aqui, olá!

a=x=>`0${x}.`.slice(-3);[].map.call('155274263153',(x,i)=>{for(j=0;j<4+(2633>>i&1);j++)console.log(a(+x+j*7)+a(i+1)+2017)})

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 2633usado no loop?
Bem ... 2633(decimal) está 101001001001em binário. Agora, o que isso 1significa? 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.

rinoceronte
fonte
@SIGSEGV: Não me importo de mudar ECMAScript 2015para Javascript (ES6), mas ... você quebrou meu código e tive que revertê-lo.
Rinoceronte #
Ah, esse é o consenso da comunidade, pois apenas a parte lambda é permitida.
Matthew Roh
@SIGSEGV Este não é o caso aqui. Esse lambda contém apenas uma pequena parte do código, e eu preciso desse identificador para poder usá-lo em outro lugar. Sem o a=código está realmente quebrado .
Rinoceronte #
1

T-SQL, 79 77 bytes

Depois 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.

DECLARE @d DATETIME=42734 WHILE @d<43100BEGIN PRINT CONVERT(VARCHAR,@d,104)SET @d=@d+7 END

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.

  1. Nomeie apenas a variável @
  2. Loop com em GOTOvez de LOOP real
  3. Salve um caractere usando em FORMATvez de CONVERT. (Apenas SSMS2012 +)

Usando esses truques, esta solução foi reduzida para a solução abaixo da qual são 79 bytes.

DECLARE @ DATETIME=42734G:PRINT FORMAT(@,'dd.MM.yyy')SET @+=7IF @<43100GOTO G
AXMIM
fonte
Você pode salvar 2 bytes alterando @ = @ + 7 para @ + = 7 e removendo o espaço entre o 7 e o IF.
WORNG ALL
Neste post é onde recebi todos os truques, também posso ajudar.
WORNG ALL
1
@WORNGALL maravilhoso, eu não sabia que poderíamos fazer isso. Muito obrigado.
AXMIM
1

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! :)

disp(datestr(367:7:737,'DD.mm.2017'))

Experimente online!

Felizmente, ano 2 ADparece exatamente o mesmo que ano 2017 AD. Começa e termina em um domingo, e também não é um ano bissexto. Isso economiza muitos bytes, pois 367:7:737é um pouco menor que 736696:7:737060.

Isso converte o número de dias desde que 01.01.0001, em uma sequência no formato DD.mm, com um final .2017.

Stewie Griffin
fonte
1

Haskell , 133 130 bytes

import Data.Time.Calendar
((\[f,g,h,i,j]->i:j:'.':f:g:".2017\n").drop 5.show)=<<take 53(iterate(addDays 7)$fromGregorian 2017 1 1)

Experimente online!

Sem uma biblioteca de calendários, 148 144 140 bytes

(\l->last l!l++length l!l++"2017\n").fst.span(>0).(<$>scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]).(-)=<<[1,8..365]
a!_=['0'|a<=9]++show a++"."

Isso é 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 que last l!l. Funciona calculando day/monthpares 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!

Angs
fonte
0

C #, 116 114 113 bytes

for(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.

rmrm
fonte
1
Você poderia adicionar um link TryItNow ? Além disso, você pode golfe um pouco usando um loop for em vez de um tempo de loop:for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
Kevin Cruijssen
@KevinCruijssen Unfortunaly Não consigo encontrar um compilador aplicável na página fornecida. Aqui está um link para a tecnologia usada, se você quiser entrar em contato com ela: link . De qualquer forma, obrigado pelo novo loop. :)
rmrm
1
Salvo disposição em contrário, os nossos padrões dizem que você deve fornecer uma função ou programa (ou seja, não um trecho), e você precisa se qualificar Debug e DateTime : eu recomendo adicionando using System;e usandoConsole.WriteLine(string)
VisualMelon