Wyznaczę twoją funkcję, ale nie pracuję w weekendy

17

Mój szef musi wiedzieć, ile czasu zajmuje sumowanie dwóch liczb całkowitych. Ale nie lubię pracować w weekendy i uważam za słuszne, że mój kod też nie. Problem polega na tym, że szef jest wymagającym facetem i uważa, że ​​powinienem poświęcić czas, aby upewnić się, że czas ten pozostanie taki sam, i wiem, że sprawdzi, czy kod działa poprawnie.

Czy możesz napisać mi krótki program, który:

  1. Akceptuje dwie liczby całkowite i zwraca poprawny wynik dodawania oraz czas potrzebny na wykonanie dodawania - ten czas powinien być wiarygodny i oparty na środowisku uruchomieniowym kodu. Jeśli jednak musisz podkraść niektóre operacje między kodem czasowym, który powoduje, że działa on nieco dłużej niż powinien. Nie możesz jednak po prostu podać fałszywego czasu.
  2. Nie działa w weekendy w kodach czasu lokalnego (nie może po prostu zwrócić nieprawidłowego wyniku, kod musi się zepsuć, błąd lub w inny sposób nie wykonać)
  3. Nie wiadomo od razu, dlaczego nie działa w weekendy

Wiem, że pierwsze kryterium jest trochę dziwne, ale chciałem się upewnić, że ludzie będą mogli importować biblioteki daty / godziny, jeśli to konieczne, bez wzbudzania podejrzeń co do kryteriów 3. Jednak jestem pewien, że są sprytni ludzie, więc -10 znaków do każdy, kto może to zrobić, bez korzystania z funkcji kalendarza ze standardowych bibliotek dat

W odniesieniu do „standardowych bibliotek daty / godziny”

Przykłady standardowych bibliotek datetime obejmują pytony datetime, datebibliotekę obiektów javascript java.util.Datei tym podobne. Funkcje obliczania timedeltas do wykonania, takie jak timeitmoduł pytonów , nie naruszyłyby tych kryteriów, ponieważ szef spodziewa się, że kod zostanie zsynchronizowany. W niektórych przypadkach biblioteki te będą musiały zostać zaimportowane, aby uzyskać dostęp do dowolnej funkcji czasu, więc dozwolone jest wywoływanie funkcji, które zwracają czas od początku bieżącej epoki jako liczby całkowitej, ale funkcje kalendarza zwracające ustrukturyzowane obiekty daty i godziny, które mogą dawać osobne godziny, dni itp. nie są dozwolone.

edycja: Jeśli chodzi o pytanie Dan04, kod musi spełniać te 4 kryteria dotyczące tego, kiedy zadziała, czy nie. Powinieneś także wyjaśnić, w jaki sposób Twój kod sprawdza czas, ponieważ luz w poniedziałek rano / piątek wieczorem powinien dać szansę na twórcze sposoby skrócenia kodu.

  • nie wolno pracować od 00:00:00 w sobotę rano do 23:59:59 w niedzielę wieczorem
  • musi zawsze działać od 06:00:00 w poniedziałek rano do 19:59:59 w piątek wieczorem
  • może pracować albo nie pracować od 00:00:00 w poniedziałek rano do 5:59:59 w poniedziałek rano
  • może pracować albo nie pracować od 20:00:00 w piątek wieczorem do 23:59:59 w piątek wieczorem rano

edit2: Od razu oczywiste, że musi spełniać następujące 3 kryteria:

  • Nie wolno wywoływać funkcji, która wywołała DayOfWeek(lub podobną), bez użycia jej do obliczenia czasu funkcji.
  • Nie wolno używać soboty ani niedzieli ani ich skrótów w języku angielskim.
  • Nie wolno używać Sat lub Sun (lub w ich alternatywnych literach) bez identycznej nazwanej zmiennej, która nie została użyta do ustalenia dnia tygodnia lub przy określaniu, czy kod powinien zostać uruchomiony.
targumon
źródło
Jak definiujesz „weekendy”? Czy to w porządku, jeśli kod przestanie działać w piątek po południu zamiast czekać do północy?
dan04,
@ dan04 Zaktualizuję, aby rozwiązać ten problem.
3
jeśli pożądane są twórcze odpowiedzi, nie powinien to być golf golfowy. Jeśli pożądany jest kod golfowy, musisz obiektywnie zdefiniować „natychmiast oczywiste”.
John Dvorak,
czy czas należy rozumieć jako czas lokalny, czy GMT?
John Dvorak,
@JanDvorak Zaktualizowałem ograniczenia, aby były bardziej podobne do tej nadziei, że teraz jest lepiej: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Odpowiedzi:

