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>
Respuestas:
Dyalog APL con dfns 's cal , Versión 15.0: 22; Versión 16.0: 19 bytes
La función cal viene con una instalación predeterminada, solo ingrese
)copy dfns
.Versión 15.0:
∊⎕{⍵/⍨2=≢⍎⊢⌿cal⍺⍵}¨⍳12
∊
alistarse (aplanar)⎕{
...}¨
entrada numérica como argumento izquierdo para la siguiente función anónima, tomando cada uno de los valores del lado derecho como argumento correcto a su vez⍵/⍨
el argumento if (da una lista vacía si no)2=
dos (a saber, domingo y lunes) es igual a≢
la cuenta de⍎
los números en⊢⌿
la fila más baja decal
el calendario para⍺⍵
año argumento izquierdo, mes argumento derecho, siendo este último⍳12
1 a 12Versión 16.0:
⍸2=⎕{≢⍎⊢⌿cal⍺⍵}¨⍳12
⍸
los índices donde2=
dos iguales (a saber, domingo y lunes)⎕{
...}¨
entrada numérica como argumento izquierdo para la siguiente función anónima, tomando cada uno de los valores del lado derecho como argumento correcto a su vez≢
la cuenta de⍎
los números en⊢⌿
la fila más baja decal
el calendario para⍺⍵
año argumento izquierdo, mes argumento derecho, siendo este último⍳12
1 a 12fuente
JavaScript (Firefox 30+),
11210910395 bytesMira ma, no hay complementos!
Aquí hay una versión ES6 de 107 bytes:
Y aquí está mi intento anterior,
123113 bytes de ES6:Explicación
El día de la semana de un año en particular se calcula así:
En otras palabras:
y
.y
(y>>2
).y
(y/100|0
).y
; esto es 1/4 dey/100|0
, por lo que usamos*3/4|0
.Luego modulamos el resultado por 7. Si dejamos
0
el domingo medio,1
el lunes medio, etc., el resultado corresponde al día de la semana del 31 de diciembre de ese año. Por lo tanto, para diciembre, queremos verificar si el resultado es1
. Esto nos da el último carácter de la cadena.El último día de noviembre es 31 días antes del último día de diciembre. Esto significa que para que el último día de noviembre sea lunes, el 31 de diciembre debe ser a
(1 + 31) % 7 = 4
= jueves.Este procedimiento se repite hasta que regresemos a marzo (a
3
). Ya sea que haya o no un día bisiesto, el último día de febrero es 31 días antes del último día de marzo, por lo que también podemos calcularlo (es(3 + 31) % 7 = 6
). La parte difícil es encontrar el valor correcto para enero:(6 + 29) % 7 = 0
.(6 + 28) % 7 = 6
.Podemos calcular si es o no un año bisiesto con el siguiente fragmento:
Esto da
0
siy
no es un año bisiesto y un número entero positivo de lo contrario. Esto nos lleva apara calcular el día de enero. Sin embargo, podemos hacerlo mejor al revertir las condiciones:
Como el resultado falso es siempre 0 de todos modos, podemos reducirlo a
salvando un byte precioso más.
Al poner todo junto, recorremos cada char en la cadena, verificando si cada uno es igual al día de la semana del 31 de diciembre. Mantenemos los índices de los que coinciden, devolviendo esta matriz al final. Y así es como se hacen los cálculos del año bisiesto sin elementos integrados.
fuente
!(y%4)*y%100|!(y%400)
está. cada año divisible por 4, excepto no años divisibles por 100, a menos que también sea divisible por 400y+(y>>2)+(z=y/25>>2)+(z>>2)
aún te ahorre un byte.(y*5/4-(y/100)*3/4)
.JavaScript (Firefox 30-57),
6765646361 bytesGuardado
246 bytes gracias a @ETHproductions.Se guardó otro byte al mostrar los meses en orden inverso.fuente
.keys()
:y=>[for(_ of(m=0,Array(12)))if(new Date(y+400,++m).getDay()==2)m]
Array(12)
completo:y=>[for(_ of(m=0,1e11+""))if(new Date(y+400,++m).getDay()==2)m]
MySQL,
183134129106 bytesReemplazar
2016
con el año deseado. Correr.Rev. 2: usó la
help_topics
tabla en la instalación predeterminada en lugar de crear una tabla temporal.Rev.3: adoptó el truco de aross
-
y noté que también puedo omitir las comillas"-1"
.Sin embargo,
-1
se requiere en MySQL: necesito una fecha completa.Rev.4: La restricción
m BETWEEN 1 AND 12
podría hacerse comom>0 AND m<13
(-6), pero no es necesaria en absoluto: los valores no válidos serán ignorados; Las advertencias se contarán pero no se enumerarán.fuente
FROM help_topic
sinmysql.
trabajo? No lo he intentadoUSE mysql;
La base de datos correcta debe seleccionarse de alguna manera.Perl, 64 bytes
Incluye +1 para
-n
Dar entrada en STDIN:
mon.pl
:fuente
Lotes,
160152 bytesPuerto de la respuesta de @ ETHproduction. Con abreviaturas de mes para
197189 bytes:fuente
J,
483433 bytesGuardado 15 bytes con ayuda de @ Adám .
Utiliza el calendario integrado para generar una serie de cadenas que representan los meses, luego analiza cada cadena para determinar si el último lunes es el último día del mes. Produce cada mes como el número de mes de cada uno. Es decir,
Jan = 0
,Feb = 1
, ...,Dec = 11
.La salida de
calendar
esUso
Explicación
fuente
calendar
es un conjunto de 12 cuadros donde cada cuadro contiene un conjunto de caracteres 2DI.7=;#&.>".&.>,&.>_2{.&.>calendar 2016
si combina todos los "sub-abiertos", debería poder hacerlo bastante corto.Mathematica,
6257 bytesFunción anónima. Toma un número como entrada y devuelve una lista de listas de elementos de un solo elemento como salida. Sinceramente, ya no estoy seguro de cómo funciona.
fuente
Perl + cal, 46 bytes
Ejemplo:
fuente
Java 7
186 182172 bytesGracias a Kevin por guardar 4 bytes
Gracias a @cliffroot por guardar 10 bytes
sin golf
Esta versión es proporcionada por @cliffroot ( 168 bytes )
muestra de salida
fuente
n%4==0
an%4<1
;n%400==0
an%400<1
yint c=...;int[]b=...,a=...
aint c=...,b[]=...,a[]=...
.b
ya
se puede definir en laint
parte como esta: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;}
pocos bytes guardadosb
ab[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3}
yi+30
ai+28
por 2 bytes másint[]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áticas con fechas no es tan simple como me gustaría.
Pruébalo en línea
Mismo largo:
fuente
MATL , 21 bytes
Los meses se muestran como números.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Esto utiliza funciones integradas de conversión de fecha. Para el año dado, prueba qué último día del mes es el lunes.
En lugar de especificar explícitamente el último día del mes
k
(que puede ser 28, 29, 30 o 31), especificamos el0
día del mesk+1
, que es equivalente y no depende del mes o año.fuente
Bash + utilidades GNU, 56 bytes
Parece requerir la
date
versión 8.25. La versión 8.23 en Ideone no es suficiente.fuente
Excel, 537 bytes
Porque, ya sabes, ¡Excel!
Toma año de entrada en A1. Devuelve la lista hexadecimal de meses; 1 = enero, C = diciembre. Como cada mes es un solo dígito, no se necesita separador.
Ejemplo: A1 contiene 2016. B1 contiene la fórmula anterior y se muestra como
2A
, lo que significa febrero y octubre.fuente
PHP, 109
180159byteswhile
afor
como ahora es un solo año (de nuevo, gracias Titus)Viejo 2
Admite todos los años desde punto hasta 10000, también eliminó una advertencia de var indefinida que no conocía en una PC. Sí, es más largo que la versión anterior, pero es más robusto.
Viejo 1
Si se ejecuta en Windows o en un sistema de 32 bits, habrá el temido error 2038, pero en un sistema Linux de 64 bits está bien.
Intenté usar lo
date("t"...
que está destinado a representar la última fecha del mes dado, pero los resultados no coincidieron con los mencionados anteriormente en este hilo.fuente
$z
, no hay comillasN
) -1: enfor
lugar dewhile
-43 : tome la entrada como se solicitó en lugar de recorrer los años -3: enjoin
lugar deimplode
-16: salida directa: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 si insiste en no tener una coma final:echo$o=$o?",$m":$m;
PHP, 92 bytes
marque 12 veces 1 mes después del primer día de un año. Si es así, es el día anterior al último día del mes que es lunes.
fuente
C, 214 bytes
Compilar
Sin golf
Con créditos a los gurús relevantes.
Michael Keith y Tom Craver para el Programa C encontrarán la fecha dada para el día de la semana .
Collin Biedenkapp para preguntas y respuestas: ¿Cómo puedo averiguar cuál es el último día del mes?
fuente
if
otra dirección, para tener suelse
regreso31
, y por lo tanto puede eliminar la gran==
cadena?C, 119 bytes
Utiliza una tabla que contiene el desplazamiento de los días de la semana del último día de cada mes para un año bisiesto, codificado en una palabra firmada de 32 bits utilizando la base 7. Si no es un año bisiesto, sumamos 1 al desplazamiento de enero (como puede ver,
y&3||y%25<1&&y&15
se usa para verificar años sin días bisiestos). Luego, simplemente recorremos cada mes y verificamos si su último día es un lunes. Bastante simple en realidad, no hay trucos ni trucos feos. Aquí está un poco ignorado:Podría volver a visitar esto para reescribirlo como una función para guardar algunos caracteres. El
printf
también ocupa demasiado espacio ...fuente
PHP,
96957671696461 bytesNota: los números de año deben rellenarse con 4 caracteres, como
0070
.Corre así:
Explicación
Itera de -1 a -12. Crear fecha usando mktime, día
0
(el último día del mes anterior) y mes2..13
. Formatee la fecha como número de día y, si el resultado es 1, imprima el número actual. El signo negativo-
se usa como delimitador.¡El bicho del milenio ataca de nuevo!
Tenga en cuenta que con esta versión, el rango
0..100
se interpreta como1970..2069
. Esto no es un problema para el rango0..69
, ya que las semanas tienen un patrón que se repite cada 400 años (146097 días, exactamente 20871 semanas), pero para el rango70..99
, 1900 se agrega al número del año, que no es un múltiplo de 400. Para corregir ese problema SOLO para números de 30 años en un rango de 10k, la forma más simple es agregar 400 al número del año para evitar la interpretación de 2 dígitos ( +4 bytes ):Ajustes
!~-$i
para comparar$i
con1
(-1
binario negado es0
, lógicamente negado estrue
; cualquier otro número esfalse
), por lo que no se necesitan paréntesislast day ofYYYY-m
notación para crear la fechadate
y enstrtotime
lugar dedate_create
YYYY-m
parte de la fechamktime
lugar destrtotime
. Volvió a usar el día0
(mktime
también es compatible con el mes 13, entonces0-13
==31-12
)-R
para poner a$argn
disposiciónfuente
mktime
elimina la necesidad de rellenar el año, ¿no?mktime
es contra-intuitivo , porque los argumentos se toman comoINT
s. Eso significa que no puede rellenar el año ... así que todo en el rango0..100
se interpreta como1970..2070
. Eso no es problema para el rango0..70
porque 400 años tienen un número exacto de semanas (por lo que los calendarios repiten el patrón cada 400 años), pero70..99
agrega 1900 (¡no un múltiplo de 400!). Por lo tanto, nuevo ver. tiene un error$argv[1]+400
... a menos que los días de semana de Julian y Gregorian difieran.Excel,
4289796 bytesEntrada en A1. Salida de valores hexadecimales no separados (enero = 0, diciembre = B)
Se agregaron 10 bytes ("+2000") para permitir el manejo de fechas anteriores a 1990.
Guardado 11 bytes gracias a @ Engineer Toast .
Primer intento (428 bytes), tomando prestado mucho de la solución de @ Adám .
fuente
297 -> May
regresa6
con esta fórmula. ¿No deberían ser 4?1776
da en7A
lugar de solo8
para septiembre.Date(A1,3,0)
lugar deEOMONTH(DATE(A1,2,1),0)
Bash + cal, 58 bytes
fuente
cal
(por ejemplo, OSX), pero esté atento a los espacios finales en GNUcal
.Python 2, 94 bytes
repl.it
Una función sin nombre, toma un año entero, genera una lista de los números de mes
[1-12]
.También intenté superar el recuento de bytes con aritmética sin éxito (110 bytes). :
Una función sin nombre que devuelve una lista de valores booleanos que representan si los meses [enero-diciembre] terminan en un lunes
fuente
Java 7,
200249 bytesEn Java,
GregorianCalendar
es una mezcla entre un calendario gregoriano y juliano. Debido a esto, el año1
dio resultados incorrectos. CambiarCalendar c=Calendar.getInstance();
aGregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));
arregla esto forzando el uso del calendario gregoriano solamente. Gracias a @JonSkeet en stackoverflow.com por explicarme esto.Ungolfed y código de prueba:
Pruébalo aquí
Salida:
fuente
C # 6C #,171167135 bytes-32 bytes gracias a Shebang
Imprimir meses como números; con espacio delimitado; con espacio posterior. Ahora esta respuesta también funciona para versiones anteriores de C #.
Antiguo, 167 bytes
-4 bytes gracias a TimmyD
Los meses de salida son números en la cadena de retorno, delimitados por comas
Sin golf
fuente
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);}}}
) Además, sería más corto emitir elDayOfWeek
toint
de lo que sería lanzar elint
toDayOfWeek
Action<int>
guardar algunos bytesRuby, 54 + 6 = 60 bytes
6 bytes
-rdate
en la línea de comando para obtener la clase Date de la biblioteca estándar.Explicación: bastante sencillo gracias a la gran
Date
clase de Ruby stdlib . No solo tiene métodos comomonday?
,tuesday?
etc., el constructor tomará números negativos para cualquier campo el año pasado para significar 'contar este campo hacia atrás desde el final del período representado por el campo anterior'.$*
es una forma abreviada deARGV
, por lo que$*[0]
es una forma rápida de obtener el primer argumento de línea de comando.fuente
PHP, 84 bytes
Mi primer código de golf. Este es el PHP más corto hasta ahora en esta pregunta.
EDITAR: no parece funcionar para el año 1. Tendré que averiguar por qué, pero ahora tengo que irme.
fuente
for(;$m++<12;)strftime("%w",strtotime($argv[1]+($m/12^0)."-".($m%12+1)."-1"))!=2?:print"$m ";
R,
106999583787774 bytesLa secuencia de los últimos días de cada mes viene dada por
seq(as.Date(paste0(x,-2,-1)),,'m',12)-1
:paste0
coacciona -2 y -1 a los personajes. Six
fue 2016, por ejemplo,paste0(x,-2,-1)
da"2016-2-1"
cuál se convierte al 1 de febrero de 2016 poras.Date
.seq
aplicado a un POSIXct o un objeto Date esseq(from, to , by, length.out)
: aquíto
no se da,by
se da como el'm'
que coincide'month'
con una coincidencia parcial y,length.out
por supuesto , es 12.-1
nos da entonces el último día de los 12 meses a partir de enero del año en cuestión.Casos de prueba:
Versión anterior a 95 bytes, que muestra los nombres de los meses en lugar de solo sus números:
fuente
seq
tener un método paraDate
-objects y esto resuelve el problema deas.Date
no manejar los años anteriores10000
en mi respuesta eliminada.seq.Date
yseq.POSIXt
son bastante impresionantes: incluso pueden procesar comandos comoseq(time1, time2, by="10 min")
oseq(date1, date2, by="quarter")
. Muy útil al trazar una serie temporal.Japt, 24 bytes
¡Pruébalo en línea! Emite una matriz de números, con
false
en lugar de meses que no terminan en lunes.Hubo un error en el intérprete que no me permitió usarlo
Ð
en el cuerpo de la función£
. Después de la corrección de errores y otra característica adicional, esto es 18 bytes en la confirmación actual:fuente
Java,
143129 bytesEsto usa la nueva API de tiempo de Java 8.
Salida
Tenga en cuenta que cada línea tiene un espacio adicional al final.
Sin golf y probando
Afeitado
DayOfWeek::ordinal
para comparar con una constante numérica en lugar de la constante enum.¡Gracias @TimmyD por la idea general, si no la solución exacta! ;-)
fuente
getValue()
método que ahorraría unos pocos bytes.ordinal()
ahorra 1 byte más en comparación congetValue()
, aunque se sugiere que nunca lo use.GNU awk, 80 bytes
Ejemplo
fuente