Ich werde Ihre Veranstaltung zeitlich festlegen, aber ich arbeite nicht am Wochenende

17

Mein Chef muss wissen, wie lange es dauert, zwei ganze Zahlen zu addieren. Aber ich mag es nicht, am Wochenende zu arbeiten, und ich denke, es ist fair, dass mein Code es auch nicht tut. Das Problem ist, dass der Chef ein anspruchsvoller Typ ist und meint, ich sollte etwas Zeit investieren, um sicherzustellen, dass die dafür benötigte Zeit gleich bleibt, und ich weiß, dass er prüfen wird, ob der Code richtig funktioniert.

Können Sie mir ein kurzes Programm schreiben, das:

  1. Akzeptiert zwei Ganzzahlen und gibt das korrekte Ergebnis der Addition sowie die Zeit zurück, die für die Ausführung der Addition erforderlich ist. Diese Zeit sollte plausibel sein und auf der Laufzeit des Codes basieren. Wenn Sie jedoch einige Vorgänge zwischen dem zeitgesteuerten Code schleichen müssen, die ihn etwas länger laufen lassen, als dies zulässig sein sollte. Sie können jedoch nicht einfach eine falsche Zeit ausgeben.
  2. Funktioniert nicht an Wochenenden in der Ortszeit des Codes (es kann nicht einfach ein falsches Ergebnis zurückgeben, der Code muss brechen, fehlerhaft sein oder anderweitig nicht ausgeführt werden)
  3. Ist nicht sofort klar, warum es am Wochenende nicht funktioniert

Ich weiß, dass das erste Kriterium etwas seltsam ist, aber ich wollte sicherstellen, dass Benutzer bei Bedarf Datums- / Zeitbibliotheken importieren können, ohne den Verdacht auf Kriterium 3 zu erregen Jeder, der dies tun kann, ohne Kalenderfunktionen aus Standard-Datumsbibliotheken zu verwenden

Zu 'Standard-Datums- / Uhrzeitbibliotheken'

Beispiele für Standard-Datetime-Bibliotheken sind Pythons datetime, JavaScript- dateObjektbibliotheken java.util.Dateund dergleichen. Funktionen zum Berechnen von Timedeltas für die Ausführung wie das Pythons- timeitModul würden diese Kriterien nicht verletzen, da der Chef erwartet, dass der Code zeitlich festgelegt wird. In einigen Fällen müssen diese Bibliotheken importiert werden, um auf Zeitfunktionen zugreifen zu können. Daher ist es zulässig, Funktionen, die die Zeit seit dem Beginn der aktuellen Epoche zurückgeben, als Ganzzahl aufzurufen, aber Kalenderfunktionen, die strukturierte datetime-Objekte zurückgeben, die separate Werte angeben können Stunden, Tage usw. sind nicht erlaubt.

Bearbeiten: In Bezug auf die Frage von Dan04 muss der Code diese 4 Kriterien erfüllen, um zu bestimmen, wann er funktioniert oder nicht. Sie sollten auch erläutern, wie Ihr Code die Uhrzeit überprüft, da die Pause am Montagmorgen / Freitagabend Gelegenheit bieten sollte, den Code auf kreative Weise zu verkürzen.

  • muss nicht von 00:00:00 Samstagmorgen bis 23:59:59 Sonntagabend arbeiten.
  • muss immer von 06:00:00 Montagmorgen bis 19:59:59 Freitagabend arbeiten
  • kann von Montagmorgen um 00:00 Uhr bis Montagmorgen um 5:59:59 Uhr arbeiten oder nicht
  • kann von 20:00:00 Freitag Abend bis 23:59:59 Freitag Nacht Morgen entweder arbeiten oder nicht arbeiten

edit2: Durch sofort offensichtlich muss es die folgenden 3 Kriterien erfüllen:

  • Darf keine aufgerufene DayOfWeek(oder ähnliche) Funktion aufrufen , ohne sie zur Berechnung der Zeit der Funktion zu verwenden.
  • Darf weder Samstag noch Sonntag oder deren Abkürzungen in Englisch verwenden.
  • Darf nicht Sat oder Sun (oder in den Fällen mit alternativen Buchstaben) ohne eine identische benannte Variable verwenden, die nicht zur Bestimmung des Wochentags oder zur Bestimmung, ob der Code ausgeführt werden soll, verwendet wird.
