Primer miércoles
Su tarea es contar la cantidad de miércoles que cae en un primer día del mes en un año en particular. Por ejemplo, 7-13-16
es un primer miércoles. Por coherencia, utilice el calendario gregoriano para todas las fechas.
Entrada
La entrada a su programa / función será un año (por ejemplo 2016
) y es flexible. El año será un número entero entre 1912 y 2233 inclusive.
Salida
La salida también es flexible y debe ser el número de miércoles principales (por ejemplo 18
).
Tanteo
Este es el código de golf, ¡el código más corto en bytes gana!
Casos de prueba
entrada -> salida
--------------------
1912 -> 19
1914 -> 16
1984 -> 17
1996 -> 19
2063 -> 19
2150 -> 16
2199 - > 18
2233 -> 18
Python 2,
95936867 bytes¡Gracias a @Josay por jugar golf en 1 byte!
Pruébalo en Ideone .
fuente
0x10ea2c8dbb06c5619
lugar de19501370182350951961
.big_constant//5**long_expression
pero ¿cómo diablos vienes con esa constante y esa expresión? Es una locura: DBrain-Flak ,
6588,2310,2308, 2290 bytesPrimero lo primero, no escribí casi el 100% de este programa, lo que probablemente se evidencia por el enorme tamaño del programa. La mayor parte de este código fue escrito por mi propio algoritmo de golf Brain-Flak . Junto con un script de python adicional que escribí para indicarlo en la dirección correcta.
Pruébalo en línea!
Si bien este programa es bastante largo para el golf de código, realmente es bastante corto para Brain-Flak. Actualmente, el récord mundial para la división de enteros supera los 1000 bytes.
Explicación
El algoritmo es bastante simple. Debido a que hay un número limitado de años disponibles (321), simplemente empuja las respuestas en orden inverso debajo de la entrada y utiliza un algoritmo de búsqueda para encontrar la respuesta correcta. Si bien la codificación rígida de todas las 321 posibilidades puede parecer bastante ineficiente con una tarea tan compleja como esta y un lenguaje tan esotérico como el ataque cerebral, puede ser la mejor solución. (Planeo averiguarlo la próxima semana).
Dado que la mayoría de los 321 números son aproximadamente 18 en promedio y difieren muy poco de un año a otro en lugar de presionar todos los números individualmente, presiono el primer año (2233) normalmente y luego simplemente duplico y cambio el valor un poco para cada año después. De esta manera, en lugar de pagar para empujar ~ 18 por los 321 años, solo pago por empujar ~ 2 por cada año.
Una vez que todas las respuestas han sido enviadas, resta 1912 de la entrada
({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])
(Esto puede ser subóptimo, reescribí el optimizador para omitir ciertos valores que creía que no serían óptimos porque los números de codificación rígida son un proceso súper exponencial y su ejecución hasta su finalización puede tener Tomado unos días).A continuación, resta uno del primer elemento y aparece el segundo elemento hasta que el resultado llega a cero,
{({}[()]<{}>)}
.Aparece el cero
{}
y todos los elementos debajo del elemento superior({}<{{}}>)
.fuente
n
ym
cuáles tienen longitudesk
yl
, supongon+m
que tendrían longitudk+l
? ¿Qué hay den*m
?n*m
seríak+4m-4
ol+4n-4
. Esto se debe a que la multiplicación está codificada. Primero presionamos losn
m-1
tiempos. Para hacer esto, necesitamosk
símbolos para expresarn
y2m-2
símbolos para expresar los impulsos (cada impulso es 2 símbolos). Luego hacemos estallarm-1
tiempos, lo que nos cuesta un adicional2m-2
(los estallidos cuestan 2 símbolos también). Esto suma ak+4m-4
. También podemos multiplicarm*n
(propiedad conmutativa) para obtenerl+4n-4
. El resultado será el más corto de los dos.+1
cuesta 2,*2
cuesta 4,*3
cuesta 8,*4
cuesta 12, que es más caro que*2*2
, por lo que no vale la pena (de los números por debajo de 1000 solo encontré 10 que no usaron*2
: 1, 2, 3 , 4, 5, 9, 15, 27, 45, 135). Para 1912, lo mejor que pude hacer fue((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*2
con una longitud de 52.Bash + utilidades comunes, 39
Toma el año de entrada como un parámetro de línea de comando. Por lo general, envía mensajes como este a STDERR: creo que esto es legal según esta meta respuesta :
Si desea suprimir explícitamente la salida STDERR, puede hacerlo para obtener una puntuación de 43 :
fuente
gd_GB.utf8
, donde todos los nombres de los días se abrevianDi
.Octava, 86 bytes
Esto no es rápido, de ninguna manera. Pero ese no es realmente el objetivo de un código de golf, ¿verdad?
Octave puede rastrear las fechas por "número de fecha": número de días transcurridos donde el 1 de enero, 0 es el día 1. Según esta medida, el 3 de enero de 1912 (el primer miércoles de nuestro conjunto) es el día 698,346. Comience allí e repita cada 7 días (todos los miércoles) hasta el final de 2233, y agregue 1 si el año es el año objetivo Y el mes-día es primo.
fuente
Python 2.7,
166,165, 150 bytesCiertamente hay margen de mejora aquí. Soy bastante nuevo en el golf en Python. Esto usa el
datetime
módulo. Recorre todos los días del año agregando uno a un acumulador si cumple con el criterio. Luego imprime el resultado. La mayor parte del trabajo pesado está en el módulo, por lo que el código puede ser bastante delgado.Un byte guardado gracias a Morgan Thrapp y 15 bytes guardados por Pietu1998 .
fuente
n%x==0
an%x<1
.-1
no es necesario ya querange
el índice final es exclusivo. Además, puede convertir elfilter
a un generador.[0for x in range(2,n)if n%x<1]
any(...)
o enall(...)
lugar denot filter(...)
.all
puede ahorrar un montón.c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
J, 44 bytes
Acabo de descubrir que J tiene incorporados para la manipulación de citas.
Uso
Se utilizan comandos adicionales para formatear múltiples entradas / salidas.
Explicación
fuente
PowerShell v3 +,
9995 bytesEnfoque de fuerza bruta
Toma datos
$y
, recorre desde1
hasta12
, almacena el mes temporalmente en$m
, luego recorre cada primo desde2
hasta31
. Para cada uno de ellos, construimos unoGet-Date
de ese día en particular, luego seleccionamos solo aquellos conDayOfWeek
-eq
ual a3
(es decir, miércoles). Encapsula que todo en un parens para formular una matriz, y toma el.Count
mismo.Alternativamente, enfoque matemático -
PowerShell v3 +, 105 bytes
Termina siendo solo un pelo más largo que el enfoque de la fuerza bruta, pero lo estoy incluyendo aquí, ya que puede ser beneficioso para otros.
Nuevamente toma entrada
$y
como el año. Esta vez estamos realizando operaciones estrictamente matemáticas basadas en el primer día del año. Primero calculamos qué día de la semana es ese y lo almacenamos$a
para su uso posterior. Eso se indexa en la primera matriz, lo que nos da el número que generalmente es correcto. Tenemos que agregar a eso un segundo índice basado en si es un año bisiesto potencial, si es domingo, martes, miércoles o jueves, y en función de qué año es.Esto se basa en la siguiente observación. La primera columna es qué día de la semana es el 1 de enero, la segunda es la salida habitual. A menos que el año sea uno de los números intermedios, entonces es el número en pares. La columna final describe cómo funciona la indexación% 5.
Nota: Ambos asumen que
en-us
es la configuración actual de PowerShell para la información de cultura / fecha. Es posible que el formato de fecha y elDayOfWeek
número deban ajustarse en consecuencia para otras variantes de cultivo.fuente
Ruby, 83 + 15 (
-rdate -rprime
banderas) = 98 bytesPruébalo en línea! (Los módulos importados están en línea porque idk si puedo usar banderas en repl.it)
fuente
JavaScript ES6,
187182181179 bytes179 Intercambiado en un ciclo for por el ciclo while
181 Compactado el ternario
182 combinado los dos bucles
187
fuente
Lote, 248 bytes.
Explicación:
d
es el día de la semana, con el0
lunes, que es convenientemente el 1 de enero de 1912.l
es un indicador de si el año es bisiesto,1
para 1912. Luego pasamos de 1913 al año de entrada, actualizando el día de semana y recalculando la bandera del año bisiesto a medida que avanzamos. Finalmente, utilizamos la bandera del año bisiesto y el día de la semana para indexar en lo que efectivamente es una gran declaración de cambio para determinarn
, el número de miércoles principales. Sinn
embargo, establecer 20 y disminuirlo con caída es más barato que usar la lógica de control de flujo, pero el resultado es que si el 1 de enero de un año no bisiesto es jueves o domingo, entonces hay 16 miércoles principales y así sucesivamente para los otros casos .fuente
JavaScript ES6
206203199197195183182179No es el más corto, pero lo mejor que puedo hacer por ahora ... bienvenidas sugerencias de golf ...
Cambios:
3>=x?3-x:10-x
a6-(x+10)%7
, guardar: 3 cambios en las ubicaciones de declaración;x=w.getDay();z=D(w,6-(x+10)%7)
conz=D(w,6-(w.getDay()+10)%7)
, ahorro: 4Z=0
de lafor
declaración de bucle a fecha y se introdujoz=D(w,6-(x+10)%7)
en elfor
bucle para ordenar, guardando: 2w=new Date(a,Z=0,1)
declaración desplazada enfor
bucle, fusionándose con law
declaración existente , guardando: 2+!!
a~~
para reducir y todavía convertirp(d=1)
deNaN
a0
, permitiendo que la función Prime Test siga funcionando, ahorrando: 1W
, se redefinió elfor
bucle: retrocediendo desde el 31 de diciembre, escribiendo elDate
objeto como una variable separada, luego reescribió elfor
bucle en laeval
llamada; ahorro 3.@PandaCoder, ¡te estoy alcanzando, amigo!
fuente
R,
149147 bytesPruébalo en Ideone .
fuente
Groovy, 126
Groovy no tiene validación de números primos, también tuvo que construir eso.
fuente