我给你安排时间,但是我周末不工作


17

我的老板需要知道将两个整数相加需要多长时间。但是,我不喜欢在周末工作,而且我认为我的代码也不也很公平。问题是,老板是一个要求很高的人,我认为我应该随着时间的流逝,以确保所需的时间保持不变,而且我知道他将检查代码是否正常工作。

你能给我写一个简短的程序吗?

  1. 接受两个整数,并返回正确的加法结果以及执行加法所需时间的时间-此时间应合理,并基于代码的运行时。但是,如果您需要在定时代码之间进行一些操作,使它的运行时间比允许的时间稍长。但是,您不能仅输出假时间。
  2. 不适用于本地时间的周末代码(它不能只是返回错误的结果,代码需要中断,错误或以其他方式无法执行)
  3. 不立即为明显的,为什么它没有在周末工作

我知道第一个条件有点怪异,但是我想确保人们可以在需要时导入日期/时间库,而不必怀疑标准3。但是,我敢肯定有些聪明的人会使用-10个字符无需使用标准日期库中的日历功能即可执行此操作的任何人

关于“标准日期/时间库”

标准日期时间库的示例包括python datetime,javascript date对象库java.util.Date等。用于计算执行时间增量的函数(例如pythons timeit模块)不会违反此准则,因为老板希望对代码进行计时。在某些情况下,将需要导入这些库以访问任何时间函数,因此允许其调用以整数形式返回自当前纪元开始以来的时间的函数,但日历函数返回结构化的datetime对象,这些对象可以给出单独的不允许使用小时,天等。

编辑:关于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
如果需要创造性的答案,那么这不应该是“代码高尔夫”。如果需要编码高尔夫球,则需要客观地定义“立即明显”。
John Dvorak

时间应该理解为当地时间还是格林尼治标准时间(GMT)?
John Dvorak

@JanDvorak我已将限制更新为更像现在希望现在这样更好:codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Answers:


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

说明:

使用通俗易懂的字母大写字母是单独的单词,并且缺少前导大写字母表示我们没有设置固定的单词,而是缩写为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 THUN设为1-7)并缩写现在是星期天,这时看起来可能更像是...

rJrKilNW/wkdySAT[pDT[adJk]]

笔记

像往常一样,如果允许输入作为参数传递给Rebmu并只接受评估结果(此处为time或NONE类型的值)而不打印它,则可以使“程序”本身短一点:

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

Rebol的半兆字节,零安装可执行文件中已经包含了时间增量,日期,图像生成以及一些疯狂的东西。


雷布姆很棒。是否有使用Rebol以外的语言编写的口译员?
2013年

@primo谢谢!不,它几乎100%依赖于Rebol,并且正如我提到的,它只是该语言的薄薄一层(而且有趣的是,如果您的代码全部为小写,则可以兼容...例如参见Hourglass。Rebol是这里真正的魔力,自从开源以来,终于有了动力,因此随时可以通过SO聊天与我们和RebolBot进行交谈。
Rebmu博士13年

我问,因为我真的很想看到这在anagol取得成功,尽管我不确定允许Rebol编写的口译员会付出多大的努力。
2013年

@primo抱歉,回复延迟...我确实对看到这种情况很感兴趣,因此,如果您知道有人与他们取得联系。我们在Cloud9 IDE上具有Rebmu,并且还能够通过RebolBot使用的Web服务运行非交互式Rebmu脚本。您可能还会感兴趣的Rebol / Red会议上找到我的演讲,也许会帮助说服人们谈论它。:-)
Rebmu博士2013年

2

Golfscript, 51 56-10 = 46

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

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

满足所有这三个条件,除了获得当前时间所必需的以外,不使用任何标准库函数。因此,我相信我有资格获得奖金。

关于混淆标准-虽然确实符合法律规定,但看起来并不是很单纯。很明显,魔术常数为60和7的情况发生了。不幸的是,任何一种混淆都会引起人们的注意。

输入:两个由空格分隔的整数

输出:golfscript数组文字-两个整数(以毫秒为单位的总和,时间用空格隔开,并用方括号括起来)。

例:

;'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}"'是一个golfscript字符串,其中包含一个golfscript字符串文字,该文字包含一个用于检索当前时间的Ruby可执行块。现在,堆栈将输入保留在底部,时间配方保留在顶部。
  • .~~克隆时间配方并对其进行两次评估。第一个评估通过执行ruby部分将字符串字符串转换为数字字符串。第二次评估将其转换为数字。堆栈现在(从底部开始)保存输入,时间配方和开始时间
  • @~+将输入拉出至顶部,对其进行评估并执行加法。现在,堆栈将保存时间配方,开始时间和总和。
  • @);' "'+~~取出时间配方,更改'"'' "'(请参见下面的讨论)并对其进行两次评估。现在,堆栈将保存开始时间,总和和结束时间。
  • 2$-将开始时间克隆到顶部,然后从结束时间中减去。现在,堆栈将保存开始时间,总和和时间差。
  • @86400/ 将开始时间拉到顶部,并将其从几秒转换为几天。
  • ((7%(将自纪元开始以来的天数减少两次(这是星期四,我们需要星期六),取模7并再次减少。周末映射到-1和0,工作日映射到1..5。
  • ,)=创建一个该大小的整数表。很好-负数数组为空。然后,它取其最后一个元素。不幸的是,一些口译员还没有崩溃。相反,它们会弹出nil-可以安全丢弃。因此,我们将其用作该数组的索引而不是丢弃。采用第n个索引最终会使解释器崩溃,但是采用越界元素就可以了-没有东西被压入堆栈。在这种情况下,数组访问总是越界,因此我们没有什么可丢弃的。
  • ]` 抓取堆栈并将其格式化为golfscript数组。

恐怕您的代码实际上并未计时该操作。用需要几秒钟的操作替换添加的内容,您会发现它声称不需要任何时间。我已经在GolfScript博客中讨论了这个问题(和解决方法)。
彼得·泰勒


我认为Golfscript符合混淆标准:PI不能相信花了那么少的字符!您能告诉我们在星期六运行时会发生什么吗?

@LegoStormtroopr我已经提供了一个示例。
John Dvorak

哦,我的错误,我完全错过了。很努力。

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-

一年前,这也不是很有趣,但是我肯定会告诉你,直到今天它还不是“官方的”;)除非答案(以某种方式)被拒绝。
Christopher Wirt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.