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:
- 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.
- 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ć)
- 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
, date
bibliotekę obiektów javascript java.util.Date
i tym podobne. Funkcje obliczania timedeltas do wykonania, takie jak timeit
moduł 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.
źródło
Odpowiedzi:
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:
Działa przez cały dzień w dni powszednie:
... ale w weekendy nic nie robi:
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:
Podsumowując to, co kończysz to:
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/weekday
ale 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: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 ...
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:
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 .
źródło
Skrypt golfowy,
5156 - 10 = 46http://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:
'"#{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.źródło
JavaScript
Korzysta z tego narzędzia:
A oto faktyczna funkcja:
Mam nadzieję, że nie było to od razu oczywiste…
źródło