var QUESTION_ID=97585,OVERRIDE_USER=42963;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Respostas:
Dyalog APL com dfns 's cal , Versão 15.0: 22; Versão 16.0: 19 bytes
A função cal vem com uma instalação padrão, basta digitar
)copy dfns
.Versão 15.0:
∊⎕{⍵/⍨2=≢⍎⊢⌿cal⍺⍵}¨⍳12
∊
alistar-se (achatar)⎕{
...}¨
entrada numérica como argumento esquerdo para a seguinte função anônima, assumindo cada um dos valores do lado direito como argumento direito⍵/⍨
o argumento if (fornece uma lista vazia, se não)2=
dois (domingo e segunda-feira) é igual a≢
a contagem de⍎
os números em⊢⌿
a linha mais baixa decal
o calendário para⍺⍵
ano argumento à esquerda, mês argumento à direita, sendo este último⍳12
1 a 12Versão 16.0:
⍸2=⎕{≢⍎⊢⌿cal⍺⍵}¨⍳12
⍸
os índices onde2=
dois iguais (ou seja, domingo e segunda-feira)⎕{
...}¨
entrada numérica como argumento esquerdo para a seguinte função anônima, assumindo cada um dos valores do lado direito como argumento direito≢
a contagem de⍎
os números em⊢⌿
a linha mais baixa decal
o calendário para⍺⍵
ano argumento à esquerda, mês argumento à direita, sendo este último⍳12
1 a 12fonte
JavaScript (Firefox 30+),
11210910395 bytesOlha ma, não tem embutidos!
Aqui está uma versão ES6 de 107 bytes:
E aqui está a minha tentativa anterior,
123113 bytes de ES6:Explicação
O dia da semana de um determinado ano é calculado da seguinte forma:
Em outras palavras:
y
.y
(y>>2
).y
(y/100|0
).y
; isso é 1/4 dey/100|0
, então usamos*3/4|0
.Em seguida, modulamos o resultado por 7. Se deixarmos
0
dizer domingo,1
segunda segunda, etc., o resultado corresponderá ao dia da semana de 31 de dezembro daquele ano. Portanto, para dezembro, queremos verificar se o resultado é1
. Isso nos dá o último caractere na string.O último dia de novembro é 31 dias antes do último dia de dezembro. Isso significa que para o último dia de novembro ser uma segunda-feira, 31 de dezembro precisa ser uma
(1 + 31) % 7 = 4
= quinta-feira.Este procedimento é repetido até voltarmos a março (a
3
). Independentemente de haver ou não um dia bissexto, o último dia de fevereiro é 31 dias antes do último dia de março, para que possamos calcular isso também (é(3 + 31) % 7 = 6
). A parte complicada é encontrar o valor correto para janeiro:(6 + 29) % 7 = 0
.(6 + 28) % 7 = 6
.Podemos calcular se é ou não um ano bissexto com o seguinte snippet:
Isso indica
0
sey
não é um ano bissexto e, se não, um número inteiro positivo. Isso nos leva apara calcular o dia de janeiro. No entanto, podemos fazer melhor revertendo as condições:
Como o resultado falso é sempre 0, podemos reduzi-lo para
economizando mais um byte precioso.
Juntando tudo, percorremos cada caractere na string, verificando se cada um é igual ao dia da semana de 31 de dezembro. Mantemos os índices dos que correspondem, retornando essa matriz no final. E é assim que você faz cálculos de ano bissexto sem embutidos.
fonte
!(y%4)*y%100|!(y%400)
serve. cada divisível ano a 4, com excepção não anos divisíveis por 100, a menos que também divisível por 400y+(y>>2)+(z=y/25>>2)+(z>>2)
ainda economize um byte.(y*5/4-(y/100)*3/4)
.JavaScript (Firefox 30-57),
6765646361 bytesGuardado
246 bytes graças a @ETHproductions.Economizou outro byte, exibindo os meses na ordem inversa.fonte
.keys()
y=>[for(_ of(m=0,Array(12)))if(new Date(y+400,++m).getDay()==2)m]
Array(12)
completamente:y=>[for(_ of(m=0,1e11+""))if(new Date(y+400,++m).getDay()==2)m]
MySQL,
183134129106 bytesSubstitua
2016
pelo ano desejado. Corre.Rev. 2: Usou a
help_topics
tabela na instalação padrão em vez de criar uma tabela temporária.Rev.3: Adotou o truque de aross
-
e percebeu que também posso omitir as aspas de"-1"
.No entanto,
-1
é necessário no MySQL: eu preciso de uma data completa.Rev.4: A restrição
m BETWEEN 1 AND 12
pode ser feita comom>0 AND m<13
(-6), mas não é necessária - valores inválidos serão ignorados; os avisos serão contados, mas não listados.fonte
FROM help_topic
semmysql.
trabalho? Eu tentei nãoUSE mysql;
O banco de dados correto deve ser selecionado de alguma forma.Perl, 64 bytes
Inclui +1 para
-n
Dê entrada no STDIN:
mon.pl
:fonte
Lote,
160152 bytesPorto da resposta da @ ETHproduction. Com abreviações de mês para
197189 bytes:fonte
J,
483433 bytesEconomizou 15 bytes com a ajuda de @ Adám .
Usa o calendário interno para gerar uma matriz de seqüências representando os meses e analisa cada sequência para determinar se a última segunda-feira é o último dia do mês. Ele gera cada mês como o número do mês de cada um. Ou seja,
Jan = 0
,Feb = 1
, ...,Dec = 11
.A saída de
calendar
éUso
Explicação
fonte
calendar
é uma matriz de 12 caixas em que cada caixa contém uma matriz 2D de caracteresI.7=;#&.>".&.>,&.>_2{.&.>calendar 2016
se você combinar todos os "sub-abertos", deverá conseguir abreviá-lo.Mathematica,
6257 bytesFunção anônima. Pega um número como entrada e retorna uma lista de listas de números de elemento único como saída. Sinceramente, não tenho mais certeza de como funciona.
fonte
Perl + cal, 46 bytes
Exemplo:
fonte
Java 7,
186 182172 bytesObrigado a Kevin por salvar 4 bytes
Obrigado a @cliffroot por salvar 10 bytes
destroçado
Esta versão é fornecida por @cliffroot ( 168 bytes )
amostra de saída
fonte
n%4==0
paran%4<1
;n%400==0
paran%400<1
eint c=...;int[]b=...,a=...
paraint c=...,b[]=...,a[]=...
.b
ea
pode ser definido naint
parte assim:int ... ,b[]=...,a[]=...
int[]f(int n){int x=--n*365+n/4+n/400-n++/100,k=0,b[]={1,(n%4<1&n%100>0)|n%400<1?-1:-2,1,0,1,0,1,1,0,1,0,1},a[]=new int[12];for(int i:b)a[k++]=(x+=i+30)%7==1?1:0;return a;}
poucos bytes salvosb
ab[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3}
ei+30
ai+28
para mais 2 bytesint[]f(int n){int b=13561787|((n%4<1&n%100>0)|n%400<1?1<<20:0),x=--n*365+n/4+n/400-n/100,a[]=new int[12],k=0;while(k<12)a[k++]=(x+=(b>>24-k*2&3)+28)%7==1?1:0;return a;}
Python 2, 100 bytes
Ugh. Matemática com datas não é tão simples quanto eu gostaria.
Experimente online
Mesmo comprimento:
fonte
MATL , 21 bytes
Os meses são exibidos como números.
Experimente online! Ou verifique todos os casos de teste .
Explicação
Isso usa funções internas de conversão de data. Para o ano determinado, ele testa quais os últimos dias do mês é segunda-feira.
Em vez de especificar explicitamente o último dia do mês
k
(que pode ser 28, 29, 30 ou 31), especificamos o0
-ésimo dia do mêsk+1
, que é equivalente e não depende do mês ou do ano.fonte
Utilitários Bash + GNU, 56 bytes
Parece exigir a
date
versão 8.25. A versão 8.23 do Ideone não funciona.fonte
Excel, 537 bytes
Porque - você sabe - Excel!
Recebe o ano de entrada em A1. Retorna a lista hexadecimal de meses; 1 = janeiro, C = dezembro. Como cada mês é um dígito, não é necessário separador.
Exemplo: A1 contém 2016. B1 contém a fórmula acima e é exibida como
2A
, significando fevereiro e outubro.fonte
PHP, 109
180159byteswhile
parafor
como agora é um ano (mais uma vez, obrigado Titus)2 velhos
Suporta todos os anos, do ponto ao 10000, também se livrou de um aviso indefinido de var que eu não conhecia em um PC. Sim, é mais longo que a versão antiga, mas é mais robusta.
Antigo 1
Se estiver rodando no Windows ou em um sistema de 32 bits, haverá o temido bug de 2038, mas em um sistema Linux de 64 bits, tudo bem.
Tentei usar o
date("t"...
que deve representar a última data do mês especificado, mas os resultados não coincidem com os mencionados anteriormente neste tópico.fonte
$z
, sem aspas paraN
) -1: emfor
vez dewhile
-43 : recebe a entrada conforme solicitado em vez de repetir os anos -3: emjoin
vez deimplode
-16: saída direta:for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";
+9 se você insistir em não ter vírgula à direita:echo$o=$o?",$m":$m;
PHP, 92 bytes
verificar 12 vezes 1 mês após o primeiro dia do ano é terça-feira Se for, então é o dia anterior ao último dia do mês é uma segunda-feira.
fonte
C, 214 bytes
Compilar
Ungolfed
Com créditos para os gurus relevantes.
Michael Keith e Tom Craver, do Programa C, para encontrar o dia da semana com data .
Collin Biedenkapp para perguntas e respostas: Como faço para descobrir qual é o último dia do mês?
fonte
if
a outra direção, para ter o seuelse
retorno31
e, portanto, puder eliminar a grande==
cadeia?C, 119 bytes
Isso usa uma tabela que contém o deslocamento dos dias da semana do último dia de cada mês para um ano bissexto, codificado em uma palavra de 32 bits assinada usando a base 7. Se não for um ano bissexto, adicionamos 1 ao deslocamento de janeiro (como você pode ver,
y&3||y%25<1&&y&15
é usado para verificar anos sem dias bissextos). Simplesmente percorremos todos os meses e verificamos se o último dia é segunda-feira. Muito simples, na verdade, sem truques ou truques feios. Aqui está um pouco não-destruído:Eu poderia revisitar isso para reescrevê-lo como uma função para salvar alguns caracteres. O
printf
também ocupa um pouco de espaço demais ...fonte
PHP,
96957671696461 bytesNota: os números do ano devem ser preenchidos com 4 caracteres, como
0070
.Execute assim:
Explicação
Repete de -1 a -12. Crie a data usando mktime, dia
0
(o último dia do mês anterior) e mês2..13
. Formate a data como número do dia e, se o resultado for 1, imprima o número atual. O sinal negativo-
é usado como delimitador.O bug do milênio ataca novamente!
Observe que, com esta versão, o intervalo
0..100
é interpretado como1970..2069
. Isso não é problema para o intervalo0..69
, pois as semanas têm um padrão que se repete a cada 400 anos (146097 dias, exatamente 20871 semanas), mas para o intervalo70..99
, 1900 é adicionado ao número do ano, que não é múltiplo de 400. Para corrigir esse problema APENAS para números de 30 anos em um intervalo de 10k, a maneira mais simples é adicionar 400 ao número do ano para impedir a interpretação de 2 dígitos ( +4 bytes ):Tweaks
!~-$i
para comparar$i
com1
(-1
binário é negado0
, é logicamente negado étrue
; todos os outros números sãofalse
), portanto, parênteses não são necessárioslast day ofYYYY-m
notação para criar a datadate
e emstrtotime
vez dedate_create
YYYY-m
parte da datamktime
vez destrtotime
. Revertida para usar o dia0
(mktime
também suporta o mês 13, então0-13
==31-12
)-R
para$argn
disponibilizarfonte
mktime
elimina a necessidade de preencher o ano, não é?mktime
é contra-intuitivo , porque os argumentos são tomados comoINT
s. Isso significa que você não pode completar o ano ... então tudo no intervalo0..100
é interpretado como1970..2070
. Isso não é problema para o intervalo,0..70
porque 400 anos têm um número exato de semanas (portanto, os calendários repetem o padrão a cada 400 anos), mas70..99
adicionam 1900 (não um múltiplo de 400!). Portanto, nova versão. tem um bug.$argv[1]+400
... a menos que os dias da semana juliano e gregoriano sejam diferentes.Excel,
4289796 bytesEntrada em A1. Valores hexadecimais não separados de saída (janeiro = 0, dezembro = B)
Adicionados 10 bytes ("+2000") para permitir o tratamento de datas anteriores a 1990.
Economizou 11 bytes graças a @ Engineer Toast .
Primeira tentativa (428 bytes), emprestando fortemente a solução de @ Adám .
fonte
297 -> May
retorna6
com esta fórmula. Não deveria ser 4?1776
dá em7A
vez de apenas8
para setembro.Date(A1,3,0)
em vez deEOMONTH(DATE(A1,2,1),0)
Bash + cal, 58 bytes
fonte
cal
(por exemplo, OSX), mas observe os espaços à direita no GNUcal
.Python 2, 94 bytes
repl.it
Uma função sem nome, leva um ano inteiro, gera uma lista dos números do mês
[1-12]
.Também tentei superar a contagem de bytes com aritmética sem êxito (110 bytes). :
Uma função sem nome que retorna uma lista de valores booleanos que representam se os meses [Jan-Dec] terminam em uma segunda-feira
fonte
Java 7,
200249 bytesEm Java,
GregorianCalendar
é uma mistura entre um calendário gregoriano e juliano. Por esse motivo, o ano1
deu resultados incorretos. AlterarCalendar c=Calendar.getInstance();
paraGregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));
corrigir isso, forçando o uso apenas do calendário gregoriano. Obrigado a @ JonSkeet no stackoverflow.com por me explicar isso.Ungolfed & código de teste:
Experimente aqui.
Saída:
fonte
C # 6C #,171167135 bytes-32 bytes graças a Shebang
Imprima meses como números; com espaço delimitado; com espaço à direita. Agora, esta resposta também funciona para versões anteriores do C #.
Antigo, 167 bytes
-4 bytes graças a TimmyD
Os meses de saída são números na sequência de retorno, delimitados por vírgulas
Ungolfed
fonte
void q(int y){for(int m=1;m<13;m++){if((int)new DateTime(y,m,DateTime.DaysInMonth(y,m)).DayOfWeek==1){Console.WriteLine(m);}}}
;) Além disso, seria mais curto para lançar oDayOfWeek
queint
do que seria para lançar oint
paraDayOfWeek
Action<int>
para salvar alguns bytesRuby, 54 + 6 = 60 bytes
6 bytes para
-rdate
na linha de comando para obter a classe Date da biblioteca padrão.Explicação: muito simples, graças à excelente
Date
classe do Ruby stdlib . Não apenas possui métodos comomonday?
,tuesday?
etc, o construtor terá números negativos para qualquer campo do ano passado para significar 'conte esse campo de trás para frente a partir do final do período representado pelo campo anterior'.$*
é uma abreviação deARGV
, então$*[0]
é uma maneira rápida de obter o primeiro argumento de linha de comando.fonte
PHP, 84 bytes
Meu primeiro código de golfe. Este é o PHP mais curto até agora nesta questão.
Edição: parece não funcionar para o ano 1. Vou ter que descobrir o porquê, mas agora eu tenho que ir.
fonte
for(;$m++<12;)strftime("%w",strtotime($argv[1]+($m/12^0)."-".($m%12+1)."-1"))!=2?:print"$m ";
R,
106999583787774 bytesA sequência dos últimos dias de cada mês é dada por
seq(as.Date(paste0(x,-2,-1)),,'m',12)-1
:paste0
força -2 e -1 a caracteres. Se ax
era 2016, por exemplo,paste0(x,-2,-1)
dá"2016-2-1"
, que é então convertido para o 01 de fevereiro de 2016 poras.Date
.seq
aplicado a um objeto POSIXct ou Date éseq(from, to , by, length.out)
: aquito
não é fornecido,by
é fornecido como'm'
correspondido'month'
graças à correspondência parcial e,length.out
é claro , é 12.-1
nos dá o último dia dos 12 meses a partir de janeiro do ano em questão.Casos de teste:
Versão antiga em 95 bytes, exibindo os nomes dos meses em vez de apenas seus números:
fonte
seq
um método paraDate
-objects e isso resolve o problema deas.Date
não tratar anos acima10000
na minha resposta excluída.seq.Date
eseq.POSIXt
são bastante impressionantes: eles podem até processar comandos comoseq(time1, time2, by="10 min")
ouseq(date1, date2, by="quarter")
. Muito útil ao plotar uma série temporal.Japt, 24 bytes
Teste online! Gera uma matriz de números,
false
no lugar de meses que não terminam na segunda-feira.Houve um erro no intérprete que não me permitiu usar
Ð
no corpo da função£
. Após a correção do bug e outra adição de recurso, são 18 bytes no commit atual:fonte
Java,
143129 bytesIsso usa a nova API de horário do Java 8.
Saída
Observe que cada linha tem um espaço extra no final.
Ungolfed and testing
Barbear
DayOfWeek::ordinal
para comparar com uma constante numérica em vez da constante enum.Obrigado @ TimmyD pela idéia geral, se não a solução exata! ;-)
fonte
getValue()
Porém, ele possui um método que salvaria alguns bytes.ordinal()
economiza mais 1 byte em comparação comgetValue()
, mesmo que seja sugerido que nunca o use.GNU awk, 80 bytes
Exemplo
fonte