Targumon
quelle
Wie definieren Sie "Wochenenden"? Ist es in Ordnung, wenn der Code am Freitagnachmittag nicht mehr funktioniert, anstatt bis Mitternacht zu warten?
Dan04
@ Dan04 Ich werde aktualisieren, um dies zu beheben.
3
Wenn kreative Antworten gewünscht werden, sollte dies kein Code-Golf sein. Wenn Codegolf gewünscht wird, müssen Sie objektiv "sofort offensichtlich" definieren.
John Dvorak
ist die Zeit als Ortszeit oder GMT zu verstehen?
John Dvorak
@JanDvorak Ich habe die Einschränkungen aktualisiert und hoffe, dass es jetzt besser ist: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Antworten:

11

Rebmu : 17 (27 - 10, verschleiert) oder 30 ohne Verschleierung

Rebmu wurde speziell dafür entwickelt, Codegolf zu spielen, während es lesbar ist (für diejenigen, die den "Trick" verstehen), daher verstößt die Verschleierungsregel gegen dieses Prinzip. Aber:

DnowRjRkILd/7 6[pDT[adJk]]

Es funktioniert den ganzen Tag an Wochentagen:

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

... aber am Wochenende macht es einfach nichts:

Input Integer: 10
Input Integer: 20

Erläuterung:

Das Aufheben und Beachten von Großbuchstaben ist ein getrenntes Wort, und das Fehlen eines führenden Großbuchstaben bedeutet, dass wir kein festes Wort bilden. Wir erhalten die Abkürzung Rebol:

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

Ohne es abzukürzen:

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

Datumsnummern in Rebol sind von 1 für Montag bis 7 für Sonntag nummeriert. Die gebildete Art, einen Wochentag aus einem Wochentag herauszuholen, ist zu sagen, d/weekdayaber Sie können es auch damit bekommen d/7. Meine bevorzugte Lösung, ohne die Dinge zu ändern, nur um sich diesem Problem anzupassen, wäre eher wie folgt:

rJrKilNOW/weekday 6[pDT[adJk]]

Aber wenn man das Vokabular für die allgemeine Anwendung auf diese Art von Problem aktualisieren würde, das wahrscheinlich oft genug auftaucht, um nicht jedes Mal durchfallen zu wollen, um Rebol zu verbalisieren, würde ich MON bis SUN wahrscheinlich auf 1 - 7 setzen und abkürzen JETZT WOCHENTAG, ab wann würde es wohl eher so aussehen ...

rJrKilNW/wkdySAT[pDT[adJk]]

Anmerkungen

Wie üblich können Sie "das Programm" selbst etwas kürzer machen, wenn Sie zulassen, dass die Eingaben als Argumente an Rebmu übergeben werden, und einfach das Auswertungsergebnis (hier entweder ein Wert vom Typ time oder NONE) akzeptieren, ohne es zu drucken:

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

Auch Delta-Zeit, Datumsangaben, Image-Generierung und eine verrückte Anzahl von Dingen sind bereits in Rebols ausführbarer Datei mit einem halben Megabyte und ohne Installation enthalten .

Dr. Rebmu
quelle
Rebmu ist unglaublich. Gibt es einen Dolmetscher, der in einer anderen Sprache als Rebol geschrieben ist?
Primo
@primo Danke! Nein, es hängt zu 100% von Rebol ab, und wie ich bereits erwähnte, ist es nur eine dünne Schicht über der Sprache (und interessanterweise kompatibel, wenn Ihr Code nur in Kleinbuchstaben geschrieben ist ... siehe zum Beispiel Hourglass ) . Rebol ist die wahre Magie hier und bekommt endlich etwas Schwung seit dem Open-Sourcing. Sprechen Sie uns und RebolBot über den SO-Chat an.
Dr. Rebmu
Ich frage, weil ich wirklich gerne sehen würde, wie sich das auf anagol entwickelt , obwohl ich nicht sicher bin, wie viel Aufwand es bedeuten würde, einen Dolmetscher in Rebol zuzulassen.
Primo
@primo Entschuldigung für die verspätete Antwort ... Ich bin auf jeden Fall daran interessiert, dass dies geschieht. Wenn Sie also wissen, dass jemand Kontakt mit ihnen aufnimmt, wenden Sie sich an uns. Wir haben Rebmu auf Cloud9 IDE und wir haben auch die Möglichkeit, nicht interaktive Rebmu-Skripte über den von RebolBot verwendeten Webdienst auszuführen. Sie könnten auch meinen Vortrag auf der Rebol / Red-Konferenz von Interesse finden und vielleicht dazu beitragen, Leute davon zu überzeugen, dass es auf Anagol sein sollte. :-)
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

Erfüllt alle drei Bedingungen und verwendet keine der Standardbibliotheksfunktionen außer dem, was zum Abrufen der aktuellen Uhrzeit erforderlich ist. Daher glaube ich, dass ich mich für den Bonus qualifiziere.

