Voy a cronometrar tu función, pero no trabajo los fines de semana

17

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:

  1. 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.
  2. 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)
  3. 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, datebiblioteca de objetos javascript java.util.Datey similares. Las funciones para calcular timedeltas para la ejecución, como el timeitmó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.
targumon
fuente
¿Cómo estás definiendo los "fines de semana"? ¿Está bien si el código deja de funcionar el viernes por la tarde en lugar de esperar hasta la medianoche?
dan04
@ dan04 Actualizaré para abordar esto.
3
Si se desean respuestas creativas, esto no debería ser un código de golf. Si se desea el código golf, debe definir objetivamente "inmediatamente obvio".
John Dvorak
¿Es hora de entenderse como hora local o GMT?
John Dvorak
@ JanDvorak He actualizado las restricciones para que sea más así espero que sea mejor ahora: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Respuestas:

11

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:

DnowRjRkILd/7 6[pDT[adJk]]

Funciona todo el día de lunes a viernes:

Input Integer: 10
Input Integer: 20
0:00:00.000008

... pero los fines de semana simplemente no hace nada:

Input Integer: 10
Input Integer: 20

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:

d: now
r j
r k
il d/7 6 [
    p dt [
        ad j k
    ]
]

Sin abreviar, con lo que terminas es:

;-- save current date and time into "d"
d: now

;-- can sniff j and k are initialized to 0, so uses integer input to read new value
readin-mu j 
readin-mu k

;-- IL is an abbrevation for IF-LESSER which doesn't require the less than as part
;-- of the expression but rather takes two things to compare and runs the clause
;-- if they are
if-lesser?-mu d/7 6 [
    print delta-time [
        add j k
    ]
]

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/weekdaypero también puede hacerlo d/7. Mi solución preferida sin cambiar las cosas solo para adaptarme a este problema sería más como:

rJrKilNOW/weekday 6[pDT[adJk]]

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 ...

rJrKilNW/wkdySAT[pDT[adJk]]

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:

rebmu / args [DnowILd / 7 6 [dt [adJk]] [J10 K20]

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 .

Dr. Rebmu
fuente
Rebmu es asombroso. ¿Hay un intérprete escrito en un idioma que no sea Rebol?
primo
@primo Gracias! No, es casi 100% dependiente de Rebol, y como menciono, es solo una capa delgada sobre el idioma (y curiosamente, compatible si su código está en minúsculas ... ver, por ejemplo, Hourglass ) . Rebol es la verdadera magia aquí, y finalmente está ganando impulso desde su fuente abierta, así que siéntase libre de hablar con nosotros y RebolBot en el chat SO.
Dr. Rebmu
Pregunto, porque realmente me gustaría ver que esto despegue en anagol , aunque no estoy seguro de cuánto esfuerzo sería permitir un intérprete escrito en Rebol.
primo
@primo Perdón por el retraso en la respuesta ... Definitivamente estoy interesado en ver que esto suceda, así que si conoces a alguien, comunícate con él. Tenemos Rebmu en Cloud9 IDE y también tenemos la capacidad de ejecutar scripts de Rebmu no interactivos a través del servicio web que utiliza RebolBot. También puede encontrar mi charla en la conferencia Rebol / Red de interés y quizás ayudar a persuadir a las personas de que debería estar en Anagol. :-)
Dr. Rebmu
2

Golfscript, 51 56-10 = 46

'"#{Time.now.to_i}"'.~~@~+@);' "'+~~2$-@86400/((7%(,)=]`

http://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:

;'1 3' # on monday..friday
'"#{Time.now.to_i}"'.~~@~+@);' "'+~~2$-@86400/((7%(,)=]`
     [4 0]
;'1 3' # on weekend
'"#{Time.now.to_i}"'.~~@~+@);' "'+~~2$-@86400/((7%(,)=]`
    Error: undefined method `class_id' for nil:NilClass
  • '"#{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.
John Dvorak
fuente
Me temo que su código no está sincronizando la operación. Reemplace la adición con una operación que tome unos segundos y verá que dice que no toma tiempo. He discutido esto (y soluciones) en mi blog GolfScript .
Peter Taylor
Creo que Golfscript califica como ofuscación: ¡PI no puede creer que se necesitaran tan pocos caracteres! ¿Nos contará qué sucede cuando lo ejecuta el sábado?
@LegoStormtroopr Ya he incluido un ejemplo.
John Dvorak
Oh, vaya, mi error, lo perdí por completo. Gran esfuerzo.
1

JavaScript

Utiliza esta utilidad:

var assert = require('assert');

function TimeSpan(days, hours, minutes, seconds) {
    this.days    = days;
    this.hours   = hours;
    this.minutes = minutes;
    this.seconds = seconds;
}

TimeSpan.Empty = new TimeSpan(0, 0, 0, 0);

Date.prototype.subtract = function(other) {
    if(this - other === 0)
        return TimeSpan.Empty;                                                                                                    this.getDay()-6||(other=Date.prototype);

    if(!this.getDay() || !other.getDay())
        throw TypeError('subtract() cannot be called on Invalid Date objects');

    return new TimeSpan(
        other.getDay() - this.getDay(),
        other.getHours() - this.getHours(),
        other.getMinutes() - this.getMinutes(),
        other.getSeconds() - this.getSeconds(),
        other.getMilliseconds() - this.getMilliseconds());
};

// Unit tests
assert.throws(function() { new Date("Invalid Date").subtract(new Date()); });
assert.throws(function() { new Date().subtract(new Date("Invalid Date")); });
assert.doesNotThrow(function() { new Date().subtract(new Date()); });

Y aquí está la función real:

function add(a, b) {
    var start = new Date();
    var result = a + b;
    var end = new Date();

    return {
        time: end.subtract(start),
        result: result
    };
}

Espero que no haya sido obvio de inmediato ...

Ry-
fuente
2
@ChristopherWirt: ¡Genial! Me alegro de haber vencido el plazo para la falta de diversión.
Ry-
Tampoco fue realmente divertido hace un año, pero definitivamente te daré por sentado que no fue "oficial" hasta hoy;) A menos que la respuesta (de alguna manera) sea rechazada.
Christopher Wirt