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:
- 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.
- 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)
- 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- date
Objektbibliotheken java.util.Date
und dergleichen. Funktionen zum Berechnen von Timedeltas für die Ausführung wie das Pythons- timeit
Modul 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.
quelle
Antworten:
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:
Es funktioniert den ganzen Tag an Wochentagen:
... aber am Wochenende macht es einfach nichts:
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:
Ohne es abzukürzen:
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/weekday
aber Sie können es auch damit bekommend/7
. Meine bevorzugte Lösung, ohne die Dinge zu ändern, nur um sich diesem Problem anzupassen, wäre eher wie folgt: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 ...
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:
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 .
quelle
Golfscript,
5156 - 10 = 46http://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:
'"#{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.quelle
JavaScript
Es verwendet dieses Dienstprogramm:
Und hier ist die eigentliche Funktion:
Ich hoffe es war nicht sofort offensichtlich ...
quelle