Я буду функціонувати, але вихідні не працюю


17

Мій начальник повинен знати, скільки часу потрібно скласти два цілих числа. Але я не люблю працювати у вихідні дні, і я вважаю, що це справедливо, що і мій код. Проблема полягає в тому, що начальник - вимогливий хлопець і думає, що я повинен прийти вчасно, щоб переконатися, що час, який він займає, залишається таким же, і я знаю, що він перевірить, чи працює код правильно.

Чи можете ви написати мені коротку програму, яка:

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

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

Щодо "стандартних бібліотек дати / часу"

Приклади стандартних бібліотек дат включають пітони datetime, dateбібліотеку об'єктів javascript java.util.Dateтощо. Функції для обчислення тиммеделей для виконання, такі як 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

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

Але якби оновлювати словниковий запас для загального застосування до цього стилю проблеми, який, ймовірно, виникає досить часто, щоб не хотіти кожного разу переходити до багатослівного Rebol, я, мабуть, зробив би MON через SUN бути 1 - 7) і скоротити ЗАРАЗ ТИЖДЕНЬ, в цей момент це буде виглядати, мабуть, більше ...

rJrKilNW/wkdySAT[pDT[adJk]]

Примітки

Як звичайно, ви можете зробити "програму" на кілька разів коротше, якщо ви дозволяєте передавати входи в Rebmu як аргументи і просто приймати результат оцінки (тут, або значення типу типу, або NONE), не друкуючи його:

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

Також дельта-час, дати, генерування зображень та шалена кількість речей вже включені у півмігабайтний Rebala, виконаний з нульовим встановленням .


Ребму дивовижний. Чи є перекладач, написаний мовою, відмінною від Ребола?
примо

@primo Дякую! Ні, це майже на 100% залежить від Rebol, і, як я вже згадую, це лише тонкий шар над мовою (і що цікаво, сумісний, якщо ваш код - це малі регістри ... дивіться, наприклад, Пісочний годинник ) . Rebol є справжньою магією тут, і нарешті набирає деякий імпульс з моменту свого відкритого пошуку, тому не соромтесь прийти поговорити з нами та RebolBot в чаті SO.
HostileFork каже, що не довіряйте SE

Я запитую, бо мені дуже хотілося б, щоб цей зліт був на анаголі , хоча я не впевнений, скільки зусиль потрібно дозволити дозволити перекладачеві, написаному в Реболі.
примо

@primo Вибачте за затримку у відповіді ... Мені напевно цікаво бачити це, тому якщо ви знаєте, хтось з ними звертається. У нас є Rebmu на Cloud9 IDE, і ми також маємо можливість запускати неінтерактивні сценарії Rebmu через веб-сервіс, який використовує RebolBot. Ви також можете знайти мою розмову на цікавій конференції Rebol / Red і, можливо, допомогти переконати людей, що це має бути на анаголі. :-)
HostileFork каже, що не довіряйте SE

2

Гольфскрипт, 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 для відновлення поточного часу. Тепер стек містить введення внизу, а рецепт часу вгорі.
  • .~~клонує рецепт часу і оцінює його двічі. Перша оцінка перетворює рядок рядка в числовий рядок, виконуючи розділ рубіну. Друга оцінка перетворює її в число. Тепер стек містить (знизу) введення, рецепт часу та час початку
  • @~+витягує вхід до верху, оцінює його і виконує додавання. Тепер стек містить рецепт часу, час початку та суму.
  • @);' "'+~~витягує рецепт часу, змінюється '"'на' "' (дивіться обговорення нижче) і двічі оцінює його. Тепер стек містить час початку, суму та час закінчення.
  • 2$-клонує час початку до верху і віднімає його від кінця часу. Тепер стек містить час початку, суму та різницю у часі.
  • @86400/ тягне час початку до вершини і перетворює його від секунд до днів.
  • ((7%(декрементує дні з початку епохи двічі (це був четвер, ми хочемо суботу), займає модуль 7 і ще раз декременти. Карти вихідних до -1 та 0, будні карти до 1..5.
  • ,)=створює таблицю цілих чисел такого розміру. Це добре - масив негативного розміру порожній. Тоді він бере свій останній елемент. На жаль, деякі перекладачі поки не виходять з ладу. Натомість вони спливають нуль - який безпечно відкинути. Отже, замість того, щоб відкидати, ми використовуємо його як індекс до цього масиву. Якщо взяти нульовий індекс, нарешті, виходить з ладу інтерпретатор, але взяти поза межі елемента - це добре - нічого не підштовхується до стека. У цьому випадку доступ до масиву завжди знаходиться поза межами, тому нам нічого не можна відкидати.
  • ]` захоплює стек і форматує його як масив 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: Класно! Радий, що я обіграв термін неприємності.
Ри-

Ще рік тому це було не дуже смішно, але я обов'язково скажу вам, що до сьогоднішнього дня він не був "офіційним";
Крістофер Вірт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.