Jaki jest najkrótszy program, który może przewidzieć, że następny piątek przypadnie na 13 dzień miesiąca?
- Musi być kompletnie działającym programem (nie tylko funkcją / podprogramem)
- Należy wydrukować datę w następującym formacie:
YYYY-MM-DD
- Zezwól użytkownikowi na podanie daty początkowej jako argumentu wiersza poleceń lub poprzez
STDIN
- Jeśli użytkownik nie poda daty rozpoczęcia, użyj dzisiaj jako daty rozpoczęcia.
- Jeśli datą rozpoczęcia jest piątek trzynasty, program powinien znaleźć następny piątek trzynasty.
Gdybym miał dzisiaj uruchomić program (16 lutego 2011 r.), Powinienem uzyskać następujące dane wyjściowe.
$ ./fr13th 2013-05-09
2013-09-13
$ ./fr13th 2007-06-29
2007-07-13
$ ./fr13th 2007-07-13
2008-06-13
$ ./fr13th
2011-05-13
2013-9-13
wynik byłby odpowiedni dla pierwszego przykładu?Odpowiedzi:
Windows PowerShell, 74
Dość bezpośredni. Jednym z być może mylących bitów jest użycie
"Get-Date $args" | Invoke-Expression
bieżącej daty (jeśli$args
jest pusta) lub daty podanej$args
bez zgłaszania błędu.Wariant 72-bajtowy:
Ale to trwa wieki ... nie zwiększa to czasu danych o cały dzień z każdą iteracją, ale zamiast tego tylko 900 nanosekund. Ale dwa bajty krótsze.
Wariant 67-bajtowy:
Jest to nieco zależne od ustawień regionalnych; jeśli zawiedzie na twoim komputerze, spróbuj wcześniej ustawić format daty na ISO-8601. :-)
Aha, i można go przekształcić w 65 bajtów, tak jak w wersji 72-bajtowej.
Historia:
for
. Porównanie jako odejmowanie zamiast tego-eq
oszczędza kolejne dwa bajty.date
Ciąg formatu uniksowego jest nieco krótszy.yyy-MM-d
wystarcza (ponieważ rok jest zawsze dłuższy niż trzy znaki, a dzień jest zawsze 13. Dziękuję za to Ty Auvilowi.źródło
iex
? Zamiast tego spróbuj po prostu (date $ args).$null
doGet-Date
dostaniesz błąd, a nie bieżącą datę."date $args"|iex
jednak decyduje albo o dacie podanej,$args
albo o dacie bieżącej, właśnie tego chcemy tutaj.bash, 75
Jest to nieco zależne od ustawień regionalnych; jeśli nie na komputerze, spróbuj
export
ingLC_ALL=C
wcześniej.źródło
Ruby,
9675 znakówPobiera datę od standardowego. Aby nie podawać daty, naciśnij ctrl-d.
Bardzo dziękuję za pomoc Ventero.
Nie golfowany:
Próbka IO:
źródło
d.wday*d.day==65
jest o 4 znaki krótszy. I powinieneś być w stanie wymienićDate.today.to_s
z"thu"
require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d
. I możesz odczytać datę ze standardowego przy pomocygets
zamiast$*[0]
zapisywać inną postać (wpisz EOF, aby uzyskać domyślne zachowanie).C #, 185
Oparty na rozwiązaniu C # Andrew Koestera , ale mocno zmodyfikowany po drodze. W końcu dotarłem do rozwiązania podobnego do mojego rozwiązania PowerShell:
źródło
Perl (i inni), 114
Perl 5.10 lub nowszy, uruchom z
-E 'code here'
lub-M5.010 file
. Potrzebydate
(z coreutils dla Linuxa) ical
(z util-linux)Przykładowy przebieg:
Nie jestem pewien, kiedy utrzymane zostanie wiodące zero na miesiące przed październikiem. Jest oczywiście stracone, gdy rok mija; wydaje się, że zostanie zachowane, gdy odpowiedź będzie dopiero w przyszłym miesiącu. Nazwijmy to niezdefiniowane zachowanie - hej, to gra w golfa!
źródło
GRZMOTNĄĆ
WYKORZYSTANA KONCEPCJA:
PRZYKŁADOWE I / O
źródło
DO#
240 znaków. C # potrzebuje trybu „uruchom wewnątrz funkcji tylko”!
Bez golfa:
Wyjście testowe
źródło
D: 227 znaków
Bardziej czytelnie:
Zabawne jest to, że chociaż std.datetime D sprawia, że ten rodzaj kodu jest bardzo łatwy do napisania, jest on również niezwykle szczegółowy - głównie ze względu na dokładne (a zatem długie) nazwy funkcji. Tak więc użyteczność i łatwość konserwacji kodu jest bardzo wysoka, ale jego zdolność do gry w kod jest raczej niska.
źródło
Python - 166 znaków
Odczytuje ze standardowego wejścia, więc jeśli chcesz dzisiejszą datę, musisz podać pusty wiersz
źródło
SQLite, 374 znaków
(Dodano podział wierszy w celu zapewnienia czytelności; nie jest uwzględniany w liczeniu).
Wymóg „Zezwól użytkownikowi na podanie daty rozpoczęcia jako argumentu wiersza poleceń lub poprzez STDIN” został pominięty z powodu ograniczeń technicznych.
Pierwsze 4 instrukcje tworzą tabelę (R) z pojedynczą kolumną zawierającą wszystkie liczby całkowite od 0 do 4095.
Piąte stwierdzenie tworzy tabelę (F) z wszystkich piątków trzynastych między 2000-10-13 a 2340-12-13.
Szóste oświadczenie po prostu zwraca pierwszy piątek trzynastego po bieżącej dacie (UTC).
źródło
PHP - 103
(brutalna siła)
Nie golfowany:
Test:
źródło
!=
na-
. Możesz także zapisać 2 znaki, przesuwając w górę$d->modify('next fri')
w sekcji przyrostowej pętli.-r
i nie potrzebujesz tagu. Użyj domyślnej konfiguracji z-n
i nie potrzebujesz@
.\n
jest niepotrzebne.echo
zamiastdie
zapisuje kolejny bajt.strtotime
zamiastDate
klasy można zapisać jeszcze jeden lub dwa.C #,
206194 znakówAktualizacja
Jest to nieco inne podejście do problemu, więc swoją drugą próbę zostawiłem tutaj w całości.
Tutaj znajduję „bieżący” piątek tygodnia, a następnie zwiększam o 7, aż znajduję taki, który ma 13 lat. Użyłem także Joeya do formatowania pętli i wyjścia, aby zgolić kilka znaków.
Nie golfowany:
Oryginalny:
Jest to podobne do powyższego Andrew, ale było wystarczająco dużo różnic, postanowiłem opublikować osobną odpowiedź zamiast komentować i sugerować zmiany.
Nie golfowany:
źródło
R, 113 znaków
Przykładowe przebiegi:
źródło
Perl 6 , 69 bajtów
Wypróbuj online!
Dzięki @ ASCII-tylko dla -5
źródło
day-of-week==5
JavaScript
ps: tak, wiem, złamałem pierwszą zasadę (nie może być tylko funkcją)
Testy powłoki javascript
źródło
T-SQL
359285253 znakówChciałem po prostu rzucić okiem na rozwiązanie SQLite za pomocą mojej nie sprytnej, pełnej funkcji daty za pomocą procedury T-SQL.
Aktualizacja: Mój pierwotny lęk, że zrobienie przyrostu dziennego zajmie więcej miejsca niż przyrost miesięczny, było bardzo błędne.
Wyniki testu (SSMS):
źródło
Kolejny Javascript, 153
Publikuję kolejną odpowiedź w języku JavaScript, ponieważ nie mogę skomentować pierwszego ...
Wykonaj za pomocą nodeJS:
źródło
Python 3.3, 166 znaków
Wejściowy jest w formacie
2013 1 1
,lub po prostu naciśnij Enter, aby użyć dzisiejszej daty (dla tego wyniku to 2013/12/11)
(w rzeczywistości istnieje połączenie mojego rozwiązania z @gnibbler, które liczy 144 znaki)
Bardzo ładna linia
while t.day*t.weekday()-65:
pochodzi z rozwiązania @ gnibbler.źródło
Japt, 35 bajtów
-8 bajtów dzięki @ASCIIOnly!
Spróbuj!
źródło
toISOString
konwertuje na UTC, który zmienia datęK
czas jest przechowywany jako czas lokalny?Swift 4 , 310 bajtów
Wypróbuj online!
-4 dzięki TagTaco.
Niestety...:
Int
s jakoBool
.??
.!=
również potrzebuje odstępów, aby nie interpretować go jako rozpakowywanie.źródło
VB.net (96c *)
Wejście
Więc moja ocena jest podzielona jako taka
źródło
Rebol, 136
Nie golfowany:
Przykładowe użycie:
źródło
Java 8,
200197 bajtówWyjaśnienie:
Wypróbuj tutaj (usuń argument, aby użyć bieżącej daty).
UWAGA: Domyślny format Java, gdy drukowanie już jest
yyyy-MM-dd
.źródło
05AB1E , 141 bajtów
05AB1E nie ma żadnych wbudowanych obiektów Date ani obliczeń. Jedynym wbudowanym pod względem dat jest dzisiejszy rok / miesiąc / dzień / godziny / minuty / sekundy / mikrosekundy.
Z tego powodu prawie cały kod, który widzisz, to ręczne obliczenia umożliwiające przejście do następnego dnia i obliczanie dnia tygodnia.
Pochodzi głównie z mojej odpowiedzi 05AB1E w wyzwaniu Odliczanie dnia pracy (dlatego ja edytowany że jeden około godziny temu, gdy natknąłem się na błąd ..)
Dane wejściowe są ciągiem w formacie
dd-MM-yyyy
(ale dane wyjściowe są w formacieyyyy-MM-dd
, ponieważ jest to jedna z reguł wyzwania).Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło