Je chronomètre ta fonction, mais je ne travaille pas le week-end

17

Mon patron a besoin de savoir combien de temps il faut pour additionner deux entiers. Mais, je n'aime pas travailler le week-end, et je pense qu'il est juste que mon code ne le soit pas non plus. Le problème est que le patron est un gars exigeant et pense que je devrais y mettre du temps pour m'assurer que le temps qu'il faut reste le même, et je sais qu'il va vérifier si le code fonctionne correctement.

Pouvez-vous m'écrire un petit programme qui:

  1. Accepte deux nombres entiers et retourne le résultat correct de l'addition et indique combien de temps il faut pour effectuer l'ajout - cette fois doit être plausible et basée sur l'exécution du code. Cependant, si vous avez besoin de faufiler certaines opérations entre le code temporisé qui le fait fonctionner un peu plus longtemps que prévu, cela est autorisé. Cependant, vous ne pouvez pas simplement afficher un faux temps.
  2. Ne fonctionne pas le week-end dans les codes en heure locale (il ne peut pas simplement renvoyer un résultat erroné, le code doit se casser, faire une erreur ou échouer autrement)
  3. N'est pas immédiatement évident pourquoi cela ne fonctionne pas le week-end

Je sais que le premier critère est un peu bizarre, mais je voulais m'assurer que les gens pouvaient importer des bibliothèques de date / heure si nécessaire, sans élever la suspicion pour le critère 3. Cependant, je suis sûr qu'il y a des gens intelligents, donc -10 caractères à toute personne qui peut le faire, sans utiliser les fonctions de calendrier des bibliothèques de dates standard

Concernant les «bibliothèques standard de date / heure»

Des exemples de bibliothèques de datetime standard incluent les pythons datetime, la datebibliothèque d'objets javascript java.util.Dateet similaires. Les fonctions de calcul des timedeltas à exécuter telles que le timeitmodule pythons ne violeraient pas ces critères car le patron s'attend à ce que le code soit chronométré. Dans certains cas, ces bibliothèques devront être importées pour accéder à toutes les fonctions de temps, de sorte qu'il est autorisé d'appeler des fonctions qui renvoient l'heure depuis le début de l'époque actuelle sous forme d'entier, mais les fonctions de calendrier qui renvoient des objets datetime structurés qui peuvent donner des informations distinctes les heures, les jours, etc ... ne sont pas autorisés.

edit: Concernant la question de Dan04, le code doit répondre à ces 4 critères concernant quand il fonctionnera ou ne fonctionnera pas. Vous devez également expliquer comment votre code vérifie l'heure, car le relâchement du lundi matin / vendredi soir devrait donner l'occasion de trouver des moyens créatifs de raccourcir le code.

  • ne doit pas travailler de 00:00:00 samedi matin à 23:59:59 dimanche soir.
  • doit toujours travailler du 06:00:00 du lundi matin au 19:59:59 du vendredi soir
  • peut travailler ou ne pas fonctionner de 00:00:00 lundi matin à 5:59:59 lundi matin
  • peut travailler ou ne pas fonctionner de 20:00:00 vendredi soir à 23:59:59 vendredi soir matin

edit2: Par immédiatement évident, il doit répondre aux 3 critères suivants:

  • Ne doit pas appeler une fonction qui a appelé DayOfWeek(ou similaire), sans l'utiliser pour calculer l'heure de la fonction.
  • Ne doit pas utiliser samedi ou dimanche ou leurs abréviations en anglais.
  • Ne doit pas utiliser Sat ou Sun (ou dans leurs majuscules) sans une variable nommée identique non utilisée pour déterminer le jour de la semaine ou pour déterminer si le code doit s'exécuter.
