あなたの機能の時間を計りますが、週末は仕事をしていません


17

私の上司は、2つの整数を加算するのにかかる時間を知る必要があります。しかし、私は週末に仕事をするのは好きではありませんし、私のコードもそうではないと思います。問題は、上司は要求の厳しい男であり、時間がかかることを確認するために時間をかけて投入する必要があると考えていることです。

次の短いプログラムを書いてもらえますか?

  1. 2つの整数を受け入れ、加算の正しい結果と、加算の実行にかかる時間を返します-この時間は妥当であり、コードの実行時間に基づいている必要があります。ただし、時間制限のあるコード間でいくつかの操作をこっそり実行する必要がある場合は、許可されているはずのコードよりも少し長く実行します。ただし、偽の時間を出力することはできません。
  2. 週末のローカル時間のコードでは機能しません(間違った結果を返すだけでなく、コードが壊れたり、エラーが発生したり、実行に失敗したりする必要があります)
  3. 週末に機能しない理由がすぐにはわからない

私は必ずいくつかのスマートな民族なので、ありますよ、私は最初の基準は一種奇妙なのですけど、私はしかし、基準3について疑いを上げることなく、必要であれば必ず人は、日付/時刻のライブラリをインポート可能性が作りたかった-10文字標準日付ライブラリのカレンダー機能使用せずにこれを実行できる人

「標準の日付/時刻ライブラリ」について

標準日時ライブラリの例には、pythons datetime、javascript dateオブジェクトライブラリjava.util.Dateなどが含まれます。pythons timeitモジュールなどの実行の時間差を計算する関数は、ボスがコードのタイミングを期待しているため、この基準に違反しません。いくつかのケースでは、これらのライブラリは、アクセスにインポートする必要があります任意のそのリターンが別々与えることができる日時オブジェクトを構造化することを整数として、現在のエポックの開始からの時間を返すコール機能しますが、カレンダー機能を許可して、時間の関数を時間、日などは許可されません。

編集:Dan04の質問に関して、コードは、いつ機能するか、または機能しないかの4つの基準を満たしている必要があります。また、コードが時間をチェックする方法を説明する必要があります。月曜日の朝/金曜日の夜のたるみは、コードを短縮するための創造的な方法の機会を与えるはずです。

  • 土曜日の朝00:00:00から日曜日の夜23:59:59までは動作しません。
  • 月曜日の朝06:00:00から金曜日の夕方19:59:59まで常に動作する必要があります
  • 月曜日の朝00:00:00から月曜日の朝5:59:59まで働くか、または働かないかのどちらか
  • 金曜日の夜20:00:00から金曜日の夜23:59:59までは仕事ができる、または仕事ができない

edit2:すぐにわかるように、次の3つの基準を満たす必要があります。

  • 関数DayOfWeekの時間を計算するために使用せずに、呼び出した(または類似した)関数を呼び出してはなりません。
  • 土曜日または日曜日またはそれらの略語を英語で使用してはなりません。
  • 曜日を決定するために、またはコードを実行するかどうかを決定するために使用されない同じ名前の変数がない場合、SatまたはSunを使用しないでください。

「週末」をどのように定義していますか?コードが真夜中まで待たずに金曜日の午後に動作を停止しても大丈夫ですか?
dan04

@ dan04これに対処するために更新します。

3
創造的な答えが必要な場合、これはコードゴルフではありません。コードゴルフが必要な場合は、客観的に「即座に明らか」を定義する必要があります。
ジョンドヴォルザーク

時間は現地時間、またはGMTとして理解されるべきですか?
ジョンドボラック

@JanDvorak制限を更新して、今より良いことを願っています:codegolf.stackexchange.com/questions/307/obfuscated-hello-world

回答:


11

Rebmu:17(27-10、難読化済み)または30難読化なし

Rebmuは、読み取り可能(「トリック」を取得した人向け)でコードゴルフをプレイするように特別に設計されているため、難読化ルールは原則に反しています。だが:

DnowRjRkILd/7 6[pDT[adJk]]

平日は終日機能します:

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

...しかし、週末には何もしません:

Input Integer: 10
Input Integer: 20

説明:

使用unmushingをし、大文字の実行している別の言葉に気付いて、私たちは、セットの単語を行っていない大手資本の実行手段の欠如は、我々は省略REBOLの取得:

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

省略しないで、次のようにします。

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

Rebolの日付番号には、月曜日が1、日曜日が7までの番号が付けられます。平日から曜日を取得するよりリテラシーな方法は言うd/weekdayことですが、それを使っても取得できますd/7この問題に適応するためだけに物事を変更せずに私の好みのソリューションは、次のようになります:

rJrKilNOW/weekday 6[pDT[adJk]]

しかし、このスタイルの問題への一般的な適用のために語彙を更新する場合、それは毎回詳細なRebolに陥りたくないほど頻繁に発生するので、私はおそらくMONからSUNを1-7)にして短縮します今曜日、その時点でおそらくもっと似ているでしょう...

rJrKilNW/wkdySAT[pDT[adJk]]

ノート

