Mendasarkan pada pertanyaan SO ini .
Tantangannya agak sederhana: diberi periode tanggal dalam format, YYYYMM
output dalam format MMMYY
.
Aturan:
- Input akan berupa angka atau string yang panjangnya tepat 6 karakter, hanya terdiri dari digit.
- Dua digit terakhir akan berada di antara
01
dan12
. - Keluaran harus dalam bentuk
MMMYY
, di manaMMM
mewakili kode tiga huruf besar untuk bulan (di bawah) danYY
mewakili dua digit terakhir dariYYYY
bagian input.
Daftar bulan dengan kode yang sesuai:
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
Contoh:
Input Output
201604 APR16
200001 JAN00
000112 DEC01
123405 MAY34
Jawaban:
MATL,
181413 byteInput diberikan sebagai string (terlampir dalam tanda kutip tunggal).
Versi ini hanya berjalan di MATL pada MATLAB karena MATLAB dapat secara otomatis mem-parsing
datestr('2016 04')
.Penjelasan
Ini adalah versi 18 byte yang berfungsi pada Oktaf (dan karena itu penerjemah online)
Cobalah secara Online
Versi modifikasi untuk semua kasus uji
Penjelasan
sumber
Python 3, 70 byte
Ini menggunakan built-in
strftime
danstrptime
fungsi.Untuk 1 byte lebih, inilah versi yang mem-parsing string secara manual:
Ini mengkodekan nama bulan dengan cara yang menarik (terima kasih kepada Henry Gomersall karena telah menghemat satu byte).
sumber
lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]
.lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Bash + coreutils, 18
Membutuhkan versi 64-bit
date
untuk testcas yang diberikan, yang mengenali tanggal lebih awal dari 14 Desember 1901 .sumber
PowerShell v2 +,
4946 byteTerima kasih kepada @ Joey karena telah menghemat 3 byte!
Mengambil input
$args[0]
sebagai string eksplisit (misalnya,'201604'
) melalui input baris perintah. Menggunakanstring.Insert()
fungsi untuk menempatkan a-
di ruang yang sesuai, dan string yang dihasilkan membentuk input keGet-Date
cmdlet dengan-U
parameter format yang menentukan steno tiga bulan ditambah tahun dua digit. Kami merangkum bahwa dalam parens, dan menempel pada.ToUpper()
untuk membuat string keluaran dikapitalisasi. Tali itu ditinggalkan di jalur pipa dan pencetakan tersirat.Juga, seperti yang ditunjukkan, ini sensitif terhadap lokal. Inilah informasi lokal yang saya gunakan di mana ini berfungsi dengan benar.
sumber
MMMyy
, karena ini adalah argumen sederhana untuk cmdlet. Anda juga bisa menggunakan-UFormat %b%y
, yaitu-u %b%y
sebagai gantinya, yang bahkan lebih pendek. Catatan: Solusi ini peka-lokal (yang saya pribadi tidak suka), tetapi akan sedikit lebih lama untuk menjelaskan itu, diakui.-UFormat
sebaliknya. Terima kasih! Saya juga tidak tahu tentang tanda kutip sekitarMMMyy
- itu bagus untuk mengetahui masa depan.Retina ,
7170 byteTerima kasih kepada Sp3000 untuk menghemat 1 byte.
Hitungan byte mengasumsikan penyandian ISO 8859-1. Linefeed tambahan sangat penting.
Cobalah online!
Penjelasan
Ambil
201604
sebagai contoh:Ini menukar dua digit terakhir tahun dengan bulan sementara juga memperluas bulan secara unary menggunakan umpan baris, dan menambahkan daftar bulan secara terbalik sehingga kita akan mendapatkan:
Di mana
¶
mewakili linefeeds (0x0A).Sekarang kami berulang kali menghapus tiga karakter non-linefeed diikuti oleh linefeed. Itulah yang kami makan daftar bulan dari akhir untuk setiap linefeed mewakili satu bulan:
Inilah sebabnya kami menyisipkan bahwa
XXX
: sejak bulan mulai dihitung1
, kami akan selalu menghapus setidaknya tiga karakter, bahkan untuk Januari.Akhirnya, kami menghapus semuanya hingga karakter ke-6 dari akhir. Dengan kata lain kita hanya menyimpan lima karakter terakhir.
sumber
CJam,
5046 byteCobalah online. Terima kasih kepada Martin Ender untuk mengompresi string untuk menghemat beberapa byte.
Penjelasan
sumber
Bash,
3928 byteTerima kasih Trauma Digital !
sumber
Java 7, 137 karakter (161 byte)
Pertimbangkan setiap nama bulan (JAN, FEB dll ...) adalah angka dalam basis 36 dan menyandikannya menjadi simbol Unicode yang sesuai. Kemudian dapatkan simbol yang sesuai dari string yang mengkodekannya kembali di base 36 dan setelah itu beberapa manipulasi string biasa.
Sedikit tidak berbulu:
Anda dapat melihatnya berjalan di sini: https://ideone.com/IKlnPY
sumber
Python, 83 byte
sumber
Kotlin, 100 byte
Cukup menggunakan Java SimpleDateFormat
sumber
SimpleDateFormat
(yaituimport java.text.*;
)?MATLAB / Oktaf, 42 byte
Menciptakan fungsi anonim bernama
ans
yang disebut dengan string yang mewakili tanggal:ans('201604')
.Demo online
Solusi ini digunakan
datenum
untuk mengonversi tanggal input ke nomor tanggal seri, dan kemudiandatestr
dengan spesifikasi output yang telah ditentukanmmmyy
(12
) untuk menghasilkan representasi string dalam format yang diperlukan. Akhirnya, kami gunakanupper
untuk mengubahnyaMMMYY
karena bulan huruf besar bukan opsi output.sumber
05AB1E,
514241 bytePenjelasan
Cobalah online
9 byte disimpan berkat kompresi string, milik @Adnan
sumber
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B
bukannya"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
menghemat 9 byte.JavaScript,
87848079 byteUntuk mendapatkan bulan, dapatkan tanggal (yang dibentuk dari "YYYYMM" dikonversi menjadi "YYYY-MM") dan ambil karakter 5 hingga 8, yang merupakan tiga huruf pertama dalam bulan tersebut. Tetapi biaya untuk mengubahnya menjadi huruf besar.
Demo:
sumber
APR16
MAR16
APR16
, tetapi test case ketiga hanya menunjukkanDEC
untuk saya.Julia,
575653 byteIni adalah fungsi anonim yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.
Pertama kita membangun
DateTime
objek menggunakan konstruktor tipe dan string format. Perhatikan bahwa tunggalm
dalam string format akan mendapatkan bulan satu dan dua digit, meskipun kasus sebelumnya tidak relevan di sini. Karena tidak ada hari yang ditentukan, maka bulan pertama diasumsikan.Kami kemudian dapat memformat nilai sebagai string menggunakan
Dates.format
fungsi dariBase.Dates
submodule. Stringuyy
mendapatkan nama bulan tiga huruf dan tahun dua digit, tetapi hasilnya dalam judul kasus, misalnya Apr16 bukannya APR16 yang diinginkan, jadi kita perlu melakukannyauppercase
.Cobalah online! (termasuk semua kasus uji)
sumber
C,
147145112 byteDemo online
Ugoren terima kasih !
sumber
#include
, tentukanm
sebagai parameter -main(m)
,%.3s
format menyimpan penghentian nol."%4s%2d"
menjadi"%4s%d"
.main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}
jauh lebih pendekJavaScript ES6,
7766 byteDisimpan 11 byte berkat @ Bálint!
Dapatkan tanggalnya dengan mengekstraksi string yang dikembalikan oleh
Date
kelas. kemudian memanfaatkan dan menambahkan tahun.Versi ES5:
sumber
(Date(0,a[4]- -a[5])+"").substr(4,3)
a[4]- -a[5]
. Ada apa dengan itua[4]+a[5]-1
?new Date(0,a[4]+a[5]-1)+""
=>new Date(0,a[4]+a[5]-1)+0
C #,
9487 byteDisimpan 7 byte dengan menggunakan Sintaks C # 6.
Coba Online
sumber
C(string s)=>...
Japt,
3534 byteTautan.
Menggunakan teknik yang sama dengan jawaban JavaScript saya .
sumber
Java 8,
154113 bytePenjelasan:
Cobalah online.
sumber
java.text.SimpleDateFormat
.import java.text.*;
adalah 19 byte, dan dua kalijava.text.
di depan keduanyaSimpleDateFormat
adalah 20 byte. Jadi itu akan meningkat sebesar 1 byte daripada menurunkannya..*;
kode yang tidak disunat, tapi kali ini saya sepertinya mengabaikannya. Saya memiliki opsi penyimpanan yang secara otomatis mengubahnya menjadi impor murni karena saya menggunakan Java dalam pekerjaan saya, dan saya hanya lupa untuk mengubahnya keimport java.text.*;
..Oracle SQL, 49 Bytes
Data harus dimasukkan dalam tabel yang disebut
T
dengan kolomN
tipeVARCHAR2(6)
,CHAR(6)
atau, hanya jika semua tahun> 1000,NUMBER
Pemakaian:
sumber
begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print n
dan Anda membutuhkan 42 karakter tambahan untuk satu input (VARIABLE n varchar2;BEGIN:n:='201605';END;
) alih-alih 31 (insert into t values('000112');
) jika Anda memiliki cara yang lebih pendek, tolong beri tahu saya.Microsoft SQL Server, 57 Bytes
The
Upper
Fungsi diperlukan sebagai format tidak menghasilkan Atas kasus bulan seperti yang diharapkan dengan MMM pola Format.Pemakaian:
sumber
Pyth, 45 byte
Cobalah online!
Penjelasan:
String yang berisi berisi
"JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
. KeduanyaJAN
s sehingga saya bisa mengindeksnya pseudo-satu-diindeks.Sunting: Memperbaiki bug yang mengacaukan TIO
sumber
R , 65 byte
Cobalah online!
Mengambil input sebagai string, memanfaatkan konstanta
month.abb
. Menggunakan modulus dansubstr
mengekstraksi nilai yang relevan.sumber
:
untuk mengkonversi keinteger
!el
- 1 byte lebih sedikit.J, 70 byte
Pemakaian
Penjelasan
sumber
Pyth, 39 byte
Hexdump:
Suite uji.
sumber
jq, 35 karakter
(34 karakter kode + 1 opsi baris perintah karakter.)
(Hanya mencoba apakah
^
trik yang digunakan oleh Digital Trauma dalam jawaban Bash- nya juga berfungsi di jq. Berhasil. Sekarang Anda tahu siapa yang mengilhami karakter paling penting dari jawaban ini. (Alternatifnya adalah menggunakanascii_upcase
fungsi.))Contoh dijalankan (Opsi
-R
hanya digunakan dalam sampel ini untuk lulus semua kasus uji.)Tes online: (Melewati -R melalui URL tidak didukung - jadi input dilewatkan sebagai string JSON literal. Melewati
-r
URL tidak didukung - periksa Output Baku sendiri.)sumber
Factor,
8278 byteEshplained:
sumber
PHP, 78 byte
" Masalah tahun 2038" dapat terjadi pada beberapa komputer, seperti di sini . Tetapi tidak pada orang lain, seperti di sini .
sumber
Swift 2.2, 149 byte
Mencoba untuk mendapatkan ini lebih pendek dari Kotlin ... Sayang
NSDateFormatter
sekali tidak memiliki penginisialisasi yang mengatur nyadateFormat
.NSDateFormatter
juga tidak memilikidateFormat
nilai default , menyebabkan kerugian tambahan.Swift 3, 136 byte
Berkat penghapusan
NS
awalan pada beberapa kelas, saya dapat membuat jawaban Swift 3 sedikit lebih pendek. Masih tidak lebih pendek dari Kotlin ...Fungsi tes dan kasus:
sumber
R,
154150114112 byteMengambil input enam digit menjadi "b", memisahkan empat digit pertama dari dua digit terakhir, menyingkat bulan 2 digit dan membuatnya menjadi huruf besar, dan menggabungkannya dengan digit ke-3 dan ke-4.
Golf:
Tidak Disatukan:
EDIT: diganti nama duplikat dengan variabel; membuat saya tetap bodoh. -2 byte dengan memutar fungsi anonim (terima kasih, cat).
sumber
a=
fungsi anonima=
? Sesuatu seperti ini:(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="")}
adalah objek fungsi semua dengan sendirinya.RStudio with R 3.2.3 (2015-12-10)
saya dapatkanError in i(o, b) : invalid format '%06d'; use format %s for character objects
R version 3.1.1 (2014-07-10)
dan berfungsi dengan baik. Bagaimana cara kerjanya di sini, haruskah saya mendapatkan versi baru dan mengubah kode? Juga terima kasih atas tip fungsi anonim!