targumon
la source
Comment définissez-vous les "week-ends"? Est-ce correct si le code cesse de fonctionner le vendredi après-midi au lieu d'attendre jusqu'à minuit?
dan04
@ dan04 Je vais mettre à jour pour résoudre ce problème.
3
si des réponses créatives sont souhaitées, cela ne devrait pas être un golf de code. Si le golf de code est souhaité, vous devez définir objectivement "immédiatement évident".
John Dvorak
l'heure est-elle à comprendre comme heure locale ou GMT?
John Dvorak
@JanDvorak J'ai mis à jour les restrictions pour ressembler davantage à cet espoir que c'est mieux maintenant: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Réponses:

11

Rebmu : 17 ( 27-10 , obscurci) ou 30 non obscurci

Rebmu est spécialement conçu pour jouer au golf à code tout en étant lisible (pour ceux qui obtiennent le "truc"), donc la règle d'obscurcissement est contraire à son principe. Mais:

DnowRjRkILd/7 6[pDT[adJk]]

Il fonctionne toute la journée en semaine:

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

... mais le week-end, cela ne fait rien:

Input Integer: 10
Input Integer: 20

Explication:

L'utilisation des lettres majuscules imperturbables et remarquées sont des mots distincts, et l'absence de ligne majuscule principale signifie que nous ne faisons pas un mot d'ensemble, nous obtenons le Rebol abrégé:

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

En l'abrégeant, vous vous retrouvez avec:

;-- 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
    ]
]

Les numéros de date dans Rebol sont numérotés de 1 pour le lundi à 7 pour le dimanche. La façon la plus alphabétisée de sortir un jour de la semaine d'un jour de semaine est de dire, d/weekdaymais vous pouvez aussi l'obtenir avec d/7. Ma solution préférée sans changer les choses juste pour s'adapter à ce problème serait plus comme:

rJrKilNOW/weekday 6[pDT[adJk]]

Mais si je mettais à jour le vocabulaire pour une application générale à ce type de problème, qu'il revient probablement assez souvent pour ne pas vouloir passer à travers Rebol verbeux à chaque fois, je ferais probablement de MON à SUN de 1 à 7) et d'abréger MAINTENANT WEEKDAY, à quel point cela ressemblerait probablement plus à ...

rJrKilNW/wkdySAT[pDT[adJk]]

Remarques

Comme d'habitude, vous pouvez raccourcir "le programme" lui-même si vous autorisez les entrées à être transmises à Rebmu en tant qu'arguments et acceptez simplement le résultat de l'évaluation (ici, soit une valeur de type time ou NONE) sans l'imprimer:

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

De plus, le delta-time, les dates, la génération d'images et un nombre fou de choses sont déjà inclus dans l' exécutable demi-mégaoctet à installation zéro de Rebol .

Dr. Rebmu
la source
Rebmu est incroyable. Y a-t-il un interprète écrit dans une langue autre que Rebol?
primo
@primo Merci! Non, cela dépend à peu près à 100% de Rebol, et comme je le mentionne, c'est juste une fine couche sur la langue (et, chose intéressante, compatible si votre code est tout en minuscules ... voir par exemple Hourglass ) . Rebol est la vraie magie ici, et enfin prend de l'ampleur depuis son open-sourcing, alors n'hésitez pas à venir nous parler et RebolBot sur le chat SO.
Dr Rebmu
Je demande, parce que j'aimerais vraiment que cela décolle sur anagol , bien que je ne sois pas sûr de combien d'efforts ce serait de permettre à un interprète écrit en Rebol.
primo
@primo Désolé pour le retard dans la réponse ... Je suis vraiment intéressé de voir cela se produire, donc si vous connaissez quelqu'un, contactez-le. Nous avons Rebmu sur Cloud9 IDE et nous avons également la possibilité d'exécuter des scripts Rebmu non interactifs via le service Web utilisé par RebolBot. Vous pourriez également trouver mon discours à la conférence d'intérêt Rebol / Red et peut-être aider à persuader les gens qu'il devrait être sur 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