In Bezug auf die Verschleierungskriterien - obwohl es den Buchstaben des Gesetzes entspricht, scheint es nicht sehr unschuldig zu sein. Es ist ziemlich offensichtlich, dass mit den magischen Konstanten 60 und 7 etwas los ist. Leider wird jede Art von Verschleierung einige Augenbrauen hochziehen.

Eingabe: Zwei durch Leerzeichen getrennte Ganzzahlen

Ausgabe: Ein Golfscript-Array-Literal - zwei durch ein Leerzeichen getrennte Ganzzahlen (Summe, Zeit in ms), die in eckige Klammern eingeschlossen sind.

Beispiel:

;'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}"'ist eine Golfscript-Zeichenfolge, die ein Golfscript-Zeichenfolgenliteral enthält, das einen ausführbaren Ruby-Block zum Abrufen der aktuellen Zeit enthält. Der Stapel enthält nun den Eingang unten und das Zeitrezept oben.
  • .~~klont das Zeitrezept und wertet es zweimal aus. Bei der ersten Auswertung wird eine Zeichenfolge durch Ausführen des Ruby-Abschnitts in eine numerische Zeichenfolge umgewandelt. Die zweite Auswertung macht daraus eine Zahl. Der Stapel enthält nun (von unten) die Eingabe, das Zeitrezept und die Startzeit
  • @~+Zieht die Eingabe nach oben, wertet sie aus und führt die Addition durch. Der Stapel enthält nun das Zeitrezept, die Startzeit und die Summe.
  • @);' "'+~~Zieht das Zeitrezept heraus, ändert '"'es ' "'(siehe Diskussion unten) und wertet es doppelt aus. Der Stack enthält nun die Startzeit, die Summe und die Endzeit.
  • 2$-Klont die Startzeit nach oben und subtrahiert sie von der Endzeit. Der Stapel enthält nun die Startzeit, die Summe und die Zeitdifferenz.
  • @86400/ Zieht die Startzeit nach oben und konvertiert sie von Sekunden in Tage.
  • ((7%(Dekrementiert die Tage seit Beginn der Epoche zweimal (es war Donnerstag, wir wollen Samstag), nimmt Modulo 7 und dekrementiert noch einmal. Wochenendkarten bis -1 und 0, Wochentagkarten bis 1..5.
  • ,)=Erstellt eine Tabelle mit ganzen Zahlen dieser Größe. Dies ist in Ordnung - ein Array mit negativer Größe ist leer. Dann nimmt es sein letztes Element. Leider stürzen einige Dolmetscher noch nicht ab. Stattdessen werfen sie eine Null ab - was sicher zu verwerfen ist. Anstatt es zu verwerfen, verwenden wir es als Index für dieses Array. Wenn Sie den nullten Index nehmen, stürzt der Interpreter schließlich ab, aber wenn Sie ein Element außerhalb der Grenzen nehmen, ist das in Ordnung - nichts wird auf den Stapel geschoben. In diesem Fall ist der Array-Zugriff immer außerhalb der Grenzen, sodass wir nichts zu verwerfen haben.
  • ]` Nimmt den Stack und formatiert ihn als Golfscript-Array.
John Dvorak
quelle
Ich befürchte, dass Ihr Code den Vorgang nicht zeitlich steuert. Ersetzen Sie den Zusatz durch einen Vorgang, der einige Sekunden dauert, und Sie werden feststellen, dass er angeblich keine Zeit in Anspruch nimmt. Ich habe dies (und Problemumgehungen ) in meinem GolfScript-Blog besprochen .
Peter Taylor
Ich denke, Golfscript qualifiziert sich als Verschleierung: PI kann nicht glauben, dass es so wenige Zeichen brauchte! Erzählst du uns, was passiert, wenn du es am Samstag startest?
@LegoStormtroopr Ich habe bereits ein Beispiel aufgenommen.
John Dvorak
Oh hoppla, mein Fehler, ich habe es komplett verpasst. Große Anstrengung.
1

JavaScript

Es verwendet dieses Dienstprogramm:

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

Und hier ist die eigentliche Funktion:

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

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

Ich hoffe es war nicht sofort offensichtlich ...

Ry-
quelle
2
@ ChristopherWirt: Cool! Ich bin froh, dass ich die Frist für Unfunniness überschritten habe.
Ry
Es war auch vor einem Jahr nicht wirklich lustig, aber ich gebe dir definitiv, dass es bis heute nicht "offiziell" war;) Es sei denn, eine Antwort wird (irgendwie) abgelehnt.
Christopher Wirt