Znajdź datę najbliższą docelowej dacie dla danego dnia tygodnia.
Na przykład, biorąc pod uwagę datę 20161219
i dzień tygodnia Friday (6)
, odpowiedź brzmi 20161216
.
Innym przykładem, biorąc pod uwagę datę 20161219
i dzień tygodnia Wednesday (4)
, odpowiedź jest 20161221
.
Ostatnim przykładem, biorąc pod uwagę datę 20161219
i dzień tygodnia Monday (2)
, odpowiedź brzmi 20161219
.
Zasady:
- Format daty dla danych wejściowych i wyjściowych musi być zgodny. W przykładach użyłem
yyyymmdd
, ale możesz użyć dowolnego formatu, o ile rok (co najmniej dwie cyfry), miesiąc i dzień miesiąca są „czytelne dla człowieka”. - Dzień tygodnia jest wprowadzany jako liczba całkowita. W moim przykładzie niedziela jest pierwszym dniem tygodnia, dlatego jest dniem tygodnia
1
. Możesz mieć dowolną numerację w Dniu Tygodnia, o ile zauważysz, że różni się ona od przykładu. - Lata 1970–2030 muszą zostać uwzględnione.
- Dozwolone są narzędzia i biblioteki danych w języku potocznym, ale uliczne dane są przyznawane tym, którzy zdecydują się ich nie używać.
- Najmniej wygranych bajtów .
Odpowiedzi:
Perl 6 , 46 bajtów
Lambda, która akceptuje dwa argumenty: Ciąg daty w
yyyy-mm-dd
formacie i numer dnia tygodnia między1
= poniedziałek a7
= niedziela.Wyjaśnienie:
Przy użyciu formatu daty i dnia tygodnia użytego w przykładach będzie to 88 bajtów:
źródło
Perl 6 , 83 bajtów
Spróbuj
Rozszerzony
źródło
JavaScript (ES6), 93 bajty
Używa
%Y-%m-%d
formatu daty. Jeśli%a %b %d %Y
jest akceptowalnym formatem daty, to dla 82 bajtów:Mógłbym zaoszczędzić kolejne 2 bajty, wymagając od niedzieli = 10 do soboty = 16, ale to głupiutki dzień mapowania tygodnia. Poprzednie
142141 bajtów (dzięki @Guedes) wersja, która używała określonego formatu daty RRRRMMDD, z wyjaśnieniem:To wydaje się zbyt długie. Objaśnienie: Najpierw wstawia
-
s do daty, aby uzyskać format ISO, którynew Date
można następnie przeanalizować. Następnie porównuje pożądany dzień z faktycznym dniem, aby uzyskać wartość pomiędzy-3
i3
dla rzeczywistego przesunięcia. Magia9
pochodzi z7
(ponieważ%
jest to modul CPU, a nie true modulo) plus3
(dla-3
offsetu) minus1
(ponieważn
ma indeks 1 i indeksgetDay
0). Data jest następnie konwertowana z powrotem do formatu ISO, a niepożądane znaki są usuwane.źródło
.replace(/(?=..(..)?$)/g,'-')
Python,
150149 bajtówOouuf, 149. repl. It
Nienazwany funkcja, która pobiera ciąg
s
, jako datę (w formacie określonym ciągiemt='%Y%m%d'
zarówno wejście i wyjście) i numer w [1,7]n
.Sprawdza siedem dni od trzech dni przed trzema dniami po tym, jak podano dla żądanego dnia tygodnia.
Tydzień
datetime
zaczyna się w poniedziałek i jest zerowy, więc test jest(n-2)%7==d.weekday()
.źródło
Bash + coreutils, 50
Wypróbuj online .
date -d$1 +%u
podaje dzień tygodnia (1..7); 1 to poniedziałek3 + 7 - 1
. 3 dostosowuje zakres wejściowy dla zakresu [-3, 3] i jest ponownie odejmowany po modulo. 7 jest wymagane, ponieważ modulo bash jest takie samo jak modulo procesora i może dać -ve wyniki - dodanie 7 dopasowań we właściwym zakresie. -1 oznacza, że na wejściu 1 oznacza niedzielę, ale przy wyjściu% u 1 oznacza poniedziałek.date
następnie analizuje<input date> + <magic factor>days
i przedstawia je w formacie RRRRMMDD.źródło
SAS Macro Language, 110 bajtów
Okropny język golfa, ale oto wyjaśnienie (od wewnątrz):
Utwórz makro,
s
które akceptuje wprowadzanie datyd
i numeryczny dzień tygodniaa
. Następnie%eval(%sysfunc(putn(&d,8.))-4)
konwertuje datę na datę numeryczną SAS i zmniejsza ją o 4 dni. Następnieintnx
funkcja zwraca następne wystąpienie określonego dnia tygodnia.putn
następnie formatuje datę z powrotem do rrrrmmdd i%put
wypisuje dane wyjściowe do dziennika.źródło
Mathematica,
8549 bajtówFormat wejściowy dla dat jest albo listą podobną,
{2016, 12, 16}
albo faktycznąDateObject
(myślę, że kilka innych również działa, ale je przetestowałem). W obu przypadkach format wyjściowy zostanie dopasowany automatycznie. Numeracja dni zaczyna się od1
poniedziałku.Chodzi o to, aby obliczyć różnicę między wejściowym dniem roboczym a docelowym dniem roboczym za pomocą,
#2-#~DateValue~"ISOWeekDay"
a następnie zmapować go[-3, 3]
za pomocą modulo z przesunięciem (tjMod[...,7,-3]
.). Wynik jest po prostu dodawany do daty wejściowej (domyślną jednostką dodawania obiektu daty są dni).źródło
R,
119 7756 bajtówNienazwana funkcja, która pobiera dwa dane wejściowe: datę
D
(ciąg) i dzieńd
(numerycznie).Korzysta z funkcji
wday()
zlubridate
pakietu. Może wygodnie konwertowaćDate
obiekty na dni tygodnia,1
domyślnie traktowane jako niedziela.Edycja: I / O jest teraz domyślną
as.Date()
funkcją:"YYYY-mm-dd"
Nieoznakowany i wyjaśniony
Edycja: Teraz tworzy sekwencję
+-3
dni, w których można znaleźć każdy dzień tygodnia. Następnie musimy dopasować tylko jeden dzień, co znacznie ułatwiło problem.źródło