Répond aux trois conditions et n'utilise aucune des fonctions de bibliothèque standard, sauf ce qui est nécessaire pour obtenir l'heure actuelle. Ainsi, je crois que je suis admissible au bonus.

En ce qui concerne les critères d'obscurcissement - bien qu'il satisfasse à la lettre de la loi, il ne semble pas très innocent. Il est assez évident qu'il se passe quelque chose avec les constantes magiques de 60 et 7. Malheureusement, tout type d'obscurcissement va soulever des sourcils.

Entrée: deux entiers séparés par des espaces

Sortie: un littéral de tableau golfscript - deux entiers (somme, temps en ms) séparés par un espace et entourés de crochets.

exemple:

;'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}"'est une chaîne de golfscript contenant un littéral de chaîne de golfscript contenant un bloc exécutable Ruby pour récupérer l'heure actuelle. La pile contient maintenant l'entrée en bas et la recette de temps en haut.
  • .~~clone la recette de temps et l'évalue deux fois. La première évaluation transforme une chaîne de caractères en chaîne numérique en exécutant la section ruby. La deuxième évaluation le transforme en nombre. La pile contient maintenant (en bas) l'entrée, la recette de temps et l'heure de début
  • @~+extrait l'entrée vers le haut, l'évalue et effectue l'addition. La pile contient maintenant la recette de temps, l'heure de début et la somme.
  • @);' "'+~~sort la recette de temps, les changements '"'de ' "'(voir la discussion ci - dessous) et double-évalues. La pile contient maintenant l'heure de début, la somme et l'heure de fin.
  • 2$-clone l'heure de début vers le haut et la soustrait de l'heure de fin. La pile contient maintenant l'heure de début, la somme et le décalage horaire.
  • @86400/ tire l'heure de début vers le haut et la convertit de quelques secondes en jours.
  • ((7%(décrémente les jours depuis le début de l'époque deux fois (c'était jeudi, nous voulons samedi), prend modulo 7 et décrémente une fois de plus. Cartes de week-end à -1 et 0, cartes de semaine à 1..5.
  • ,)=crée une table d'entiers de cette taille. C'est très bien - un tableau de taille négative est vide. Ensuite, il prend son dernier élément. Malheureusement, certains interprètes ne plantent pas encore. Au lieu de cela, ils sautent à zéro - ce qui est sûr à jeter. Ainsi, au lieu de les éliminer, nous les utilisons comme index de ce tableau. Prendre le neuvième index bloque finalement l'interpréteur, mais prendre un élément hors limites est très bien - rien n'est poussé vers la pile. Dans ce cas, l'accès au tableau est toujours hors limites, nous n'avons donc rien à écarter.
  • ]` saisit la pile et la formate comme un tableau de golfscript.
John Dvorak
la source
Je crains que votre code ne chronomètre pas réellement l'opération. Remplacez l'addition par une opération qui prend quelques secondes et vous verrez qu'elle prétend ne pas prendre de temps. J'ai discuté de cela (et de solutions) dans mon blog GolfScript .
Peter Taylor
Je pense que Golfscript est qualifié d'obscurcissement: PI ne peut pas croire qu'il a fallu si peu de caractères! Pouvez-vous nous dire ce qui se passe lorsque vous le lancez samedi?
@LegoStormtroopr J'ai déjà inclus un exemple.
John Dvorak
Oh oups, mon erreur, je l'ai complètement raté. Grand effort.
1

Javascript

Il utilise cet utilitaire:

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()); });

Et voici la fonction réelle:

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

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

J'espère que ce n'était pas immédiatement évident…

Ry-
la source
2
@ChristopherWirt: Cool! Heureux d'avoir battu le délai pour impunité.
Ry-
Ce n'était pas vraiment drôle il y a un an non plus, mais je vais certainement vous dire que ce n'était pas "officiel" jusqu'à aujourd'hui;) À moins que la réponse (en quelque sorte) ne soit rejetée.
Christopher Wirt du