Soluciones F # conocidas dentro de 140 caracteres , y este es un problema del Código Rosetta .
Resultado requerido en stdout o en una variable de cadena para el año 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 se solicitó, 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
Y 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
Planteado porque las fechas parecen poner de manifiesto la incomodidad en la mayoría de los idiomas. Más que permitir bibliotecas de fechas, ¡espero verlas! Pero si es externo al idioma base, declare en el nombre de la publicación (por ejemplo, C # + Jon Skeet's NodaTime).
Aclaraciones:
- Rango de años 1900 a 3015
- Calendario Gregoriano
- Si de otra manera importa, lo que sea convencional para el Reino Unido / Londres
- Un programa que toma un interruptor de línea de comando o stdin está bien, produciendo el resultado en stdout
- Una función que toma un valor para el año y devuelve una cadena también está bien.
Lagunas estándar excluidas . Estamos ansiosos por las soluciones APL, J, K y ver algunas nuevas bibliotecas de fechas.
Respuestas:
Dyalog APL con cal de dfns , 19 bytes
¡Mejor tarde que nunca!
Solicitudes para el año, devuelve la lista de fechas en formato aaaa md .
⎕
solicitar entrada numérica y dejar que ese sea el argumento izquierdo para el{
...}¨
función anónima (que se encuentra a continuación) aplicada a cada uno de⍳12
los números del 1 al 12 (los meses)La función anónima anterior es la siguiente:
⍺⍵,
anteponer los argumentos izquierdo y derecho (es decir, año y mes) a2↑
los dos primeros personajes de⊢⌿
la fila más baja decal
el calendario para⍺⍵
argumento izquierdo y argumento derecho (año y mes)TryAPL en línea:
Regrese a esta página después de hacer clic aquí para importar
cal
y sus dependencias.Haga clic aquí para ejecutar los casos de prueba.
fuente
+
-
<
≤
=
≥
≠
⌈
y⌊
funcionan con objetos de fecha .Net .Rubí, 91 + 6 = 97
Funciona bastante bien.
select(&:sunday?)
es bonito y, sorprendentemente,*' '
formatea todo por sí mismo.fuente
chunk
lugar degroup_by
.Bash 4.x + ncal, 57
Si los separadores de nueva línea están bien en lugar de espacios, entonces podemos eliminar el
-n
interruptor y el espacio final de laecho
declaración. Y supongo que todavía funcionará sin el shebang, así que también lo eliminé:Script original (73 bytes):
Uso:
Nota: Las versiones Bash anteriores a la 4.0 omitirán los ceros iniciales de los meses. Esto se puede solucionar con la adición de 5 caracteres cambiando
{01..12}
a`seq -w 1 12)`
. Además,tail -c-3
puede causar problemas en algunos sistemas donde la salida dencal
incluye espacios finales, pero no conozco ninguno que lo haga.fuente
`…`
lugar de un buen hábito$(…)
.#!/bin/bash
para jugar golf.IBM DFSORT,
113 líneas de 71, 72 u 80 caracteresLas dos respuestas con formato de salida en columna han resistido la prueba del tiempo. Eso me da un "bucle", más o menos, en que en OUTFIL REPEAT = copia el registro actual que muchas veces.
Una técnica diferente para llegar al valor, que parece más larga pero más corta, ya que no puedo encontrar ninguna forma incondicional de lidiar con el duodécimo registro en el año siguiente, y hacerlo condicional significa que incluye
IFTHEN=(WHEN=
, dos veces y algunas otras cosas. Gane en los cambios (el primer mes es la forma más sencilla de hacerlo) pierda mucho en las rotondas (requisitos de sintaxis particulares).Esto utiliza una función incorporada (todas las funciones en DFSORT están incorporadas) para encontrar el último día del mes. Luego agrega un día (función) para llegar al primero del mes siguiente y usa la función PREVDSUN para obtener el domingo anterior (que siempre será el último domingo del mes anterior, como antes).
Al convertir el año (entrada) en una fecha válida, se usa un número de secuencia de dos dígitos para el mes, y ese valor también se copia para el día, ya que el punto de partida no importa mientras sea válido, ya que somos después del último día del mes inicialmente:
5,2
es más corto queC'01'
.Aquí está el detalle:
OPTION COPY - copia el archivo de entrada a la salida
OUTFIL: para permitir múltiples archivos de salida, con diferente selección y formato, producir informes formateados. Se usa con preferencia al más corto
INREC
debido al uso deREPEAT=
.REPETIR = 12 - produce 12 copias de cada registro. En este ejemplo, solo puede haber un registro de entrada (a diferencia de la versión anterior) debido a SEQNUM.
5: comienza en la columna 5 del registro.
SEQNUM, 2, ZD: número de secuencia, por defecto comienza en uno, dos dígitos, "decimal con zona" (para sin signo, que serán, igual que el carácter).
1,8 - copie los bytes 1 para la longitud 8 en la ubicación actual (9). Esto se debe a que el Y4T necesita ver ese 8, de lo contrario se usará un formato de fecha diferente.
Y4T: fecha de formato ccyymmdd (debido a los 8 que se encuentran inmediatamente delante).
LASTDAYM - Último día del mes (también posible de semana, trimestre y año).
TOJUL = - conversión de fecha de salida para funciones de fecha (TOJUL es un carácter menos que TOGREG)
9,7 - ahora que tiene 7 largos, Y4T será CCYYDDD.
ADDDAYS: agrega una cantidad de días, ajustándose automáticamente si entra en el siguiente mes / año (también podría ser ADDMONS y ADDYEARS)
PREVDSUN: aparece la fecha juliana, se ubica el domingo anterior, TOGREG para obtener el formato de salida correcto, con el separador "-" (podría ser cualquier cosa que desee como separador)
12X: espacios en blanco para aclarar el desorden que nos ha permitido hacerlo de una manera tan corta
El resultado de lo anterior, para 2014, es:
Se requiere algo para decirle al SORT qué hacer. No hay defecto.
OPTION COPY
es el más corto,SORT FIELDS=COPY
es equivalente pero más largo.El trabajo en sí lo hizo esta vez
OUTFIL
(para permitir el uso de REPEAT). Podría decirse que el código de trabajo es cualquiera de 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) o 138 (70 + 68) (excluyendo los espacios en blanco iniciales, la continuación forzada y los espacios en blanco finales).Dado que el receptor tendría que saber lo que está haciendo, creo que puedo decir que el código DFSORT para enumerar el último domingo de cada mes para cualquier año desde 1900 (se ejecutará desde el año 0001, pero estoy evitando la investigación como bien) hasta 9999 (aunque DFSORT admite años hasta 9999, la solución anterior no funcionaría en el año 9999 ya que la duodécima fecha entra en el año siguiente) se puede tuitear.
¿Por qué el código es tan largo si hay funciones incorporadas especialmente adecuadas?
Las definiciones de campo son efímeras. Un campo solo se define como una ubicación particular dentro de los datos (que es un registro) para su uso inmediato. En otras palabras, los campos no se definen como tales, sino que se definen para cada uso y solo para su uso. Las funciones de fecha necesitan saber qué (de muchos) formatos de fecha se utilizan para la fuente, y la salida debe estar en un formato de fecha, por lo que debe especificarse.
Ahora que tenemos una cita juliana ... ¿Por confirmar?
Necesita algo
JCL
Y un archivo de entrada (otra línea de JCL y tres elementos de datos integrados):
Produce:
Realmente funcionará hasta el año 9999.
DFSORT es el producto de clasificación de mainframe de IBM. Los datos se pueden manipular, pero dado que la clasificación es clave y los tipos son a menudo grandes y de larga duración, las tarjetas de control DFSORT no tienen construcciones de bucle, por lo que no podemos poner un SORT en un bucle. Hace las cosas un poco largas para tareas como Golf.
Por qué publicar la respuesta, es porque DFSORT tiene una
PREVDday
función. Así que el último domingo de un mes es fácil. Es el domingo anterior (PREVDSUN) al primer día del mes siguiente.También fue divertido hacerlo dentro de un "operando" (OVERLAY), un poco como hacerlo todo dentro
sprintf
o similar.Aquí no tiene golf:
Si bien no es un abuso, no sería habitual tratar de agrupar todo esto en un REVESTIMIENTO, y hay algunas cosas aparentemente innecesarias que se necesitan para permitir que todo entre en un REVESTIMIENTO. Hay espacio para jugar al golf, pero como solo eliminaría una línea como máximo, no estoy tentado.
El INREC se procesa para cada registro.
OVERLAY permite cambiar el contenido de un registro existente. Si el registro se extiende más allá de su longitud en el proceso, eso no es un problema.
1,4 es el año entrante. Tiene un literal de 0201 adjunto, y luego los sucesivos 1,8s lo repiten 11 veces para dar una tirada larga de 96 bytes,
El duodécimo año en el registro actual extendido obtiene 1 agregado y su mes se convierte en 1 (enero).
Los 10 meses restantes se cambian de 3 a 11.
Luego hay 12, en orden inverso (debido a la REVESTIMIENTO) de este tipo de cosas:
El n: es un número de columna en el registro. La X inserta un espacio en blanco. 89,8 toma los datos de esa columna / longitud, Y4T los trata como una fecha CCYYMMDD, PREVDSUM funciona el domingo anterior, TOGREG = Y4T (-) los emite como una fecha gregoriana CCYY-MM-DD.
Debido a que obtienes basura si la fuente y el objetivo de una parte particular de un OVERLAY se superponen destructivamente, el
11:X,18,120,6X)
reordenamiento final y enmascara un poco de desorden.Los manuales y documentos se pueden encontrar en: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 , e incluye la Guía de programación de aplicaciones DFSORT de más de 900 páginas.
Al igual que con todos los productos de IBM, todos los manuales están disponibles de forma gratuita (excepto una cantidad insoportablemente pequeña de costosos que solo un número muy pequeño de personas en el mundo fingiría entender).
Todas las tarjetas de control DFSORT deben comenzar con un espacio en blanco. La columna 72 solo se usa para la continuación (cualquier no en blanco servirá, pero * es convencional). La columna 72 es seguida por un área de número de secuencia que se ignora, haciendo que cada registro sea de 80 bytes.
Otro par de soluciones por venir, tal vez.
fuente
Bash, 63 bytes
Salida:
fuente
for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}
- 60 bytes-v
param todate
es específico de la fecha BSD. Entonces esto funciona en OSX, pero no en la mayoría de Linux, tal vez eso debería indicarse en la respuesta.Python 2 - 189 bytes
Ingrese la fecha a través de STDIN.
Todavía se puede hacer mucho más golf. El programa se va un poco por la borda, solo por diversión:
Notas
zfill
se necesita durante años debido al rango de entrada, ni días, ya que siempre serán mayores de 20Python 2 - 106 bytes
La solución no tan divertida:
calendar.monthrange
devuelve dos números: el día de la semana en que comienza el mes (w
) y el número de días en el mes (n
). La solución es un poco contradictoria debido a una captura: ¡el día de la semana devuelto comienza a las 0 para el lunes , no para el domingo! Sin embargo, esto se compensa con el hecho de quen
está basado en 1.fuente
$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
JavaScript (ES6) 155
145Editar problemas de zona horaria fija Podría ser más corto si se hace recursivo. Tal vez.
fuente
new Date(y,0,++i,9)
. Además, esto falla para los años bisiestos de 2100 y superiores, ya que JS no tiene información sobre esos años bisiestos y, por lo tanto, no tiene ningunoFeb 29
en los años bisiestos para 2100 y superiores.new Date(2014,0,26,9)
fue un domingo dando laISO
cadena correcta , asígetDay()
como0
.JavaScript, ES6,
222 219199 bytesNo vi ninguna respuesta de JavaScript en el wiki de rosetta.
Aquí vamos:
Esto crea una función
S
que devuelve una cadena con la salida deseada. La función también se encarga de los años bisiestos.Debido a ES6, esto solo funciona en una versión más reciente de Firefox.
Gracias a apsillers por el consejo que lo redujo a 200 bytes
Encuentre la versión no protegida a continuación como un fragmento de pila que puede ejecutar aquí mismo:
fuente
2100
salida 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
es incorrecta.Rebol - 120116
80 7976Ungolfed + algunas anotaciones:
Ejemplo del cálculo del domingo en la consola Rebol:
fuente
CJam,
122102 bytesEsto no usa ninguna forma de biblioteca de fechas. También se puede jugar mucho al golf, creo.
Pruébalo aquí.
fuente
R, 128 caracteres
Con saltos de línea:
fuente
C # 255
Sin golf
Editar: modificado para imprimir solo el último domingo :)
fuente
q, 67
fuente
"¡Oh, no, él otra vez!"
Java -
259246 bytesVersión sin golf:
Uso:
Salida:
Sin embargo, otra respuesta "pongamos una respuesta de Java solo por diversión". Oh bien. Pero, al menos, como te molestaste en llegar a este punto de mi respuesta, intentaré aburrirte un poco más y explicarte mi razonamiento.
El método
g
recibe el año deseado y, para cada mes, crea unGregorianCalendar
objeto (los meses van de 0 a 11). Luego, el primeroc.set
establece el día de la semana como domingo y el segundo declara que queremos la última semana del mes, como se ve en la documentación oficial . LosSystem.out.println
imprime la fecha de que el domingo (si es que estábamos haciendo este derecho, el año se imprimiría comoc.get(c.YEAR)
, pero utilizandoy
de nuevo afeita 13 caracteres), el mes tiene que ser formateado para añadir un cero a la izquierda de enero a septiembre (y la el valor se incrementa porque, bueno, los meses aquí se representan 0-11) y se imprime el día del último domingo. Y este procedimiento se repite durante los otros once meses.fuente
C #,
212, 237Con saltos de línea
Salida para 2014
fuente
C # 171
Función que devuelve una cadena.
Sin golf
fuente
C # 194
usando Linq:
Sin golf
Salida
fuente
Mathematica - 171
Envuelto en una función anónima, devuelve la cadena
Primero Mathica Golf. Siento que podría reducirse sustancialmente.
fuente
VB-192
Podría ser peor ^^
Mi segunda y última entrada (no creo que pueda hacerlo más pequeño)
142
fuente
Rubí 76
Utiliza un parámetro de línea de comandos
ruby sundays.rb 1900
. Utiliza la biblioteca de fechas.fuente