Soluções F # conhecidas em 140 caracteres , e esse é um problema do Código Rosetta .
Resultado necessário no stdout ou em uma variável de sequência para o ano de entrada 2014
:
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
Como foi solicitado, para 1900:
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
E 2000:
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
Posou porque as datas parecem trazer estranheza na maioria dos idiomas. Mais do que permitir bibliotecas de datas, espero vê-las! Mas se for externo ao idioma base, declare no nome da postagem (por exemplo, NodaTime do C # + Jon Skeet).
Esclarecimentos:
- Intervalo de anos de 1900 a 3015
- calendário gregoriano
- Caso contrário, o que for convencional para o Reino Unido / Londres.
- Um programa usando uma opção de linha de comando ou stdin é bom, produzindo o resultado em stdout
- Uma função que pega um valor para o ano e retorna uma string também é boa.
Falhas padrão excluídas . Ansioso pelas soluções APL, J, K e vendo algumas novas bibliotecas de datas.
Respostas:
Dyalog APL com cal de dfns , 19 bytes
Antes tarde do que nunca!
Solicita o ano, retorna a lista de datas no formato aaaa md .
⎕
solicitar entrada numérica e deixar esse argumento à esquerda do{
...}¨
função anônima (encontrada abaixo) aplicada a cada um⍳12
os números de 1 a 12 (os meses)A função anônima acima é a seguinte:
⍺⍵,
preceda os argumentos esquerdo e direito (ou seja, ano e mês) para2↑
os dois primeiros caracteres de⊢⌿
a linha mais baixa decal
o calendário para⍺⍵
argumento esquerdo e argumento direito (ano e mês)TryAPL online:
Retorne a esta página depois de clicar aqui para importar
cal
e suas dependências.Clique aqui para executar os casos de teste.
fonte
+
-
<
≤
=
≥
≠
⌈
e⌊
trabalham com objetos de data .Net .Ruby, 91 + 6 = 97
Funciona muito bem.
select(&:sunday?)
é bonito e, surpreendentemente,*' '
faz toda a formatação por si só.fonte
chunk
vez degroup_by
.Bash 4.x + ncal, 57
Se os separadores de nova linha estiverem OK em vez de espaços, podemos remover a
-n
opção e o espaço à direita daecho
instrução. E acho que ainda funcionará sem o shebang, então removi isso também:Script original (73 bytes):
Uso:
Nota: As versões bash anteriores a 4.0 omitem os zeros iniciais dos meses. Isso pode ser corrigido com a adição de 5 caracteres, alterando
{01..12}
para`seq -w 1 12)`
. Além disso,tail -c-3
pode causar problemas em alguns sistemas em que a saídancal
inclui espaços à direita, mas não conheço nenhum deles.fonte
`…`
vez de um bom hábito$(…)
.#!/bin/bash
para o golfe.IBM DFSORT,
113 linhas de 71, 72 ou 80 caracteresAs duas respostas com formato de saída colunar resistiram ao teste do tempo. Isso me dá um "loop", mais ou menos, em que em OUTFIL REPEAT = copia o registro atual várias vezes.
Técnica diferente para chegar ao valor, que parece mais longo, mas é mais curto, pois não consigo encontrar uma maneira incondicional de lidar com o 12º registro no ano seguinte, e torná-lo condicional significa incluir
IFTHEN=(WHEN=
duas vezes e outras coisas. O ganho nas oscilações (primeiro do mês é a maneira mais simples de fazê-lo) perde muito nas rotatórias (requisitos específicos de sintaxe).Isso usa uma função embutida (todas as funções no DFSORT são embutidas) para encontrar o último dia do mês. Em seguida, adiciona um dia (função) para chegar ao primeiro mês seguinte e usa a função PREVDSUN para obter o domingo anterior (que sempre será o último domingo do mês anterior, como antes).
Ao transformar o ano (entrada) em uma data válida, um número de seqüência de dois dígitos é usado para o mês, e esse valor também é copiado para o dia, pois o ponto de partida não importa enquanto válido, pois estamos após o último dia do mês inicialmente:
5,2
é menor queC'01'
.Aqui está o detalhe:
OPTION COPY - copia o arquivo de entrada para a saída
OUTFIL - para permitir que vários arquivos de saída, com seleção e formatação diferentes, produzam relatórios formatados. Utilizado de preferência ao mais curto
INREC
devido ao uso deREPEAT=
.REPEAT = 12 - produza 12 cópias de cada registro. Neste exemplo, pode haver apenas um registro de entrada (diferente da versão anterior) devido ao SEQNUM.
5: - comece na coluna 5 do registro.
SEQNUM, 2, ZD - número de sequência, o padrão é iniciar com um, dois dígitos, "decimal zonado" (para não assinado, qual será o mesmo que o caractere).
1,8 - copie os bytes 1 do comprimento 8 para o local atual (9). Isso ocorre porque o Y4T precisa ver esse 8, caso contrário, um formato de data diferente será usado.
Y4T - data no formato ccyymmdd (devido aos 8 imediatamente à frente).
ÚLTIMO DIA - Último dia do mês (também possível da semana, trimestre e ano).
TOJUL = - gera conversão de data para funções de data (TOJUL é um caractere menor que TOGREG)
9,7 - agora que tem 7 anos, o Y4T será CCYYDDD.
ADDDAYS - adiciona vários dias, ajustando-se automaticamente se o mês / ano seguinte (também pode ser ADDMONS and ADDYEARS)
PREVDSUN - a data juliana chega, domingo anterior está localizado, TOGREG para obter o formato de saída correto, com o separador "-" (pode ser o que você quiser como separador)
12X - espaços em branco para esclarecer a bagunça que nos permitiu fazê-lo de maneira tão curta
O resultado acima, para 2014, é:
É necessário algo para dizer ao SORT o que fazer. Não há padrão.
OPTION COPY
é o mais curto,SORT FIELDS=COPY
é equivalente, mas mais longo.O trabalho em si realizado desta vez
OUTFIL
(para permitir o uso de REPEAT). O código de trabalho é sem dúvida qualquer um dos 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) ou 138 (70 + 68) (excluindo os espaços em branco à esquerda, continuação forçada e espaços em branco à direita).Dado que o receptor precisaria saber o que está fazendo, acho que posso dizer que o código DFSORT para listar o último domingo de cada mês para qualquer ano de 1900 (será executado a partir do ano 0001, mas estou evitando a pesquisa como bem) até 9999 (embora o DFSORT suporte anos até 9999, a solução anterior não funcionaria no ano 9999 desde a 12ª data do ano seguinte) pode ser tweetada.
Por que o código é tão longo, se existem funções embutidas especialmente adequadas?
As definições de campo são efêmeras. Um campo é definido apenas como um local específico nos dados (que é um registro) para uso imediato. Em outras palavras, os campos não são definidos como tal, mas são definidos para cada uso e apenas para uso. As funções de data precisam saber quais (de muitos) formatos de data são usados para a fonte e a saída deve estar em um formato de data, para que seja necessário especificar.
Agora que temos um encontro juliano ... TBC?
Precisa de algum
JCL
E um arquivo de entrada (outra linha da JCL e três itens de dados em sequência):
Produz:
Na verdade, funcionará até o ano 9999.
DFSORT é o produto de classificação de mainframe da IBM. Os dados podem ser manipulados, mas como a classificação é a chave e as classificações geralmente são grandes e de longa execução, os cartões de controle DFSORT não têm construções em loop, portanto, não podemos colocar um SORT em um loop. Torna as coisas um pouco complicadas para tarefas como o golfe.
Por que postar a resposta, é porque o DFSORT tem uma
PREVDday
função. Então, no último domingo de um mês é fácil. É o domingo anterior (PREVDSUN) para o primeiro dia do mês seguinte.Também foi divertido fazer isso dentro de um "operando" (OVERLAY), um pouco como fazer tudo dentro
sprintf
ou similar.Aqui é ungolfed:
Embora não seja um abuso, não seria comum tentar colocar tudo isso em um OVERLAY, e há algumas coisas aparentemente desnecessárias necessárias para permitir que tudo entre em um OVERLAY. Há espaço para jogar golfe, mas, como isso removeria apenas uma linha, no máximo, não sou tentado.
O INREC é processado para cada registro.
OVERLAY permite alterar o conteúdo de um registro existente. Se o registro for estendido além do seu comprimento no processo, isso não será um problema.
1,4 é o ano que se aproxima. Ele tem um literal de 0201 anexado e, em seguida, os 1,8s sucessivos o repetem 11 vezes para dar um longo mandril de 96 bytes,
O 12º ano no registro atual estendido recebe 1 adicionado a ele e seu mês é igual a 1 (janeiro).
Os 10 meses restantes são alterados para 3 a 11.
Existem 12, na ordem inversa (devido a OVERLAY) deste tipo de coisa:
O n: é um número de coluna no registro. O X insere um espaço em branco. 89,8 pega os dados dessa coluna / comprimento, o Y4T os trata como uma data CCYYMMDD, PREVDSUM trabalha no domingo anterior, TOGREG = Y4T (-) o exibe como uma data gregoriana CCYY-MM-DD.
Como você recebe lixo se a origem e o destino de uma parte específica de um OVERLAY se sobrepõem destrutivamente, o final
11:X,18,120,6X)
reorganiza e mascara um pouco de confusão.Os manuais e os documentos podem ser encontrados em: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 e inclui o Guia de programação de aplicativos DFSORT da página 900+.
Como em todos os produtos IBM, todos os manuais estão disponíveis gratuitamente (exceto uma quantidade excruciante pequena de itens muito caros que apenas um número muito pequeno de pessoas no mundo fingiria entender).
Todos os cartões de controle DFSORT devem começar com um espaço em branco. A coluna 72 é usada apenas para continuação (qualquer não em branco serve, mas * é convencional). A coluna 72 é seguida por uma área de número de sequência que é ignorada, tornando cada registro 80 bytes.
Talvez mais algumas soluções por vir.
fonte
Bash, 63 bytes
Saída:
fonte
for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}
- 60 bytes-v
param paradate
é específico da data do BSD. Portanto, isso funciona no OSX, mas não na maioria dos Linux - talvez isso deva ser indicado na resposta.Python 2 - 189 bytes
Digite a data via STDIN.
Ainda muito mais golfe pode ser feito. O programa exagera um pouco, apenas por diversão:
Notas
zfill
é necessário durante anos devido à faixa de entrada nem dias, pois eles sempre terão mais de 20 anosPython 2 - 106 bytes
A solução não tão divertida:
calendar.monthrange
retorna dois números: o dia da semana em que o mês começa em (w
) e o número de dias no mês (n
). A solução é um pouco contra-intuitiva devido a um problema - o dia da semana retornado começa às 0 para segunda-feira , não domingo! No entanto, isso é compensado pelo fato den
ser baseado em 1.fonte
$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
JavaScript (ES6) 155
145Editar Problemas de fuso horário corrigidos poderiam ser mais curtos se tornados recursivos. Talvez.
fonte
new Date(y,0,++i,9)
. Além disso, isso falha em 2100 e acima dos anos bissextos, já que JS não possui informações sobre esses anos bissextos e, portanto, não os possuiFeb 29
nos anos bissextos para 2100 e acima.new Date(2014,0,26,9)
foi um domingo dando corretaISO
corda, bem comogetDay()
como0
.JavaScript, ES6,
222 219199 bytesNão encontrei nenhuma resposta JavaScript no wiki do rosetta.
Aqui vamos nós:
Isso cria uma função
S
que retorna uma string com a saída desejada. a função também cuida dos anos bissextos.Devido ao ES6, isso funciona apenas no Firefox mais recente.
Obrigado aos apsillers pela dica que reduziu para 200 bytes
Encontre a versão não destruída abaixo como um snippet de pilha que você pode executar aqui:
fonte
2100
saída de entrada2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02
está incorreta.Rebol -
120 116 80 7976Ungolfed + algumas anotações:
Exemplo do cálculo de domingo no console Rebol:
fonte
CJam,
122102 bytesIsso não usa nenhuma forma de biblioteca de datas. Também pode ser ainda muito jogado, eu acho.
Teste aqui.
fonte
R, 128 caracteres
Com quebras de linha:
fonte
C # 255
Ungolfed
Edit: modificado para imprimir apenas no último domingo :)
fonte
q, 67
fonte
"Oh, não, ele de novo!"
Java -
259246 bytesVersão não destruída:
Uso:
Saída:
Ainda outra resposta "vamos colocar uma resposta Java apenas para chutes". Ah bem. Mas, pelo menos, desde que você se preocupou em chegar a esse ponto da minha resposta, tentarei incomodá-lo um pouco mais e explicar meu raciocínio.
O método
g
recebe o ano desejado e, para cada mês, cria umGregorianCalendar
objeto (os meses vão de 0 a 11). Então, o primeiroc.set
define o dia da semana como domingo e o segundo declara que queremos a última semana do mês - como visto na documentação oficial . AsSystem.out.println
impressões imprimem a data desse domingo (se estivéssemos fazendo isso corretamente, o ano seria impresso comoc.get(c.YEAR)
, mas usandoy
novamente os caracteres de 13 caracteres), o mês deverá ser formatado para adicionar um zero inicial de janeiro a setembro (e o o valor é incrementado porque, bem, os meses aqui são representados de 0 a 11) e o dia do último domingo é impresso. E esse procedimento é repetido pelos outros onze meses.fonte
C #,
212, 237Com quebras de linha
Produção para 2014
fonte
C # 171
Função retornando uma string.
Ungolfed
fonte
C # 194
usando o Linq:
Ungolfed
Saída
fonte
Mathematica - 171
Embrulhado em uma função anônima, retorna a sequência
Primeiro golfe mathematica. Eu sinto que poderia ser substancialmente reduzido.
fonte
VB-192
Poderia ser pior ^^
Minha segunda e última entrada (acho que não posso diminuí-la)
142
fonte
Ruby 76
Usa um parâmetro de linha de comando
ruby sundays.rb 1900
. Usa a biblioteca de datas.fonte