Rozwiązania F # znane w 140 znakach , a to jest problem z kodem Rosetta .
Wymagany wynik na stdout lub w zmiennej łańcuchowej dla roku wejściowego 2014
:
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
Zgodnie z żądaniem, w 1900 r .:
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
I 2000:
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
Jest to spowodowane tym, że daty wydają się nieprzyjemne w większości języków. Bardziej niż zezwalanie na biblioteki dat, mam nadzieję je zobaczyć! Ale jeśli nie jest to język podstawowy, zadeklaruj w nazwie posta (np. C # + Jon Skeet's NodaTime).
Wyjaśnienia:
- Zakres roku od 1900 do 3015
- kalendarz gregoriański
- Jeśli ma to inne znaczenie, cokolwiek jest konwencjonalne dla Wielkiej Brytanii / Londynu.
- Program przyjmujący przełącznik wiersza polecenia lub standardowe wejście jest w porządku, co daje wynik na standardowe wyjście
- Funkcja pobierająca wartość dla roku i zwracająca ciąg znaków jest również w porządku.
Nie dotyczy standardowych luk . Czekamy na rozwiązania APL, J, K i widzimy nowe biblioteki dat.
Odpowiedzi:
Dyalog APL z cal z dfns , 19 bajtów
Lepiej późno niż wcale!
Monituje o rok, zwraca listę dat w formacie rrrr md .
⎕
monit o wprowadzenie danych liczbowych i niech będzie to lewy argument do{
...}¨
anonimowa funkcja (znaleziona poniżej) zastosowana do każdego z nich⍳12
liczby od 1 do 12 (miesiące)Powyższa anonimowa funkcja wygląda następująco:
⍺⍵,
wstaw lewy i prawy argument (tj. rok i miesiąc) do2↑
pierwsze dwie postacie⊢⌿
najniższy wierszcal
kalendarz dla⍺⍵
lewy argument i prawy argument (rok i miesiąc)TryAPL online:
Wróć do tej strony po kliknięciu tutaj, aby zaimportować
cal
i jego zależności.Kliknij tutaj, aby uruchomić przypadki testowe.
źródło
+
-
<
≤
=
≥
≠
⌈
i⌊
praca z obiektami daty .Net .Rubin, 91 + 6 = 97
Działa całkiem dobrze.
select(&:sunday?)
jest ładna i, co zaskakujące,*' '
sama formatuje.źródło
chunk
zamiastgroup_by
.Bash 4.x + ncal, 57
Jeśli separatory nowego wiersza są w porządku zamiast spacji, możemy usunąć
-n
przełącznik i końcowe spacje zecho
instrukcji. Wydaje mi się, że nadal będzie działać bez shebang, więc też to usunąłem:Oryginalny skrypt (73 bajty):
Stosowanie:
Uwaga: wersje Bash wcześniejsze niż 4.0 pomijają wiodące zera z miesięcy. Można to naprawić dodając 5 znaków, zmieniając
{01..12}
na`seq -w 1 12)`
. Ponadto,tail -c-3
może powodować problemy w niektórych systemach, gdzie wyjściencal
zawiera spacje, ale nie jestem świadomy, że każdy zrobić.źródło
`…`
dobrego nawyku$(…)
.#!/bin/bash
do celów golfa.IBM DFSORT,
113 wiersze po 71, 72 lub 80 znakówDwie odpowiedzi z kolumnowym formatem wyjściowym przetrwały próbę czasu. To daje mi coś w rodzaju „pętli” w OUTFIL REPEAT = tyle razy kopiuje bieżący rekord.
Inna technika, aby dojść do wartości, która wydaje się dłuższa, ale krótsza, ponieważ nie mogę wypracować żadnego bezwarunkowego sposobu poradzenia sobie z 12. rekordem z następnego roku, a uczynienie go warunkowym oznacza włączenie
IFTHEN=(WHEN=
, dwa razy i kilka innych rzeczy. Zyskaj na huśtawkach (pierwszy miesiąc jest najprostszym sposobem, aby to zrobić) mocno stracić na rondach (szczególne wymagania dotyczące składni).Używa wbudowanej funkcji (wszystkie funkcje w DFSORT są wbudowane), aby znaleźć ostatni dzień miesiąca. Następnie dodaje jeden dzień (funkcja), aby przejść do pierwszego następnego miesiąca, i używa funkcji PREVDSUN, aby uzyskać poprzednią niedzielę (która zawsze będzie ostatnią niedzielą poprzedniego miesiąca, jak poprzednio).
Podczas przekształcania roku (danych wejściowych) w prawidłową datę, dla miesiąca używany jest dwucyfrowy numer sekwencyjny, a ta wartość jest również kopiowana dla danego dnia, ponieważ punkt początkowy nie ma znaczenia tak długo, jak jest ważny, ponieważ jesteśmy po ostatnim dniu miesiąca początkowo:
5,2
jest krótszy niżC'01'
.Oto szczegół:
OPCJA KOPIUJ - skopiuj plik wejściowy do wyjścia
OUTFIL - aby zezwolić na wiele plików wyjściowych, z różnym wyborem i formatowaniem, tworzyć sformatowane raporty. Używany zamiast krótszego
INREC
ze względu na użycieREPEAT=
.REPEAT = 12 - wyprodukuj 12 kopii każdego rekordu. W tym przykładzie może istnieć tylko jeden rekord wejściowy (w przeciwieństwie do poprzedniej wersji) z powodu SEQNUM.
5: - zacznij od kolumny 5 w rekordzie.
SEQNUM, 2, ZD - numer porządkowy, domyślnie zaczyna się od jednej, dwóch cyfr, „strefy dziesiętnej” (w przypadku znaku bez znaku, który będzie taki sam jak znak).
1,8 - skopiuj bajty 1 o długości 8 do bieżącej lokalizacji (9). Wynika to z faktu, że Y4T musi zobaczyć, że 8, w przeciwnym razie zostanie użyty inny format daty.
Y4T - data w formacie ccyymmdd (ze względu na 8 bezpośrednio przed nim).
LASTDAYM - Ostatni dzień miesiąca (możliwy również w tygodniu, kwartale i roku).
TOJUL = - wyjściowa konwersja daty dla funkcji daty (TOJUL jest o jeden znak mniejszy niż TOGREG)
9,7 - teraz, gdy ma 7 lat, Y4T będzie CCYYDDD.
ADDDAYS - dodaje liczbę dni, dostosowując się automatycznie, jeśli przejdzie do następnego miesiąca / roku (mogą to być również ADDMONS i ADDYEARS)
PREVDSUN - nadchodzi data juliańska, znajduje się poprzednia niedziela, TOGREG, aby uzyskać prawidłowy format wyjściowy, z separatorem „-” (może być czymkolwiek, co lubisz jako separatorem)
12X - puste miejsca, aby usunąć bałagan, który pozwolił nam to zrobić w tak krótkim czasie
Dane wyjściowe z powyższego na 2014 r. Wynoszą:
Potrzebne jest coś, aby powiedzieć SORT, co ma robić. Nie ma wartości domyślnej.
OPTION COPY
jest najkrótszy,SORT FIELDS=COPY
jest równoważny, ale dłuższy.Praca, którą wykonał tym razem
OUTFIL
(aby umożliwić użycie REPEAT). Kod roboczy to prawdopodobnie dowolny ze 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) lub 138 (70 + 68) (z wyłączeniem wiodących odstępów, wymuszonej kontynuacji i końcowych odstępów).Biorąc pod uwagę, że odbiorca musiałby wiedzieć, co robią, myślę, że mogę powiedzieć, że kod DFSORT wymienia ostatnią niedzielę każdego miesiąca dla każdego roku od 1900 roku (będzie działał od roku 0001, ale unikam badań, ponieważ cóż) do 9999 (chociaż DFSORT obsługuje lata do 9999, poprzednie rozwiązanie nie działałoby w roku 9999, ponieważ 12 data przypada na rok następny) można opublikować na Twitterze.
Dlaczego kod jest tak długi, jeśli istnieją szczególnie trafne funkcje wbudowane?
Definicje pól są efemeryczne. Pole jest zdefiniowane jako określona lokalizacja w danych (która jest rekordem) do natychmiastowego użycia. Innymi słowy, pola nie są zdefiniowane jako takie, ale są zdefiniowane dla każdego zastosowania i tylko do użytku. Funkcje daty muszą wiedzieć, które (spośród wielu) formatów daty są używane dla źródła, a dane wyjściowe muszą być w formacie daty, więc należy to określić.
Teraz, kiedy mamy randkę juliańską .... TBC?
Potrzebuje trochę
JCL
I plik wejściowy (inny wiersz JCL i trzy elementy danych instream):
Produkuje:
Będzie działał do 9999 roku.
DFSORT to produkt IBM do sortowania komputerów mainframe. Danymi można manipulować, ale ponieważ sortowanie jest kluczowe, a sortowanie jest często duże i długotrwałe, karty kontrolne DFSORT nie mają konstrukcji zapętlonych, więc nie możemy umieścić SORT w pętli. Sprawia, że rzeczy takie jak Golf są nieco zbyt skomplikowane.
Dlaczego publikować odpowiedź, ponieważ DFSORT ma
PREVDday
funkcję. Tak więc ostatnia niedziela w miesiącu jest łatwa. Jest to poprzednia niedziela (PREVDSUN) do pierwszego dnia następnego miesiąca.Fajnie było też robić to w jednym „operandzie” (OVERLAY), trochę tak, jakbyś robił to wszystko wewnątrz
sprintf
lub podobnie.Tutaj nie jest golfem:
Chociaż nie jest to do końca nadużycie, nie byłoby w zwyczaju próbować wtłoczyć to wszystko w jedną OVERLAY, a jest kilka pozornie niepotrzebnych rzeczy, które są potrzebne, aby wszystko mogło przejść w jedną OVERLAY. Jest trochę miejsca na grę w golfa, ale ponieważ usunęłoby to co najwyżej jedną linię, nie jestem kuszony.
INREC jest przetwarzany dla każdego rekordu.
OVERLAY pozwala na zmianę treści istniejącego rekordu. Jeśli rekord zostanie przedłużony poza jego długość, nie stanowi to problemu.
Nadchodzi rok 1,4. Ma dosłownie 0201, a następnie kolejne 1,8 s powtarzają je 11 razy, aby dać jeden długi uchwyt 96 bajtów,
12. rok w rozszerzonym bieżącym rekordzie zostaje dodany do 1, a miesiąc do 1 (styczeń).
Pozostałe 10 miesięcy zmienia się na 3 do 11.
Następnie jest 12, w odwrotnej kolejności (z powodu OVERLAY) tego typu rzeczy:
N: jest numerem kolumny w rekordzie. X wstawia spację. 89,8 pobiera dane z tej kolumny / długości, Y4T traktuje je jako datę CCYYMMDD, PREVDSUM opracowuje poprzednią niedzielę, TOGREG = Y4T (-) wyprowadza je jako gregoriańską datę CCYY-MM-DD.
Ponieważ dostajesz śmieci, jeśli źródło i cel konkretnej części OVERLAY nakładają się destrukcyjnie, końcowe zmiany
11:X,18,120,6X)
układają i maskują trochę bałaganu.Podręczniki i dokumenty można znaleźć na stronie : http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 i zawierają ponad 900 stron przewodnika programowania aplikacji DFSORT.
Podobnie jak w przypadku wszystkich produktów IBM, wszystkie podręczniki są dostępne za darmo (z wyjątkiem bardzo drogiej liczby bardzo drogich, które tylko niewielka liczba ludzi na świecie mogłaby nawet udawać, że rozumie).
Wszystkie karty kontrolne DFSORT muszą zaczynać się od pustego pola. Kolumna 72 służy tylko do kontynuacji (każda niepusta wystarczy, ale * jest umowna). Po kolumnie 72 następuje obszar numeru sekwencji, który jest ignorowany, dzięki czemu każdy rekord ma 80 bajtów.
Może jeszcze kilka rozwiązań.
źródło
Bash, 63 bajty
Wynik:
źródło
for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}
- 60 bajtów-v
param todate
jest specyficzny dla daty BSD. To działa na OSX, ale nie na większości Linuksa - być może powinno to być zaznaczone w odpowiedzi.Python 2 - 189 bajtów
Wprowadź datę za pomocą STDIN.
Jeszcze więcej golfa można zrobić. Program trochę przesadza, dla zabawy:
Uwagi
zfill
jest potrzebny przez lata ze względu na zakres wejściowy ani dni, ponieważ zawsze będą one przekraczać 20 latPython 2 - 106 bajtów
Nie takie zabawne rozwiązanie:
calendar.monthrange
zwraca dwie liczby: dzień tygodnia, w którym miesiąc zaczyna się od (w
) oraz liczbę dni w miesiącu (n
). Rozwiązanie jest trochę sprzeczne z intuicją ze względu na haczyk - powracający dzień tygodnia zaczyna się od 0 dla poniedziałku , a nie niedzieli! Jest to jednak równoważone przez fakt, żen
jest oparty na 1.źródło
$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
JavaScript (ES6) 155
145Edycja Naprawiono problemy ze strefą czasową Może być krótsza, jeśli zostanie wykonana cyklicznie. Może.
źródło
new Date(y,0,++i,9)
. Nie udaje się to również w przypadku 2100 i więcej lat przestępnych, ponieważ JS nie ma informacji o tych latach przestępnych, a zatem nie maFeb 29
wcale w latach przestępnych w przypadku 2100 lat i powyżej.new Date(2014,0,26,9)
była niedziela podając prawidłowyISO
ciąg, jak równieżgetDay()
jako0
.JavaScript, ES6,
222 219199 bajtówNie widziałem żadnej odpowiedzi JavaScript na wiki rosetta.
No to ruszamy:
Tworzy to funkcję,
S
która zwraca ciąg o pożądanym wyniku. funkcja dba również o lata przestępne.Ze względu na ES6 działa to tylko w najnowszym Firefoksie.
Dzięki apsillerom na końcówkę, która zmniejszyła ją do 200 bajtów
Znajdź nieprzygotowaną wersję poniżej jako fragment kodu, który możesz uruchomić tutaj:
źródło
2100
Wyjście wejściowe2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02
jest nieprawidłowe.Rebol -
120 116 80 7976Niegolfowany + kilka adnotacji:
Przykład obliczeń niedzielnych w konsoli Rebol:
źródło
CJam,
122102 bajtówNie korzysta z żadnej formy biblioteki dat. Sądzę, że nadal można dużo grać w golfa.
Sprawdź to tutaj.
źródło
R, 128 znaków
Z podziałami linii:
źródło
C # 255
Nie golfił
Edycja: zmodyfikowano, aby drukować tylko w ostatnią niedzielę :)
źródło
q, 67
źródło
„Och, nie, on znowu!”
Java -
259246 bajtówWersja bez golfa:
Stosowanie:
Wynik:
Jeszcze inna odpowiedź „wstawmy odpowiedź Javy tylko dla kopnięć”. No cóż. Ale przynajmniej, skoro starałeś się dotrzeć do tego punktu mojej odpowiedzi, postaram się zanudzić trochę więcej i wyjaśnię moje rozumowanie.
Metoda
g
otrzymuje żądany rok i dla każdego miesiąca tworzyGregorianCalendar
obiekt (miesiące zaczynają się od 0 do 11). Następnie pierwszyc.set
ustawia dzień tygodnia jako niedzielę, a drugi deklaruje, że chcemy ostatniego tygodnia miesiąca - jak widać w oficjalnej dokumentacji . WSystem.out.println
drukuje daty tej niedzieli (jeśli robimy to prawo, rok będzie drukowanec.get(c.YEAR)
, ale używający
ponownie golenie off 13 znaków), a miesiąc ma być sformatowany dodać zera w okresie od stycznia do września (oraz wartość jest zwiększana, ponieważ cóż, miesiące tutaj są reprezentowane 0-11) i drukowany jest dzień ostatniej niedzieli. Ta procedura jest powtarzana przez pozostałe jedenaście miesięcy.źródło
C #,
212, 237Z podziałem linii
Produkcja za 2014 r
źródło
C # 171
Funkcja zwraca ciąg znaków.
Nie golfił
źródło
C # 194
używając Linq:
Nie golfił
Wynik
źródło
Mathematica - 171
Zawinięte w anonimową funkcję zwraca ciąg
Pierwszy golf matematyczny. Wydaje mi się, że można to znacznie zmniejszyć.
źródło
VB-192
Mogło być gorzej ^ ^
Mój drugi i ostatni wpis (nie sądzę, że mogę go zmniejszyć)
142
źródło
Rubinowy 76
Używa parametru wiersza polecenia
ruby sundays.rb 1900
. Korzysta z biblioteki daty.źródło