Na podstawie tego SO pytania .
Wyzwanie jest raczej proste: biorąc pod uwagę okres w formacie, YYYYMM
wypisz go w formacie MMMYY
.
Zasady:
- Wejście będzie liczbą lub łańcuchem o długości dokładnie 6 znaków, składającym się wyłącznie z cyfr.
- Ostatnie dwie cyfry będą pomiędzy
01
i12
. - Dane wyjściowe muszą być w postaci
MMMYY
, w którejMMM
reprezentują trzyliterowy kod wielkiej litery dla miesiąca (poniżej) iYY
reprezentują dwie ostatnie cyfryYYYY
części danych wejściowych.
Lista miesięcy z odpowiednim kodem:
MM MMM
01 JAN
02 FEB
03 MAR
04 APR
05 MAY
06 JUN
07 JUL
08 AUG
09 SEP
10 OCT
11 NOV
12 DEC
Przykłady:
Input Output
201604 APR16
200001 JAN00
000112 DEC01
123405 MAY34
Odpowiedzi:
MATL,
181413 bajtówDane wejściowe są dostarczane jako ciąg znaków (ujęte w pojedyncze cudzysłowy).
Ta wersja działa tylko w MATLAB na MATLAB, ponieważ MATLAB jest w stanie automatycznie parsować
datestr('2016 04')
.Wyjaśnienie
Oto 18-bajtowa wersja, która działa na Octave (a zatem na interpreter online)
Wypróbuj online
Zmodyfikowana wersja dla wszystkich przypadków testowych
Wyjaśnienie
źródło
Python 3, 70 bajtów
Ten wykorzystuje wbudowany in
strftime
istrptime
funkcje.Aby uzyskać 1 bajt więcej, oto wersja, która ręcznie analizuje ciąg:
W ciekawy sposób koduje to nazwy miesięcy (dzięki Henry Gomersall za uratowanie bajtu).
źródło
lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]
.lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Bash + coreutils, 18
Wymaga 64-bitowej wersji
date
dla podanych przypadków testowych, która rozpoznaje daty wcześniejsze niż 14 grudnia 1901 r .źródło
PowerShell v2 +,
4946 bajtówDzięki @Joey za zapisanie 3 bajtów!
Pobiera dane wejściowe
$args[0]
jako jawny ciąg znaków (np.'201604'
) Za pośrednictwem wiersza poleceń. Używastring.Insert()
funkcji do umieszczenia znaku a-
w odpowiednim miejscu, a wynikowy ciąg znaków wprowadza dane wejściowe do poleceniaGet-Date
cmdlet z-U
parametrem format określającym trzymiesięczny skrót plus dwucyfrowy rok. Hermetyzujemy to w parens i dodajemy do a,.ToUpper()
aby ciąg wyjściowy był pisany wielką literą. Ten ciąg jest pozostawiony w potoku, a drukowanie jest niejawne.Jak już wspomniano, jest to zależne od ustawień regionalnych. Oto informacje o ustawieniach regionalnych, których używam tam, gdzie to działa poprawnie.
źródło
MMMyy
, ponieważ jest to prosty argument polecenia cmdlet. Możesz także użyć-UFormat %b%y
, czyli-u %b%y
zamiast tego, co jest jeszcze krótsze. Uwaga dodatkowa: To rozwiązanie jest wrażliwe na ustawienia regionalne (co osobiście mi się nie podoba), ale trzeba by to nieco dłużej wyjaśnić.-UFormat
Zamiast tego doskonałe połączenie . Dzięki! Nie wiedziałem też o cytatach wokółMMMyy
- dobrze wiedzieć na przyszłość.Siatkówka ,
7170 bajtówDzięki Sp3000 za oszczędność 1 bajtu.
Liczba bajtów zakłada kodowanie ISO 8859-1. Końcowe podawanie linii jest znaczące.
Wypróbuj online!
Wyjaśnienie
Biorąc
201604
jako przykład:To zamienia dwie ostatnie cyfry roku z miesiącem, jednocześnie rozszerzając miesiąc w unary przy użyciu linii i przygotowując listę miesięcy w odwrotnej kolejności, aby uzyskać:
Gdzie
¶
reprezentują kanały (0x0A).Teraz kilkakrotnie usuwamy trzy znaki nieciągłe, a następnie dosuwane. Oznacza to, że zjadamy listę miesięcy od końca dla każdego kanału reprezentującego miesiąc:
Dlatego właśnie to umieściliśmy
XXX
: ponieważ miesiące zaczynają się liczyć1
, zawsze usuwamy co najmniej trzy znaki, nawet w styczniu.Na koniec usuwamy wszystko do szóstej postaci od końca. Innymi słowy, zachowujemy tylko ostatnie pięć znaków.
źródło
CJam,
5046 bajtówWypróbuj online. Podziękowania dla Martina Endera za skompresowanie ciągu w celu zaoszczędzenia kilku bajtów.
Wyjaśnienie
źródło
Bash,
3928 bajtówDzięki Digital Trauma !
źródło
Java 7, 137 znaków (161 bajtów)
Rozważmy, że nazwa każdego miesiąca (JAN, FEB itp.) Jest liczbą w bazie 36 i koduje ją do odpowiedniego symbolu Unicode. Następnie pobierz odpowiedni symbol z łańcucha i zakoduj go ponownie w bazie 36, a następnie kilka prostych operacji na łańcuchu.
Nieznacznie nie golfista:
Możesz zobaczyć, jak działa tutaj: https://ideone.com/IKlnPY
źródło
Python, 83 bajty
źródło
Kotlin, 100 bajtów
Dość proste użycie Java SimpleDateFormat
źródło
SimpleDateFormat
(tj.import java.text.*;
)?MATLAB / oktawa, 42 bajty
Tworzy anonimowa funkcja o nazwie
ans
, która jest wywoływana z ciągiem reprezentującym datę:ans('201604')
.Demo online
To rozwiązanie wykorzystuje
datenum
do konwersji daty wejściowej na numer daty seryjnej, a następniedatestr
ze wstępnie zdefiniowaną specyfikacją wyjściowąmmmyy
(12
) w celu uzyskania reprezentacji ciągu w wymaganym formacie. Na koniec używamy,upper
aby to zmienić,MMMYY
ponieważ duży miesiąc nie jest opcją wyjściową.źródło
05AB1E,
514241 bajtówWyjaśnienie
Wypróbuj online
9 bajtów zapisanych dzięki kompresji ciągów, dzięki uprzejmości @Adnan
źródło
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B
zamiast"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
zapisuje 9 bajtów.JavaScript,
87848079 bajtówAby uzyskać miesiąc, pobiera datę (która składa się z „RRRRMM” przekonwertowaną na „RRRR-MM”) i pobiera znaki od 5 do 8, czyli dokładnie trzy pierwsze litery miesiąca. Ale przekształcenie go na wielkie litery kosztuje dużo.
Próbny:
źródło
APR16
MAR16
APR16
, ale trzeci przypadek testowy pokazuje tylkoDEC
dla mnie.Julia,
575653 bajtówJest to anonimowa funkcja, która przyjmuje ciąg i zwraca ciąg. Aby go wywołać, przypisz go do zmiennej.
Najpierw konstruujemy
DateTime
obiekt za pomocą konstruktora typu i ciągu formatu. Zauważ, że singielm
w ciągu formatu otrzyma jedno- i dwucyfrowe miesiące, choć poprzedni przypadek nie ma tu znaczenia. Ponieważ nie określono żadnych dni, zakłada się pierwszy dzień miesiąca.Następnie możemy sformatować wartość jako ciąg za pomocą
Dates.format
funkcji zBase.Dates
submodułu. Ciąguyy
otrzymuje trzyliterową nazwę miesiąca i dwucyfrowy rok, ale wynik jest w tytule, np. Apr16 zamiast pożądanego APR16, więc musimy touppercase
zrobić.Wypróbuj online! (obejmuje wszystkie przypadki testowe)
źródło
C,
147145112 bajtówDemo online
Dzięki ugoren !
źródło
#include
, zdefiniujm
jako parametr -main(m)
,%.3s
format zapisuje zerowe zakończenie."%4s%2d"
na"%4s%d"
.main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}
dużo krótszyJavaScript ES6,
7766 bajtówZaoszczędź 11 bajtów dzięki @ Bálint!
Uzyskaj datę, wyodrębniając ciąg zwrócony przez
Date
klasę. następnie dodaje wielkie litery i dodaje rok.Wersja ES5:
źródło
(Date(0,a[4]- -a[5])+"").substr(4,3)
a[4]- -a[5]
. Co było nie taka[4]+a[5]-1
?new Date(0,a[4]+a[5]-1)+""
=>new Date(0,a[4]+a[5]-1)+0
C #,
9487 bajtówZapisano 7 bajtów przy użyciu składni C # 6.
Wypróbuj online
źródło
C(string s)=>...
Japt,
3534 bajtówPołączyć.
Używa tej samej techniki co moja odpowiedź JavaScript .
źródło
Java 8,
154113 bajtówWyjaśnienie:
Wypróbuj online.
źródło
java.text.SimpleDateFormat
.import java.text.*;
to 19 bajtów, a dwa razyjava.text.
przed nimiSimpleDateFormat
20 bajtów. Więc zwiększy się o 1 bajt zamiast go obniżyć..*;
nielepszonego kodu, ale tym razem chyba go zaniedbałem. Mam opcje zapisywania, które automatycznie konwertują go na czysty import, odkąd korzystam z Javy w swojej pracy i po prostu zapomniałem go zmienić naimport java.text.*;
...Oracle SQL, 49 bajtów
Dane te muszą być umieszczone w tabeli o nazwie
T
z kolumnąN
typuVARCHAR2(6)
,CHAR(6)
lub tylko wtedy, gdy wszystkie lata jest> 1000,NUMBER
Stosowanie:
źródło
begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print n
potrzebujesz 42 dodatkowych znaków dla pojedynczego wejścia (VARIABLE n varchar2;BEGIN:n:='201605';END;
) zamiast 31 (insert into t values('000112');
), jeśli masz krótsze sposoby, proszę powiedz mi.Microsoft SQL Server, 57 bajtów
Ta
Upper
funkcja jest wymagana, ponieważ format nie generuje wielkich liter miesięcy, jak można by oczekiwać w przypadku wzorca formatu MMM .Stosowanie:
źródło
Pyth, 45 bajtów
Wypróbuj online!
Wyjaśnienie:
Zapakowany ciąg zawiera
"JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
. ObaJAN
są tak, że mogę indeksować pseudo-jeden indeksowany.EDYCJA: Naprawiono błąd, który bałaganił w TIO
źródło
R , 65 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako ciąg znaków, wykorzystuje stałą
month.abb
. Wykorzystuje moduł isubstr
wyodrębnia odpowiednie wartości.źródło
:
do konwersji nainteger
!el
- 1 mniej bajtu.J, 70 bajtów
Stosowanie
Wyjaśnienie
źródło
Pyth, 39 bajtów
Hexdump:
Zestaw testowy.
źródło
jq, 35 znaków
(Kod 34 znaków + opcja wiersza poleceń 1 znak).
(Właśnie sprawdziłem, czy
^
sztuczka zastosowana przez Digital Trauma w jego odpowiedzi Bash działa również w jq. Działa. Teraz już wiesz, kto zainspirował najważniejszą postać tej odpowiedzi. (Alternatywą jest użycieascii_upcase
funkcji.))Przebieg próbny (Opcja
-R
używana tylko w tej próbce, aby przejść wszystkie przypadki testowe.)Test online: (Przekazywanie -R przez URL nie jest obsługiwane - więc dane wejściowe są przekazywane jako literał JSON. Przekazywanie
-r
przez URL nie jest obsługiwane - sprawdź sam Dane wyjściowe Raw).źródło
Współczynnik,
8278 bajtówEshplained:
źródło
PHP, 78 bajtów
„Problem roku 2038” może wystąpić na niektórych komputerach, jak tutaj . Ale nie w innych, jak tutaj .
źródło
Swift 2.2, 149 bajtów
Próba skrócenia tego do Kotlina ... Szkoda,
NSDateFormatter
że nie ma inicjalizatora, który to ustawiadateFormat
.NSDateFormatter
również nie madateFormat
wartości domyślnej , powodując dodatkowe straty.Swift 3, 136 bajtów
Dzięki usunięciu
NS
przedrostka w niektórych klasach byłem w stanie sprawić, że Swift 3 odpowiedział nieco krócej. Nadal nie krótszy niż Kotlin ...Funkcja testowa i przypadki:
źródło
R,
154150114112 bajtówPobiera sześciocyfrowy wpis do „b”, oddziela pierwsze cztery cyfry od dwóch ostatnich cyfr, skraca 2-cyfrowy miesiąc i czyni go wielkimi literami i łączy go z trzecią i czwartą cyfrą.
Gra w golfa:
Nie golfowany:
EDYCJE: zastąpiono podwójne nazwy zmiennymi; naprawiłem, że jestem głupi. -2 bajty, zmieniając funkcję na anonimową (dzięki, cat).
źródło
a=
anonimowej funkcjia=
? Coś w tym rodzaju:(function(m) {a=3;m*a})(10)
function(b){h=substr;i=sprintf;o="%06d";cat(toupper(month.abb[as.numeric(h(i(o,b),5,6))]),h(i(o,b),3,4),sep="")}
to obiekt funkcyjny sam w sobie.RStudio with R 3.2.3 (2015-12-10)
otrzymujęError in i(o, b) : invalid format '%06d'; use format %s for character objects
R version 3.1.1 (2014-07-10)
i działa dobrze. Jak to działa tutaj, czy powinienem pobrać nową wersję i zmienić kod? Dziękujemy również za anonimową wskazówkę dotyczącą funkcji!