11

Rebmu : 17 ( 27–10 , zaciemnionych) lub 30 nie zaciemnionych

Rebmu jest specjalnie zaprojektowany do gry w golfa kodowego, a jednocześnie jest czytelny (dla tych, którzy dostają „sztuczkę”), więc zasada zaciemniania jest niezgodna z jego zasadą. Ale:

DnowRjRkILd/7 6[pDT[adJk]]

Działa przez cały dzień w dni powszednie:

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

... ale w weekendy nic nie robi:

Input Integer: 10
Input Integer: 20

Wyjaśnienie:

Używanie rozrzucania i zauważania dużych liter jest osobnymi słowami, a brak wiodącego kapitału oznacza, że ​​nie tworzymy ustalonego słowa, otrzymujemy skrót Rebol:

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

Podsumowując to, co kończysz to:

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

Numery dat w Rebol są ponumerowane od 1 do poniedziałku do 7 w niedzielę. Bardziej kompetentnym sposobem na uzyskanie dnia tygodnia w dzień powszedni jest powiedzenie, d/weekdayale można go również uzyskać d/7. Moje preferowane rozwiązanie bez zmiany rzeczy tylko w celu dostosowania się do tego problemu byłoby bardziej jak:

rJrKilNOW/weekday 6[pDT[adJk]]

Ale gdyby zaktualizować słownictwo dotyczące ogólnego zastosowania do tego rodzaju problemu, który prawdopodobnie pojawia się wystarczająco często, aby nie chcieć za każdym razem popadać w pełne Rebol, prawdopodobnie ustawiłbym MON na SŁO w przedziale 1–7) i skracałbym TERAZ WEEKDAY, w którym momencie prawdopodobnie wyglądałoby to bardziej ...

rJrKilNW/wkdySAT[pDT[adJk]]

Notatki

Jak zwykle, sam program może być nieco krótszy, jeśli zezwolisz na przekazywanie danych wejściowych do Rebmu jako argumentów i po prostu zaakceptujesz wynik oceny (tutaj wartość typu time lub NONE) bez drukowania:

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

Również czas delta, daty, generowanie obrazów i szalona liczba rzeczy są już zawarte w pliku wykonywalnym Rebola, który ma pół megabajta i jest instalowany przy zerowej instalacji .

HostileFork mówi: nie ufaj SE
źródło
Rebmu jest niesamowity. Czy istnieje tłumacz napisany w języku innym niż Rebol?
primo,
@primo Dzięki! Nie, jest w prawie 100% zależny od Rebola, a jak już wspomniałem, jest to tylko cienka warstwa nad językiem (i co ciekawe, kompatybilna, jeśli cały kod jest pisany małymi literami ... patrz na przykład Hourglass ) . Rebol jest tutaj prawdziwą magią i wreszcie nabiera rozpędu od czasu jego otwartego pozyskiwania, więc zachęcamy do rozmowy z nami i RebolBot na czacie SO.
HostileFork mówi: nie ufaj SE
Pytam, bo naprawdę chciałbym zobaczyć, jak to zdejmuje się na anagolu , chociaż nie jestem pewien, ile wysiłku by to kosztowało, aby tłumacz mógł napisać w Rebolu.
primo,
@primo Przepraszam za opóźnienie w odpowiedzi ... Jestem zdecydowanie zainteresowany, aby tak się stało, więc jeśli wiesz, że ktoś ma kontakt. Mamy Rebmu na Cloud9 IDE, a także mamy możliwość uruchamiania nieinteraktywnych skryptów Rebmu za pośrednictwem usługi internetowej, z której korzysta RebolBot. Możesz również znaleźć moje przemówienie na interesującej konferencji Rebol / Red i być może pomóc przekonać ludzi, że powinno to być na anagolu. :-)
HostileFork mówi: nie ufaj
2

Skrypt golfowy, 51 56 - 10 = 46

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

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

