Dado un año y un mes, averigüe el porcentaje de días de trabajo en dicho mes. Los días de trabajo son de lunes a viernes sin tener en cuenta los días festivos u otras cosas especiales. Se utiliza el calendario gregoriano.
Entrada
Un año y mes en formato ISO 8601 (AAAA-MM). El año siempre tiene cuatro dígitos, el mes siempre tiene dos dígitos. El año dado no será antes de 1582.
Salida
La producción es el porcentaje de días de trabajo (según la definición anterior) en el mes dado, redondeado a un número entero. No hay signos de porcentaje o dígitos fraccionarios.
Muestra 1
Input Output
2010-05 68
Muestra 2
Input Output
2010-06 73
Muestra 3
Input Output
1920-10 68
Muestra 4
Input Output
2817-12 68
Ha pasado una semana, se ha aceptado una respuesta. Para los curiosos, el tamaño de las presentaciones que obtuvimos en nuestro concurso:
129 - Z shell
174 - VB.NET
222 - C
233 - C
300 - C
Además de nuestras propias soluciones (sin clasificar):
75 - PowerShell
93 - Ruby
112 - Shell Bourne
echo 100
Respuestas:
Perl de 64 bits, 67
68Perl 5.10 o posterior, ejecuta con
perl -E 'code here'
operl -M5.010 filename
Concesiones al tamaño del código:
date
producción no comienza con una S mayúscula. Ejecutar enLC_ALL=C
caso de duda.2> /dev/null
si está molesto.Por alguna razón, mi versión deRequiere una compilación de 64 bitsdate
2817-12 considera un mes no válido. ¡Quién sabía, el nuevo apocalipsis de GNU se debe!date
para fechas posteriores a 2038. (Gracias Joey)fuente
PHP - 135
Lo hice en PHP porque tuve un problema similar que tratar hace unos días.
(Algo) Más legible, y sin avisos sobre las constantes que se utilizan como cadenas:
Esto es posible gracias a un algoritmo muy simple para calcular la cantidad de días de trabajo en un mes: verifique el día de la semana del 29, 30 y 31 (si esas fechas existen), y agregue 20.
fuente
-R
, y este enfoque puede reducirse a 86 bytes (63.7%):$a="2333211";echo.5+min(-8+$m=date(t,$t=strtotime($argn)),20+$a[date(w,$t)])/$m*100|0;
vea los pasos de golf.<?=.5+min(-8+$m=date(t,$t=strtotime($argn)),20+(5886>>date(w,$t)*2&3))/$m*100|0;
Python 152 Personajes
fuente
Bash + coreutils, 82 bytes
fuente
Windows PowerShell, 80
fuente
[int]
realmente redondea? Tiendo a creer que suena.[int]1.5
y[int]2.5
ceda el paso2
. Este comportamiento exacto a menudo causa problemas en tareas en las que es necesaria la división en pisos (que luego requiere un extra[Math]::Floor()
), pero en este caso no duele y »redondear a incluso« solo se aplica a números que terminan en los.5
que no puede suceder aquí.[int]
en PowerShell suele ser más una conversión que un elenco :-). Cosas como[int[]][char[]]'abc'
también funcionan que no puedes conseguir en muchos otros idiomas.$input
->$args
guarda un byte.D: 186 caracteres
Más legible:
fuente
Python - 142
Gracias a fR0DDY por el bit de calendario.
fuente
Rubí,
124119111Requiere Ruby 1.9 debido a las salpicaduras del año y mes antes del argumento -1 "día" y
?-
para"-"
. Para Ruby 1.8, debemos agregar 2 caracteres:Editar : afeita cinco personajes según la ayuda de @ Dogbert.
Editar : afeita ocho personajes más según la ayuda de @ steenslag.
fuente
'-'
podría escribirse como?-
en Ruby 1.9PHP 5.2, 88 bytes
Aunque ya utilicé la solución de Zneak hasta 85 bytes (acabo de encontrar uno más), aquí está la mía:
dudo que pueda exprimir otros tres bytes aquí.
toma entrada de STDIN: Ejecutar con
echo <yyyy>-<mm> | php -nR '<code>'
.La cadena
$a
asigna los días por mes (date(t)
) y el día de la semana del primer día del mes (date(N)
: lunes = 1, domingo = 7) al porcentaje de días de trabajo-67;strtotime
convierte la entrada a una marca de tiempo UNIX; el resto del código hace el hashing.+1 byte para PHP 5 anterior: reemplazar
N
conw
y$a=_...;
con$a="..."
.Otros +3 bytes para PHP 4: insertar
.-1
después$argn
.-5 bytes para PHP 5.5 o posterior (es posterior al desafío):
elimine todo antes
echo
y reemplácelo$a
con"4444444255555236666304777411"
.fuente
%7
lugar de%28
.Rebol -
118113Sin golf:
fuente
C #, 158 bytes
Método anónimo que devuelve el porcentaje requerido.
Programa completo con método no comentado y comentado y casos de prueba:
Función alternativa, que agrega valores negativos al número de días hábiles, cambiando el signo en la devolución sin costo adicional de bytes:
fuente
Oracle SQL, 110 bytes
Funciona suponiendo que los datos de entrada se almacenan en una tabla al usar
date
el tipo de datos, por ejemplofuente
APL (Dyalog Unicode) , SBCS de 55 bytes
Función de prefijo tácito anónimo.
⊂
adjunte la fecha para tratarlo como un todo(2 5)2{
...}¨
aplique la siguiente función sobre eso, pero con los argumentos de la izquierda[2,5]
y2
:⎕CY'dfns'
copie la biblioteca "dfns"⍵⊣
descartar el informe a favor de la fecha' '@5⊢
reemplazar el quinto carácter (-
) con un espacio⍎
ejecutar eso para obtener una lista de dos elementoscal
llamar a la función de calendario en ese' ',
anteponer una columna de espacios a ese¯2⌽
rotar las dos últimas columnas (sábado) al frente⍺↓
suelte el número de argumento de la izquierda de filas (2, encabezados) y columnas (si se especifica; 5 = Sat + Sun)↓
dividir la matriz en una lista de líneas⍕
formato (se aplana con inserción de doble espacio)⍎
ejecutar (convierte los días restantes en una lista numérica plana)≢
cuenta esos2÷/
divide cada par (solo hay uno)100×
multiplicar por cien.5+
agregue la mitad⌊
sueloPruébalo en línea!
fuente
Perl 6 , 78 bytes
Pruébalo en línea!
fuente