通常どおり、入力を引数としてRebmuに渡し、評価結果(ここではtime型またはNONE型の値)を出力せずに受け入れる場合、「プログラム」自体を少し短くすることができます。

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

また、Rebolの半メガバイトのゼロインストール実行可能ファイルには、デルタ時間、日付、画像生成、および非常に多くの要素が既に含まれています


レブムはすごい。Rebol以外の言語で書かれたインタープリターはありますか?
-primo

@primoありがとう!いいえ、それはRebolにほぼ100%依存しています。そして、私が言及したように、それは言語の単なる薄層です(そして、興味深いことに、コードがすべて小文字の場合は互換性があります...例えばHourglassを参照)。Rebolはここでの本当の魔法であり、そのオープンソーシングからようやく勢いを得ています。SOチャットでお気軽にRebolBotにご相談ください。
レブム博士13

Rebolで書かれたインタープリターを許可するのにどれだけの労力がかかるのかはわかりませんが、これがanagolで実際に離陸するのを本当に見たいので、お願いします。
primo

@primo応答が遅れてすみません...私は間違いなくこれが起こるのを見るのに興味があります。Cloud9 IDEにはRebmu があり、RebolBotが使用するWebサービスを介して非インタラクティブRebmuスクリプトを実行することもできます。また、興味のあるRebol / Red会議私の講演を見つけ、おそらくアナゴルにあるべきだと人々を説得するのに役立つかもしれません。:-)
レブム博士

2

Golfscript、 51 56-10 = 46

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

http://golfscript.apphb.com/?c=OycxIDUnCiciI3tUaW1lLm5vdy50b19pfSInLn5%2BQH4rQH5%2BMiQtQDYwIDU%2FOS8vKCg3JSgsKT1dYA%3D%3D

3つの条件をすべて満たし、現在の時刻を取得するために必要なものを除き、標準ライブラリ関数を使用しません。したがって、ボーナスの資格があると思います。

難読化の基準に関しては、法律の条文を満たしているものの、それほど無害ではないようです。60と7のマジック定数で何かが進行していることは明らかです。残念なことに、どんな種類の難読化でも眉をひそめます。

入力:空白で区切られた2つの整数

出力:golfscript配列リテラル-スペースで区切られ、角括弧で囲まれた2つの整数(合計、ミリ秒単位の時間)。

例:

;'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}"'は、現在の時刻を取得するためのRuby実行可能ブロックを含むgolfscript文字列リテラルを含むgolfscript文字列です。スタックは、下部に入力を保持し、上部に時間レシピを保持します。
  • .~~時間レシピを複製し、2回評価します。最初の評価では、rubyセクションを実行して文字列を数値文字列に変換します。2番目の評価では、数値に変換されます。スタックは、(下から)入力、時間レシピ、および開始時間を保持します
  • @~+入力を一番上に引き出して評価し、加算を実行します。スタックは、時間レシピ、開始時間、および合計を保持するようになりました。
  • @);' "'+~~タイムレシピを引き出し、変更'"'' "'(以下の説明を参照)、それを二重評価します。スタックは、開始時刻、合計、終了時刻を保持するようになりました。
  • 2$-開始時刻を先頭に複製し、終了時刻から減算します。スタックには、開始時刻、合計、および時差が保持されます。
  • @86400/ 開始時間を一番上に引き上げ、それを秒から日に変換します。
  • ((7%(エポックの開始から日を2回減らします(木曜日で、土曜日が必要です)。モジュロ7を取り、もう一度減らします。週末は-1および0にマップされ、平日は1..5にマップされます。
  • ,)=そのサイズの整数のテーブルを作成します。これは問題ありません-負のサイズの配列は空です。次に、最後の要素を取得します。残念ながら、一部のインタープリターはまだクラッシュしません。代わりに、nilをポップします-これは破棄しても安全です。したがって、破棄する代わりに、その配列のインデックスとして使用します。nil番目のインデックスを取得すると、最終的にインタープリターがクラッシュしますが、範囲外の要素を取得することは問題ありません。スタックには何もプッシュされません。この場合、配列アクセスは常に範囲外であるため、破棄するものはありません。
  • ]` スタックを取得し、golfscript配列としてフォーマットします。

あなたのコードが実際に操作のタイミングを計っていないのではないかと思います。追加を数秒かかる操作に置き換えると、時間がかからないことがわかります。GolfScriptブログでこれ(および回避策)について説明しました。
ピーターテイラー


Golfscriptは難読化の資格があると思います。PIは文字数が少ないとは信じられません。土曜日に実行するとどうなりますか?

@LegoStormtroopr私はすでに例を含めています。
ジョンドヴォルザーク

なんてこった、私の間違い、私は完全にそれを見逃した。多大な努力。

1

JavaScript

このユーティリティを使用します。

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

そして、実際の機能は次のとおりです。

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

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

すぐに明らかにならないことを願っています…


2
@ChristopherWirt:かっこいい!不愉快さの締め切りに間に合いました。
Ry- 14

1年前もあまり面白くありませんでしたが、今日まで「公式」ではなかったことは間違いありません。
クリストファー・ウィート14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.