Spełnia wszystkie trzy warunki i nie używa żadnych standardowych funkcji bibliotecznych, z wyjątkiem tego, co jest konieczne do uzyskania aktualnego czasu. Dlatego uważam, że kwalifikuję się do premii.

Jeśli chodzi o kryteria zaciemnienia - chociaż spełnia ono wymogi litery prawa, nie wydaje się bardzo niewinne. Jest całkiem oczywiste, że dzieje się coś z magicznymi stałymi liczbami 60 i 7. Niestety, jakiekolwiek zaciemnienie spowoduje podniesienie brwi.

Dane wejściowe: dwie liczby całkowite oddzielone spacjami

Dane wyjściowe: literał tablicy golfowej - dwie liczby całkowite (suma, czas w ms) oddzielone spacją i otoczone nawiasami kwadratowymi.

przykład:

;'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}"'jest ciągiem golfscript zawierającym dosłowny ciąg golfscript zawierający blok wykonywalny Ruby w celu odzyskania aktualnego czasu. Stos trzyma teraz dane wejściowe na dole, a przepis czasu na górze.
  • .~~klonuje przepis czasu i ocenia go dwukrotnie. Pierwsza ocena przekształca ciąg znaków w ciąg liczbowy, wykonując sekcję ruby. Druga ocena zamienia ją w liczbę. Stos zawiera teraz (od dołu) dane wejściowe, recepturę czasu i godzinę rozpoczęcia
  • @~+wyciąga dane wejściowe na górę, ocenia je i wykonuje dodawanie. Stos zawiera teraz przepis czasu, czas rozpoczęcia i sumę.
  • @);' "'+~~wyciąga przepis czasu, zmienia się '"'na' "' (patrz omówienie poniżej) i dwukrotnie analizuje ją. Stos zawiera teraz czas rozpoczęcia, sumę i czas zakończenia.
  • 2$-klonuje czas rozpoczęcia do góry i odejmuje go od czasu zakończenia. Stos zawiera teraz czas rozpoczęcia, sumę i różnicę czasu.
  • @86400/ ściąga czas rozpoczęcia do góry i konwertuje go z sekund na dni.
  • ((7%(dwukrotnie zmniejsza dni od początku epoki (był czwartek, chcemy soboty), przyjmuje modulo 7 i jeszcze raz zmniejsza. Mapy weekendów do -1 i 0, dni tygodnia do 1..5.
  • ,)=tworzy tabelę liczb całkowitych o tym rozmiarze. To dobrze - tablica o ujemnym rozmiarze jest pusta. Potem bierze swój ostatni element. Niestety niektórzy tłumacze jeszcze się nie zawieszają. Zamiast tego wyskakują zero - co można bezpiecznie odrzucić. Zamiast więc odrzucać, używamy go jako indeksu dla tej tablicy. Wybranie zerowego indeksu w końcu powoduje awarię interpretera, ale zabranie elementu spoza zakresu jest w porządku - nic nie zostaje zepchnięte na stos. W takim przypadku dostęp do tablicy jest zawsze poza zakresem, więc nie mamy nic do odrzucenia.
  • ]` pobiera stos i formatuje go jako tablicę golfa.
John Dvorak
źródło
Obawiam się, że twój kod tak naprawdę nie mierzy czasu operacji. Zamień dodatek na operację, która zajmuje kilka sekund, a zobaczysz, że twierdzi, że nie zajmuje to czasu. Omówiłem to (i obejścia) na moim blogu GolfScript .
Peter Taylor,
Myślę, że Golfscript kwalifikuje się jako zaciemnienie: PI nie może uwierzyć, że zajęło tak mało znaków! Czy powiesz nam, co się stanie, gdy uruchomisz go w sobotę?
@ LegoStormtroopr Podałem już przykład.
John Dvorak,
Ojej, mój błąd, całkowicie za nim tęskniłem. Wielki wysiłek.
1

JavaScript

Korzysta z tego narzędzia:

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

A oto faktyczna funkcja:

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

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

Mam nadzieję, że nie było to od razu oczywiste…

Ry-
źródło
2
@ChristopherWirt: Cool! Cieszę się, że przekroczyłem termin niewiedzy.
Ry-
Rok temu też nie było to zabawne, ale na pewno dam ci do dziś, że nie było to „oficjalne”;) Chyba że odpowiedź (jakoś) zostanie odrzucona.
Christopher Wirt