Ponieważ dzisiaj przypada 26. sekunda przestępna , Twoim wyzwaniem będzie podanie daty i godziny każdej drugiej sekundy przestępnej w GMT lub UTC, która miała miejsce do tej pory, a także tej, która ma miejsce dzisiaj.
Wkład
Brak danych wejściowych.
Wydajność
1972-06-30 23:59:60
1972-12-31 23:59:60
1973-12-31 23:59:60
1974-12-31 23:59:60
1975-12-31 23:59:60
1976-12-31 23:59:60
1977-12-31 23:59:60
1978-12-31 23:59:60
1979-12-31 23:59:60
1981-06-30 23:59:60
1982-06-30 23:59:60
1983-06-30 23:59:60
1985-06-30 23:59:60
1987-12-31 23:59:60
1989-12-31 23:59:60
1990-12-31 23:59:60
1992-06-30 23:59:60
1993-06-30 23:59:60
1994-06-30 23:59:60
1995-12-31 23:59:60
1997-06-30 23:59:60
1998-12-31 23:59:60
2005-12-31 23:59:60
2008-12-31 23:59:60
2012-06-30 23:59:60
2015-06-30 23:59:60
Zasady
Ponieważ wątpię, aby było wiele wbudowanych, które pozwalają na sekundę przestępną, pozwolę im.
Standardowe luki są niedozwolone.
Najkrótszy kod wygrywa.
Format daty musi mieć zerowany miesiąc i 4-cyfrowy rok, a także czas wojskowy i spację oddzielającą czas od daty. Umieszczenie UTC
na końcu jest opcjonalne. Twój wybór myślników lub ukośników.
EDYCJA: Tak, jak przewidywano, stało się to wyzwaniem kodowania. Gdyby tylko kodowanie mogło naprawić drugi problem, ... cały nasz kod byłby o wiele bardziej praktyczny. Może potrzebujemy pomysłów na więcej zabawy z praktycznymi zastosowaniami?
źródło
Odpowiedzi:
CJam,
72706964 bajtówWypróbuj online w interpretatorze CJam .
Pomysł
Zaczynamy od zakodowania każdej sekundy przestępnej jako 2 * (Y - 1972) + D , gdzie D wynosi 1, jeśli występuje w grudniu, a 0 w przeciwnym razie.
Tablica wszystkich zakodowanych sekund przestępnych to:
Nazwijmy to tablica L .
Ponieważ tablica jest w porządku rosnącym, możemy przechowywać kolejne różnice zamiast rzeczywistych liczb:
Traktując tę tablicę jako cyfry liczby podstawowej 15, otrzymujemy liczbę całkowitą
które cyfry w bazie 240 (przesyłane do postaci) są
Kod
źródło
R
78 78bajtówWbudowane, mówisz? Dobrze...
R ma zmienną automatyczną,
.leap.seconds
która zawiera datę i godzinę drugiego wstawienia przestępnego, podaną w czasie lokalnym systemu. Począwszy od wersji R 3.2.0, nie obejmuje to dzisiaj, więc dodałem to ręcznie.Niegolfowane + wyjaśnienie:
Możesz spróbować online !
źródło
HTML, 594 bajty
¯ \ _ (ツ) _ / ¯
źródło
working
kod HTMLcode golf
.C,
160146141140 bajtówPo raz pierwszy nie jestem pewien, jakie są „standardowe luki”. Oczywiście mam ostrzeżenia printf.
160 bajtów:
Pierwotnym pomysłem jest kodowanie sekund przestępnych za pomocą dwóch bitów rocznie: jeden dla czerwca i jeden dla grudnia. Kodowanie jest zużywane pojedynczo przez wewnętrzną pętlę while. Bez 128-bitowej liczby całkowitej niezbędna jest zewnętrzna pętla while. Reszta to księgowość i matematyka. :-)
141 bajtów:
Zastosowanie sugerowanych wskazówek sprowadza go do 146 bajtów. Potem znalazłem sposób, aby uprościć warunek zewnętrzny while (od Y <2000 do tylko Z), obniżając go do 141 bajtów. Tak blisko tweeta!
140 bajtów:
Zauważyłem, że kreska w dacie może zostać wyeliminowana poprzez uczynienie dnia ujemnym. Nie można tego zrobić także z miesiącem, ponieważ w czerwcu prowadzi zero. Ale teraz przynajmniej mieści się w tweecie!
Ładna wersja:
Wersja bonusowa:
Wyeliminowałem zewnętrzną pętlę poprzez przesunięcie bitów jednej 64-bitowej liczby całkowitej na drugą, ale ma ona 150 bajtów, z powodu dość długiego „niepodpisanego długiego długiego”; gdybym mógł użyć czegoś takiego jak „uint64”, byłoby to 138 bajtów.
źródło
for
pętli pozwoli zaoszczędzić trochę bajtów. BTW,int main()
->main()
. Może ci się to bardzo przydać .X>>=1
jest taki sam jakX/=2
,6*(2-Z)
jest taki sam jak12-6*Z
i4362608640
jest o jeden bajt krótszy niż0x104082000
.int
W przódmain()
jest niepotrzebne, a jeśli zmienimain()
sięmain(Z)
potem można usunąć deklaracjęZ=1
.if(X&1)printf(...);
dziękiX&1?printf(...):1;
czemu oszczędzasz 1 bajtwhile(X){...}
używać przecinków, aby usunąć nawiasy klamrowe -while(X)X&1?printf("%d-%02d-%d 23:59:60\n",Y,6*(2-Z),31-Z):1,Y+=Z^=1,X>>=1;
oszczędzając kolejne 2 bajtyPython 3, 91
Używa kodowania i formatowania ciągów przez Sp3000 , ale przechowuje wartości w obiekcie bajtów Python 3 zamiast magicznej liczby.
Kodowanie wymaga tylko 86 z 256 możliwych wartości bajtów, więc zakres znaków do wydrukowania jest używany, aby wyglądać ładniej.
źródło
Brainfuck, 806
Możesz uruchomić go na tym tłumaczu online.
źródło
Python 2,
111104 bajtówKodowanie podstawowe i więcej kodowania podstawowego.
źródło
GNU sed + data: 112
Typowe dystrybucje Linuksa mają także wbudowane sekundy przestępne. Korzystanie z GNU sed i data:
GNU sed + data: 90
Zabezpiecz kilka postaci, odcinając ścieżkę:
GNU sed + data dostrojona przez Toby Speight: 84
Wersja głęboko golfowa zaproponowana w komentarzach:
źródło
date
(GNU 8.23) wyświetla je jako pierwszą sekundę następnej minuty. Czego używasz, który rozumie 60-sekundową minutę?-r
flagą, zastępującdate
w zs///e
modyfikatorem, a zastąpienie%Y-%m-%d
w%F
wdate
: TZ = UTCsed -nr 's/^([0-9]+).*/date -d "1900-1-1 \1sec" "+%F %T"/ep' /u*/s*/z*/leap*
1899-12-31 \1sec
daty i na stałe wpisując23:59:60
czas:sed -nr 's/^([0-9]+).*/date -d "1899-12-31 \1sec" "+%F 23:59:60"/ep' /u*/s*/z*/leap*
JavaScript ( ES6 ) 125
Nowa linia wewnątrz `` jest znacząca i liczona.
Aby przetestować, uruchom poniższy fragment kodu (tylko EcmaScript 6, tylko Firefox)
źródło
PHP, 198 bajtów
Niestety nie wiem, czy mogę wstawić
\n
funkcję daty. Jeśli tak, to o 3 bajty mniej z powodu.""
.źródło
(int)
i usunąć trochę białych znaków. Data generuje błąd, jeśli domyślna strefa czasowa nie jest ustawiona, ucisz ją za pomocą@
. 187 bajtów:foreach([.5,1,2,3,4,5,6,7,8,9.5,10.5,11.5,13.5,16,18,19,20.5,21.5,22.5,24,25.5,27,34,37,40.5,43.5]as$d){$h=$d-ceil($d);echo@date("Y-m-d 23:59:60",mktime(0,0,0,-6*$h,31+$h,$d+1972))."\n";}
Kod maszynowy 8086 + DOS, 92 bajty
Hexdump kodu:
Aby uruchomić, zapisz 92 bajty w
com
-pliku i uruchom pod 32-bitowym systemem Windows lub DOSBox.Kod wykorzystuje bitmapę z 87 bitami, jeden na pół roku. Bity są ułożone w grupy po 16, zaczynając od MSB.
Dekodowanie mapy bitowej:
Ze względu na strukturę kodu niektóre bity są tracone podczas dekodowania, więc musiałem je powtórzyć. To powtarzanie nie powoduje rozdęcia mapy bitowej, ponieważ musiałem uzupełnić 87 bitów do 96 bitów.
Po wydrukowaniu (lub nie wydrukowaniu) sekundy przestępnej kod zwiększa datę o pół roku przy użyciu manipulacji kodami ASCII komunikatu wyjściowego.
Kod źródłowy (może być złożony
tasm
):źródło
Pyth -
8884 bajtówKonwertuje na char, aby skompresować dane i zapisuje dane
06-30
kontra12-31
jako liczbę binarną.(na końcu jest miejsce)
Wypróbuj tutaj online .
źródło
Python 2,
123121116114111Udało mi się to zrobić dość krótko, ale nie jestem pewien, jak długo może być krótszy. Próbowałem użyć
exec
, ale formatowanie staje się zbyt kosztowne.Użyłem podstawowego kodowania tabeli 16 z powiązanej strony Wikipedii.
Edycja: użycie kodowania szesnastkowego jest krótsze niż baza 36 (patrz wersja mniej golfowa).
Wypróbuj tutaj
Mniej golfa:
źródło
C,
155149147 bajtówOto inne podejście w C, wykorzystujące ciągi znaków i kodowanie długości przebiegu. Nie tak zwięzłe jak moje inne rozwiązanie C, ale może można to poprawić?
155 bajtów:
Używanie ciągu do przechowywania miesiąca / dnia.
149 bajtów:
Eliminowanie ciągu miesiąca / dnia.
147 bajtów:
Eliminacja inicjalizacji roku.
144 bajty:
Gdybym ponownie kodował bufor, aby licznik pominięć obowiązywał przed uruchomieniem (a nie po nim), mógłbym zmienić kolejność instrukcji w zewnętrznej pętli while, użyć operatora przecinka i wyeliminować nawiasy klamrowe, oszczędzając 2 bajty.
Mogę zapisać kolejny bajt, ustawiając dzień na ujemny (jak w moim innym rozwiązaniu).
Ładny:
Wyjaśnienie:
Przebiegi są kodowane w bajtach. Każdy bajt ma jeden bit do powiedzenia, czy jest to czerwiec, czy grudzień, 3 bity dla liczby długości, 3 bity dla liczby pominięć i 1 nieużywany bit wysoki.
Liczba pominięć to liczba lat, które należy pominąć po biegu; jest przesunięty o -1, aby pozwolić na dwie sekundy przestępne w 1972 roku. Długość to ile lat z rzędu; prawdopodobnie można go zrównoważyć +1, ale obecnie nie jest.
Tak więc bajt oznacza: „Wykonaj LENGTH lat CZERWCA (lub GRUDZIEŃ) lat przestępnych sekund, a następnie pomiń SKIP-1 rok” przed przejściem do następnego bajtu.
Bajty są przesunięte o 33, aby były czytelne i unikały wymyślnego kodowania.
Oznacza to, że chociaż mamy wystarczającą liczbę bitów pomijania, aby pokryć lata 1998-2005, jesteśmy poza zakresem ASCII, więc mamy dodatkowy przebieg o zerowej długości. Również rok 1979 pojawia się sam, ponieważ długość 1972–1979 jest o jeden za długa.
W bajtach jest wystarczająco dużo bitów, więc te problemy mogą być ostatecznie naprawione.
źródło
q / kdb +,
959493 bajtówWyjaśnienie
Dla każdego roku + 1 koduj dla lat od 1905 roku jako znak ASCII, np .:
6h$x
obroty"D"
z powrotem do68
. Ponieważq
epoka daty jest2000.01.01
, odejmujemy95
i wykonujemy konwersję liczb całkowitych na datę"d"$"m"$-12*95-6h$x
.Powodem, dla którego +1 powyżej, jest odjęcie liczby dni od początku przyszłego roku, aby uzyskać faktyczny rok 31 grudnia lub 30 czerwca, a mianowicie 1 lub 185 dni. Dlatego
"DEFGHIJKSUV[^eh"
reprezentuje lata z drugim skokiem w grudniu, a"DMNOQXYZ]lo"
dla tych w czerwcu. Parowanie-odejmowanie odbywa się za pośrednictwem(a;b){x-y}'(c;d)
, gdziea
ib
są lata, które będą odejmowane przezc
id
liczby dni, odpowiednio." "0:([]...)
przygotowuje wyniki, aby zapewnić nam prawidłowe formatowanie, z małym zastrzeżeniem, że zostanie wygenerowany nagłówek kolumny.1_
upuszcza ten nagłówek i na koniec stosujeasc
się, aby poprawnie zamówić.edycja : „przywróć bazę” do odejmowania 95 lat zamiast 100 (zapisując 1 znak).
edycja 2 : zmiana kolejności pozycjonowania operandów w funkcji konwersji liczb całkowitych na datę.
źródło
Python,
204201Można grać z nim na repl.it .
Edycja: Całkowicie pobity! Odpowiedzi na kompresję są niezwykle krótkie.
źródło
PHP, 164 bajty
To tylko kilka modyfikacji pomysłu @ Voitcus
źródło
Python,
221217Niektóre spostrzeżenia
Zasadniczo
d(x)
dekompresuje wektor 3 liczb całkowitych z jednej 2-cyfrowej liczby całkowitej.d(x)
jest skonstruowany jako funkcja odwrotna (w danych 26 sekund przestępnych)c(v)
, która z kolei jest funkcją kompresji, która zamienia 3-uple, takie jak (1998,12,31), na liczbę 85. Aby uzyskać listę [20 , 21 ... 28,58] Zaprojektowałem inny algorytm, aby sprawdzić, czy funkcja kompresji jest bijectywna w domenie. To znaczy upewniłem się, że poniższy program nie tworzy duplikatów, i użyłem jego danych wyjściowych jako listy powyższego programu.Funkcja kompresji
c(v)
została zaprojektowana tak, aby była bijectywna przy użyciu bardzo prostego schematu. Weźmy jako przykład (1998,12,31).Napisałem program, aby sprawdzić, czy to prawda, a następnie zdefiniowałem
d(x)
jako odwrotnośćc(v)
. W naszym przykładzie c ((1998,12,31)) wynosi 85, a d (85) poprawnie drukuje1998-12-31 23:59:60
.źródło
q=x%10
i wymienićq
zx%10
wszędzie. Jest krótszy Daję również pomocny opis niektórych dodatkowych golfa w twoim programie tutaj . Polecam przejrzeć stronę Wskazówki dotyczące gry w golfa w języku Python .gzip, 114 bajtów
Hexdump:
1f8b080853f9975502006c006dd04b0a80300c84e1bde01dbc40218fa6697aff8309e2a6fa6f3f86cc10adb426a3b95ce62b6a0d398f07d59aeb8e4ed80983701026e1242cc0a9307e1aa11306615211b59710527b3961270cba9994fc7fc944829092faeedc313e7803993cfafb20020000
Utwórz plik z bajtami opisanymi powyżej.
Wyodrębnij za pomocą gunzip lub innego programu dekompresyjnego, aby uzyskać nowy plik o nazwie „l”. Ten plik zawiera żądane dane wyjściowe.
źródło