Mi jefe necesita saber cuánto tiempo lleva sumar dos enteros. Pero no me gusta trabajar los fines de semana, y creo que es justo que mi código tampoco. El problema es que el jefe es un tipo exigente y cree que debería dedicar más tiempo para asegurarme de que el tiempo que lleva se mantenga igual, y sé que va a verificar si el código funciona correctamente.
¿Me puede escribir un programa corto que:
- Acepta dos enteros y devuelve el resultado correcto de la suma y multiplica el tiempo que lleva realizar la suma; esta vez debe ser plausible y basarse en el tiempo de ejecución del código. Sin embargo, si necesita escabullirse algunas operaciones entre el código cronometrado que hace que se ejecute un poco más de lo que debería, esto está permitido. Sin embargo, no puede simplemente emitir un tiempo falso.
- No funciona los fines de semana en los códigos. de hora local (no puede devolver un resultado incorrecto, el código debe romperse, fallar o no ejecutarse)
- No es obvio de inmediato por qué no funciona los fines de semana
Sé que el primer criterio es un poco extraño, pero quería asegurarme de que las personas pudieran importar bibliotecas de fecha / hora si fuera necesario, sin levantar sospechas sobre el criterio 3. Sin embargo, estoy seguro de que hay algunas personas inteligentes, por lo que hay que usar 10 caracteres. cualquiera que pueda hacer esto, sin usar funciones de calendario de bibliotecas de fechas estándar
Con respecto a las 'bibliotecas estándar de fecha / hora'
Los ejemplos de bibliotecas estándar de fecha y hora incluyen pitones datetime
, date
biblioteca de objetos javascript java.util.Date
y similares. Las funciones para calcular timedeltas para la ejecución, como el timeit
módulo de pitones , no violarían estos criterios, ya que el jefe espera que el código se cronometre. En algunos casos, estas bibliotecas deberán importarse para acceder a las funciones de tiempo, por lo que está permitido llamar a funciones que devuelven el tiempo desde el inicio de la época actual como un entero, pero las funciones de calendario que devuelven objetos estructurados de fecha y hora que pueden proporcionar horas, días, etc ... no están permitidos.
editar: Con respecto a la pregunta de Dan04, el código debe cumplir con estos 4 criterios sobre cuándo funcionará o no. También debe explicar cómo su código verifica la hora, ya que la holgura del lunes por la mañana / viernes por la noche debería brindar alguna oportunidad para algunas formas creativas de acortar el código.
- no debe funcionar desde las 00:00:00 del sábado por la mañana hasta las 23:59:59 del domingo por la noche.
- debe trabajar siempre desde las 06:00:00 del lunes por la mañana hasta las 19:59:59 del viernes por la noche
- puede funcionar o no desde las 00:00:00 del lunes por la mañana hasta las 5:59:59 del lunes por la mañana
- puede funcionar o no desde las 20:00:00 del viernes por la noche hasta las 23:59:59 del viernes por la mañana
edit2: Por obvio inmediatamente debe cumplir con los siguientes 3 criterios:
- No debe llamar a una función que llamó
DayOfWeek
(o similar), sin usarla para calcular el tiempo de la función. - No debe usar sábado o domingo ni sus abreviaturas en inglés.
- No debe usar Sat o Sun (o en sus mayúsculas y minúsculas) sin una variable identificada idéntica que no se usa para determinar el día de la semana o al determinar si el código debe ejecutarse.
fuente
Respuestas:
Rebmu : 17 ( , ofuscado) o 30 no ofuscado
Rebmu está específicamente diseñado para jugar golf de código mientras es legible (para aquellos que obtienen el "truco"), por lo que la regla de ofuscación está en contra de su principio. Pero:
Funciona todo el día de lunes a viernes:
... pero los fines de semana simplemente no hace nada:
Explicación:
El uso de las letras mayúsculas sin nota y sin notar son palabras separadas, y la falta de una letra mayúscula principal significa que no estamos haciendo una palabra establecida, obtenemos el abreviado Rebol:
Sin abreviar, con lo que terminas es:
Los números de fecha en Rebol se numeran 1 para el lunes hasta 7 para el domingo. La forma más alfabetizada de obtener un día de la semana de un día laborable es decir,
d/weekday
pero también puede hacerlod/7
. Mi solución preferida sin cambiar las cosas solo para adaptarme a este problema sería más como:Pero si tuviera que actualizar el vocabulario para la aplicación general a este estilo de problema, que probablemente surja con la frecuencia suficiente para no querer caer en Rebol detallado cada vez, probablemente haría que MON thru SUN sea 1-7) y abrevie AHORA DÍA DE LA SEMANA, momento en el que probablemente se parecería más a ...
Notas
Como de costumbre, puede hacer que "el programa" sea un poco más corto si permite que las entradas se pasen a Rebmu como argumentos y simplemente acepte el resultado de la evaluación (aquí, ya sea un valor de tipo de tiempo o NINGUNO) sin imprimirlo:
Además, el tiempo delta, las fechas, la generación de imágenes y una gran cantidad de cosas ya están incluidas en el ejecutable de medio megabyte y cero instalación de Rebol .
fuente
Golfscript,
5156-10 = 46http://golfscript.apphb.com/?c=OycxIDUnCiciI3tUaW1lLm5vdy50b19pfSInLn5%2BQH4rQH5%2BMiQtQDYwIDU%2FOS8vKCg3JSgsKT1dYA%3D%3D
Satisface las tres condiciones y no utiliza ninguna de las funciones estándar de la biblioteca, excepto lo que es necesario para obtener la hora actual. Por lo tanto, creo que califico para el bono.
En cuanto a los criterios de ofuscación, aunque satisface la letra de la ley, no parece muy inocente. Es bastante obvio que algo sucede con las constantes mágicas de 60 y 7. Desafortunadamente, cualquier tipo de ofuscación va a levantar algunas cejas.
Entrada: dos enteros separados por espacios en blanco
Salida: un literal de matriz golfscript: dos enteros (suma, tiempo en ms) separados por un espacio y rodeados por corchetes.
ejemplo:
'"#{Time.now.to_i}"'
es una cadena de golfscript que contiene un literal de cadena de golfscript que contiene un bloque ejecutable Ruby para recuperar la hora actual. La pila ahora contiene la entrada en la parte inferior y la receta de tiempo en la parte superior..~~
clona la receta del tiempo y la evalúa dos veces. La primera evaluación convierte una cadena de cadena en una cadena numérica ejecutando la sección ruby. La segunda evaluación lo convierte en un número. La pila ahora contiene (desde abajo) la entrada, la receta de tiempo y la hora de inicio@~+
saca la entrada a la parte superior, la evalúa y realiza la suma. La pila ahora contiene la receta de tiempo, la hora de inicio y la suma.@);' "'+~~
saca la receta del tiempo, cambia'"'
a' "'
(vea la discusión a continuación) y la evalúa dos veces . La pila ahora contiene la hora de inicio, la suma y la hora de finalización.2$-
clona el tiempo de inicio en la parte superior y lo resta del tiempo de finalización. La pila ahora contiene el tiempo de inicio, la suma y la diferencia de tiempo.@86400/
tira el tiempo de inicio a la cima y lo convierte de segundos a días.((7%(
disminuye los días desde el inicio de la época dos veces (era jueves, queremos el sábado), toma el módulo 7 y disminuye una vez más. Mapas de fin de semana a -1 y 0, mapa de lunes a viernes a 1..5.,)=
crea una tabla de enteros de ese tamaño. Esto está bien: una matriz de tamaño negativo está vacía. Luego toma su último elemento. Desafortunadamente, algunos intérpretes aún no fallan. En cambio, aparecen un cero, que es seguro descartar. Entonces, en lugar de descartarlo, lo usamos como un índice para esa matriz. Tomar el índice nulo finalmente bloquea al intérprete, pero tomar un elemento fuera de los límites está bien: no se empuja nada a la pila. En este caso, el acceso a la matriz siempre está fuera de los límites, por lo que no tenemos nada que descartar.]`
agarra la pila y la formatea como una matriz de golfscript.fuente
JavaScript
Utiliza esta utilidad:
Y aquí está la función real:
Espero que no haya sido obvio de inmediato ...
fuente