Я опишу твою работу, но я не работаю по выходным

17

Мой босс должен знать, сколько нужно времени, чтобы сложить вместе два целых числа. Но я не люблю работать по выходным, и я думаю, это справедливо, что мой код тоже не работает. Проблема в том, что начальник - требовательный парень, и он считает, что я должен приложить какое-то время, чтобы убедиться, что время не изменилось, и я знаю, что он собирается проверить, правильно ли работает код.

Можете ли вы написать мне короткую программу, которая:

  1. Принимает два целых числа и возвращает правильный результат сложения и время, необходимое для выполнения сложения - это время должно быть правдоподобным и основываться на времени выполнения кода. Однако, если вам нужно прокрасться некоторые операции между временным кодом, который заставляет его работать немного дольше, чем это должно быть разрешено. Однако вы не можете просто вывести поддельное время.
  2. Не работает по выходным в кодах по местному времени (он не может просто вернуть неправильный результат, код должен сломаться, ошибиться или иным образом не выполнить)
  3. Не сразу понятно, почему это не работает по выходным

Я знаю, что первый критерий довольно странный, но я хотел убедиться, что люди могут импортировать библиотеки даты / времени, если это необходимо, не вызывая подозрений в отношении критерия 3. Однако я уверен, что есть некоторые умные люди, так что -10 символов для любой, кто может сделать это, не используя функции календаря из стандартных библиотек дат

Относительно «стандартных библиотек даты / времени»

Примеры стандартных библиотек даты и времени включают в себя питоны datetime, dateбиблиотеку объектов javascript java.util.Dateи тому подобное. Функции для вычисления временных шкал для выполнения, такие как timeitмодуль pythons, не будут нарушать эту критерию, поскольку босс ожидает, что код будет синхронизирован. В некоторых случаях эти библиотеки нужно будет импортировать для доступа к любым функциям времени, поэтому разрешается вызывать функции, которые возвращают время с начала текущей эпохи, как целое число, но функции календаря, которые возвращают структурированные объекты даты и времени, которые могут давать отдельные часы, дни и т.д ... не допускаются.

редактировать: Что касается вопроса 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 (или в их альтернативных буквенных регистрах) без идентичной именованной переменной, не используемой для определения дня недели или при определении, должен ли код выполняться.
targumon
источник
Как вы определяете «выходные»? Это нормально, если код перестает работать в пятницу днем ​​вместо ожидания до полуночи?
Ден04
@ dan04 Я обновлю, чтобы решить эту проблему.
3
если креативные ответы желательны, это не должно быть кодом гольф. Если код гольф желателен, нужно объективно определить «сразу очевидное».
Джон Дворжак
время следует понимать как местное время или время по Гринвичу?
Джон Дворжак
@JanDvorak Я обновил ограничения, чтобы больше походить на эту надежду, теперь это лучше: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Ответы:

11

Ребму : 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
    ]
]

Номера дат в Реболе нумеруются от 1 для понедельника до 7 для воскресенья. Более грамотный способ вывести день недели из рабочего дня - это сказать, d/weekdayно вы также можете получить его сd/7 . Мое предпочтительное решение без изменения вещей просто для адаптации к этой проблеме было бы больше похоже на:

rJrKilNOW/weekday 6[pDT[adJk]]

Но если бы я обновил словарь для общего применения в соответствии с этим стилем проблемы, который, вероятно, возникает достаточно часто, чтобы не хотеть каждый раз повторять подробный текст «Ребол», я бы, вероятно, сделал «МОН через СОЛНЦЕ» 1–7) и сокращал бы его. ТЕПЕРЬ НЕДЕЛЯ, в этот момент это выглядело бы скорее как ...

rJrKilNW/wkdySAT[pDT[adJk]]

Примечания

Как обычно, вы можете сделать саму «программу» чуть короче, если разрешите передавать входные данные в Rebmu в качестве аргументов и просто примете результат оценки (здесь, либо значение типа time, либо NONE), не печатая его:

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

Кроме того, дельта-время, даты, генерация изображений и огромное количество вещей уже включены в полу-мегабайтный исполняемый файл Rebol с нулевой установкой .

Доктор Ребму
источник
Ребму потрясающий. Есть ли переводчик, написанный на другом языке, кроме Rebol?
Примо
@ primo Спасибо! Нет, он почти на 100% зависит от Rebol, и, как я уже упоминал, это всего лишь тонкий слой языка (и, что интересно, совместим, если ваш код написан строчными буквами ... см., Например, Hourglass ) . Rebol - настоящая магия здесь, и, наконец, он набирает обороты с момента своего открытия с открытым исходным кодом, так что не стесняйтесь приходить поговорить с нами и RebolBot в SO чате.
Доктор Ребму
Я спрашиваю, потому что я действительно хотел бы, чтобы это взлетло на анаголе , хотя я не уверен, сколько будет усилий, чтобы позволить переводчику, написанному на Реболе.
Примо
@primo Извините за задержку с ответом ... Я определенно заинтересован в том, чтобы это произошло, так что, если вы знаете, кто-нибудь попросит их связаться. У нас есть Rebmu в Cloud9 IDE, и у нас также есть возможность запускать неинтерактивные сценарии Rebmu через веб-сервис, который использует RebolBot. Вы также можете найти мой доклад на интересной конференции 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

Удовлетворяет всем трем условиям и не использует никаких стандартных библиотечных функций, кроме тех, которые необходимы для получения текущего времени. Таким образом, я считаю, что могу претендовать на бонус.

Что касается критериев запутывания - хотя он и соответствует букве закона, он не выглядит невинным. Совершенно очевидно, что что-то происходит с магическими константами 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.
  • ,)=создает таблицу целых чисел этого размера. Это нормально - массив отрицательного размера пуст. Тогда он берет свой последний элемент. К сожалению, некоторые переводчики еще не рухнули. Вместо этого они выскакивают ноль - который безопасно отбросить. Поэтому вместо отбрасывания мы используем его как индекс для этого массива. Взятие нулевого индекса в конце концов приводит к сбою интерпретатора, но взятие элемента за пределами допустимого - ничего не помещается в стек. В этом случае доступ к массиву всегда выходит за границы, поэтому нам нечего отбрасывать.
  • ]` захватывает стек и форматирует его как массив 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-
Год назад это тоже было не очень смешно, но я определенно скажу вам, что до сегодняшнего дня это не было «официально»;) Если ответ (каким-то образом) не будет отклонен.
Кристофер Вирт