Konversi YYYYMM ke MMMYY

54

Mendasarkan pada pertanyaan SO ini .

Tantangannya agak sederhana: diberi periode tanggal dalam format, YYYYMMoutput 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 01dan 12.
  • Keluaran harus dalam bentuk MMMYY, di mana MMMmewakili kode tiga huruf besar untuk bulan (di bawah) dan YYmewakili dua digit terakhir dari YYYYbagian 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
pajonk
sumber
5
Pertanyaan ini sangat seimbang. Baik parsing manual dan perpustakaan tanggal akhirnya hampir sama, setidaknya dalam Python.
bkul
10
Kemarin, saya melihat "Konversi YYYYMM ke MMMYY" di HNQ di sebelah logo SO. Sekarang saya melihat judul yang sama di sebelah logo PCG. Saya sangat bingung :)
kucing

Jawaban:

20

MATL, 18 14 13 byte

4e!Z{Zc12XOXk

Input 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

        % Implicitly grab input as a string
4e!     % Reshape input to be 2 x 4 (puts the year in row 1 and month in row 2)
Z{      % Place each row in a separate cell
Zc      % Join them together using a space to create 'yyyy mm' format
12      % Number literal, pre-defined datestring of 'mmmyy'
XO      % Convert from serial date number to string using this format
Xk      % Convert to uppercase
        % Implicitly display

Ini adalah versi 18 byte yang berfungsi pada Oktaf (dan karena itu penerjemah online)

'yyyymm'2$YO12XOXk

Cobalah secara Online

Versi modifikasi untuk semua kasus uji

Penjelasan

            % Implicitly grab input as a string
'yyyymm'    % Push the format string as a string literal
2$YO        % Convert to a serial date number
12          % Number literal, pre-defined datestring of 'mmmyy'
XO          % Convert from serial date number to string using this format
Xk          % Convert to uppercase
            % Implicitly display
Suever
sumber
3
Saya tidak melihat bagaimana ini bisa dikalahkan begitu .. gg
Adnan
20

Python 3, 70 byte

from time import*
lambda s:strftime("%b%y",strptime(s,"%Y%m")).upper()

Ini menggunakan built-in strftimedan strptimefungsi.

Untuk 1 byte lebih, inilah versi yang mem-parsing string secara manual:

lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]

Ini mengkodekan nama bulan dengan cara yang menarik (terima kasih kepada Henry Gomersall karena telah menghemat satu byte).

bkul
sumber
11
Penguraian manual itu gila.
Morgan Thrapp
@MorganThrapp Saya mendapat ide dari jawaban ini .
bkul
1
Versi manual Anda dapat dilakukan di 69 bytes Python 2 jika Anda mengambil nomor sebagai masukan: lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor
1
Meskipun ini kehilangan satu byte:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall
1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "waktu impor" akan menghemat 6 karakter, tetapi akan dikenakan biaya 10 ("waktu.", dua kali)
TLW
18

PowerShell v2 +, 49 46 byte

(date $args[0].insert(4,'-')-U %b%y).ToUpper()

Terima kasih kepada @ Joey karena telah menghemat 3 byte!

Mengambil input $args[0]sebagai string eksplisit (misalnya, '201604') melalui input baris perintah. Menggunakan string.Insert()fungsi untuk menempatkan a -di ruang yang sesuai, dan string yang dihasilkan membentuk input ke Get-Datecmdlet dengan -Uparameter 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.

PS C:\Tools\Scripts\golfing> get-culture

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)
AdmBorkBork
sumber
Anda tidak perlu mengutip MMMyy, karena ini adalah argumen sederhana untuk cmdlet. Anda juga bisa menggunakan -UFormat %b%y, yaitu -u %b%ysebagai gantinya, yang bahkan lebih pendek. Catatan: Solusi ini peka-lokal (yang saya pribadi tidak suka), tetapi akan sedikit lebih lama untuk menjelaskan itu, diakui.
Joey
Panggilan yang sangat baik dengan -UFormatsebaliknya. Terima kasih! Saya juga tidak tahu tentang tanda kutip sekitar MMMyy- itu bagus untuk mengetahui masa depan.
AdmBorkBork
8

Retina , 71 70 byte

Terima kasih kepada Sp3000 untuk menghemat 1 byte.

Hitungan byte mengasumsikan penyandian ISO 8859-1. Linefeed tambahan sangat penting.

(..)(..)$
DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX$2$*¶$1
+`...¶

R-6`.

Cobalah online!

Penjelasan

Ambil 201604sebagai contoh:

(..)(..)$
DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX$2$*¶$1

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:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

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:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJAN¶¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEB¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMAR¶16
20DECNOVOCTSEPAUGJULJUNMAYAPR16

Inilah sebabnya kami menyisipkan bahwa XXX: sejak bulan mulai dihitung 1, kami akan selalu menghapus setidaknya tiga karakter, bahkan untuk Januari.

R-6`.

Akhirnya, kami menghapus semuanya hingga karakter ke-6 dari akhir. Dengan kata lain kita hanya menyimpan lima karakter terakhir.

Martin Ender
sumber
Itu cukup pintar, pintar.
AdmBorkBork
7

CJam, 50 46 byte

q2/1>~i("4H~0ë~³!ò²×¶7Ö"256b25b'Af+3/=\

Cobalah online. Terima kasih kepada Martin Ender untuk mengompresi string untuk menghemat beberapa byte.

Penjelasan

q2/  e# Get input and divide it into groups of 2, like ["20" "16" "04"]
1>~  e# Discard the first item and dump the remaining array to the stack
i(   e# Convert the top value (month) to an integer and decrement it, because
     e# arrays are zero-indexed
"..."256b25b e# Convert this string from base-256 to base-25
'Af+ e# "Add" a capital A to each number to get the letters
3/   e# Divide into groups of 3 to make an array of month names
=\   e# Get the requested month and swap the elements to put the year on
     e# top, so it is printed last
NinjaBearMonkey
sumber
6

Java 7, 137 karakter (161 byte)

String d(String i){return Integer.toString("憯䷳烣㘿烪摿摽㛨近筍矯䏔".charAt(Integer.parseInt(i.substring(4))-1),36).toUpperCase()+i.substring(2,4);}

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:

String d(String input){
return 
  Integer.toString("憯䷳烣㘿烪摿摽㛨近筍矯䏔" // encoded month names
  .charAt(Integer.parseInt(input.substring(4))-1),36) // get a symbol from encoded names at position input[4:], decode it to base 36 value
  .toUpperCase()+input.substring(2,4); // get it to upper case and add year
}

Anda dapat melihatnya berjalan di sini: https://ideone.com/IKlnPY

cliffroot
sumber
5

Python, 83 byte

from datetime import*
lambda x:datetime.strptime(x,'%Y%m').strftime('%b%y').upper()
ahli atlasologi
sumber
Saya baru saja memposting jawaban yang hampir identik dengan jawaban Anda. Saya tidak melihat milik Anda karena butuh beberapa saat untuk menulis jawabannya. Jika Anda ingin saya menghapus milik saya, saya akan, atau Anda dapat menggunakan milik saya untuk mendapatkan beberapa byte tambahan.
bkul
1
Tidak apa-apa, Anda mengalahkan saya dengan 13 byte, saya akan mengakui. Saya suka jawaban manual Anda juga.
atlasologist
5

Kotlin, 100 byte

fun f(d:String)=SimpleDateFormat("MMMyy").format(SimpleDateFormat("yyyyMM").parse(d)).toUpperCase()

Cukup menggunakan Java SimpleDateFormat

Rames
sumber
1
Hmm, saya tidak tahu Kotlin, tetapi karena ini berasal dari Jawa, tidakkah Anda harus memasukkan impor SimpleDateFormat(yaitu import java.text.*;)?
Kevin Cruijssen
Karena tantangan meminta output, saya akan menganggap cetakan diperlukan sebagai bagian dari fungsi Anda.
JohnWells
5

MATLAB / Oktaf, 42 byte

@(x)upper(datestr(datenum(x,'yyyymm'),12))

Menciptakan fungsi anonim bernama ansyang disebut dengan string yang mewakili tanggal: ans('201604').

Demo online

Solusi ini digunakan datenumuntuk mengonversi tanggal input ke nomor tanggal seri, dan kemudian datestrdengan spesifikasi output yang telah ditentukan mmmyy( 12) untuk menghasilkan representasi string dalam format yang diperlukan. Akhirnya, kami gunakan upperuntuk mengubahnya MMMYYkarena bulan huruf besar bukan opsi output.

Suever
sumber
1
Wow, gj mengalahkan semua orang dalam bahasa non-golf!
Downgoat
5

05AB1E, 51 42 41 byte

2ô¦`ï<•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B3ôsèsJ

Penjelasan

                                           # implicit input, 123405
2ô                                         # split input into pieces of 2, ['12','34','05']
  ¦`                                       # push last 2 elements to stack, '05', '34'
    ï<                                     # convert month to its int index, 4
      •r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B        # get compressed string containing 3-letter months, 
                                             JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC
                                   3ô      # split into pieces of 3
                                             ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
                                     sè    # get month at index retrieved earlier, MAY
                                       sJ  # join with 2-digit year and implicitly print, MAY34

Cobalah online

9 byte disimpan berkat kompresi string, milik @Adnan

Emigna
sumber
1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bbukannya "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"menghemat 9 byte.
Adnan
5

JavaScript, 87 84 80 79 byte

x=>(new Date(x.replace(/.{4}/,'$&-'))+'').slice(4,7).toUpperCase()+x.slice(2,4)

Untuk 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:

function s(x) {
  return (new Date(x.replace(/.{4}/, '$&-')) + '').slice(4,7)
         .toUpperCase() + x.slice(2, 4)
}

console.log(s('201604'));
console.log(s('200001'));
console.log(s('000112'));
console.log(s('123405'));

nicael
sumber
Yang pertama adalahAPR16
Downgoat
@Upgoat Dan apa yang muncul untuk Anda?
nicael
1
Saya mulaiMAR16
Downgoat
@Upgoat Huh, itu aneh, mengapa bisa seperti ini? Karena saya mendapatkan ini .
nicael
Bagi saya memang terlihat APR16, tetapi test case ketiga hanya menunjukkan DECuntuk saya.
Adnan
4

Julia, 57 56 53 byte

s->uppercase(Dates.format(DateTime(s,"yyyym"),"uyy"))

Ini adalah fungsi anonim yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.

Pertama kita membangun DateTimeobjek menggunakan konstruktor tipe dan string format. Perhatikan bahwa tunggal mdalam 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.formatfungsi dari Base.Datessubmodule. String uyymendapatkan nama bulan tiga huruf dan tahun dua digit, tetapi hasilnya dalam judul kasus, misalnya Apr16 bukannya APR16 yang diinginkan, jadi kita perlu melakukannya uppercase.

Cobalah online! (termasuk semua kasus uji)

Alex A.
sumber
4

C, 147 145 112 byte

main(m){char a[99]="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";scanf("%4s%d",a+50,&m);printf("%.3s%s",a+--m*3,a+52);}

Demo online

Ugoren terima kasih !

Marco
sumber
2
Beberapa trik murah - hapus #include, tentukan msebagai parameter - main(m),
ugoren
2
Juga, %.3sformat menyimpan penghentian nol.
ugoren
Terima kasih @ugoren! Saya juga berubah "%4s%2d"menjadi "%4s%d".
Marco
main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}jauh lebih pendek
l4m2
4

JavaScript ES6, 77 66 byte

Disimpan 11 byte berkat @ Bálint!

a=>(new Date(0,a[4]+a[5]-1)+"").slice(4,7).toUpperCase()+a[2]+a[3]

Dapatkan tanggalnya dengan mengekstraksi string yang dikembalikan oleh Date kelas. kemudian memanfaatkan dan menambahkan tahun.

Versi ES5:

var a = prompt("Enter YYYYMM: ");
result = (new Date(0,a[4]+a[5]-1)+"").slice(4,7).toUpperCase()+a[2]+a[3]
alert(result);

Downgoat
sumber
Saya membuat satu dari 66 byte dengan teknik atob yang sama, tetapi saya tidak bisa menyalinnya
Bálint
@ Bálint Saya pikir saya mendapat 66 byte juga tetapi ternyata byte counter kita salah karena penyalinan salinan yang buruk;)
Downgoat
Anda bisa mendapatkan nama bulan dengan(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint
1
Saya tidak mengerti a[4]- -a[5]. Ada apa dengan itu a[4]+a[5]-1?
Neil
1
new Date(0,a[4]+a[5]-1)+""=>new Date(0,a[4]+a[5]-1)+0
l4m2
3

C #, 94 87 byte

string C(string s)=>System.DateTime.Parse(s.Insert(4,"-")).ToString("MMMyy").ToUpper();

Disimpan 7 byte dengan menggunakan Sintaks C # 6.

Coba Online

raznagul
sumber
Anda dapat meninggalkan informasi jenis pengembalian untuk lambdas, yaituC(string s)=>...
cat
3

Japt, 35 34 byte

ÐUr$/..../$,"$&-")+P s4,7 u +Us2,4

Tautan.

Menggunakan teknik yang sama dengan jawaban JavaScript saya .

nicael
sumber
3

Java 8, 154 113 byte

import java.text.*;s->new SimpleDateFormat("MMMyy").format(new SimpleDateFormat("yyyyMM").parse(s)).toUpperCase()

Penjelasan:

Cobalah online.

import java.text.*;                 // Required import for SimpleDateFormat
s->                                 // Method with String as both parameter and return-type
  new SimpleDateFormat("MMMyy")     //  Create a formatter with format "MMMyy"
   .format(                         //  Format the following:
     new SimpleDateFormat("yyyyMM") //   Create another formatter with format "yyyyMM"
     .parse(s))                     //   Parse the input with this format
  .toUpperCase()                    //  Convert everything to Uppercase and return
Kevin Cruijssen
sumber
Saya pikir Anda dapat mempersingkatnya jika Anda menghapus impor dan sebagai gantinya langsung merujuk dengannya java.text.SimpleDateFormat.
Frozn
2
@Frozn Sebenarnya, import java.text.*;adalah 19 byte, dan dua kali java.text.di depan keduanya SimpleDateFormatadalah 20 byte. Jadi itu akan meningkat sebesar 1 byte daripada menurunkannya.
Kevin Cruijssen
Oh ya kamu benar. Saya selalu melihat versi yang ungolfed dan berpikir bahwa itu sama dengan versi golf. Maaf :)
Frozn
@Frozn Ah, juga agak buruk. Biasanya saya masih menggunakan .*;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 ke import java.text.*;..
Kevin Cruijssen
2

Oracle SQL, 49 Bytes

select to_char(to_date(n,'yyyymm'),'MONyy')from t

Data harus dimasukkan dalam tabel yang disebut Tdengan kolom Ntipe VARCHAR2(6), CHAR(6)atau, hanya jika semua tahun> 1000, NUMBER

Pemakaian:

drop table t;
create table t (n VARCHAR2(6));
insert into t values ('201604');
insert into t values ('200001');
insert into t values ('000112');
insert into t values ('123405');    

select to_char(to_date(n,'yyyymm'),'MONyy')from t;
Giacomo Garabello
sumber
Apakah mungkin menggunakan PRINT sebagai ganti SELECT dan tidak merujuk ke tabel menggunakan variabel sebagai input? Mendeklarasikan variabel input dan menetapkan nilai tidak mempengaruhi jumlah byte
t-clausen.dk
Apakah diizinkan mengambil input dari tabel? The tag codegolf Info menunjukkan bahwa tidak ada.
pajonk
@ t-clausen.dk cara terpendek menggunakan cetak adalah 58 karakter: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print ndan 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.
Giacomo Garabello
@pajonk dalam jawaban ini tidak ada yang memberi tahu saya apa pun tentang penggunaan tabel
Giacomo Garabello
1
@pajonk sesuai dengan ini , Anda dapat menggunakan tabel untuk input
t-clausen.dk
2

Microsoft SQL Server, 57 Bytes

SELECT UPPER(FORMAT(CAST('201601'+'01' AS DATE),'MMMyy'))

The UpperFungsi diperlukan sebagai format tidak menghasilkan Atas kasus bulan seperti yang diharapkan dengan MMM pola Format.

Pemakaian:

drop table t;
create table t (n VARCHAR(6));
insert into t values ('201604');
insert into t values ('200001');
insert into t values ('000112');
insert into t values ('123405');    

SELECT UPPER(FORMAT(CAST(n+'01' AS DATE),'MMMyy')) FROM t
NY
sumber
Hanya melihat jawaban Anda, itu sama seperti jawaban saya, tidak menyadarinya sampai sekarang, menghapus jawaban saya
t-clausen.dk
Apakah diizinkan mengambil input dari tabel? The tag codegolf Info menunjukkan bahwa tidak ada.
pajonk
@pajonk jawaban di sini tidak menggunakan input dari tabel, jawabannya adalah baris teratas dan variabel input hardcoded. Perhatikan bahwa Anda dapat menggunakan tabel sebagai variabel input seperti yang saya sebutkan sebelumnya. Bagian bawah adalah contoh bagaimana mengkonversi beberapa nilai. TSQL tidak memiliki pernyataan STDIN atau input. Hanya cara menambahkan data menggunakan variabel atau tabel. Semua jawaban saya menggunakan itu untuk input
t-clausen.dk
Ok, terima kasih sudah menjelaskan.
pajonk
2

Pyth, 45 byte

+:."AYw2ûDÈëKH§È¼DYÉx\E±oË"J*3sgz5+3J:z2 4

Cobalah online!

Penjelasan:

+:."AYw2ûDÈëKH§È¼DYÉx\E±oË"J*3sgz5+3J:z2 4
                                z           Take the input
                               g 5          Slice inclusively from index 5 to the end
                              s             Parse as an int
                            *3              Multiply by 3
                           J                Store in variable J, this also returns J
 :                                          Take a slice
  ."AYw2ûDÈëKH§È¼DYÉx\E±oË"                 Of this packed string
                           J*3sgz5          From the J we defined before
                                  +3J       To J+3
+                                           To this string, append
                                     :z     A slice of the index
                                       2 4  From [2,4).

String yang berisi berisi "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". KeduanyaJAN s sehingga saya bisa mengindeksnya pseudo-satu-diindeks.

Sunting: Memperbaiki bug yang mengacaukan TIO

ericeschnei
sumber
2

R , 65 byte

function(A)paste0(toupper(month.abb[el(A:1)%%100]),substr(A,3,4))

Cobalah online!

Mengambil input sebagai string, memanfaatkan konstanta month.abb. Menggunakan modulus dan substrmengekstraksi nilai yang relevan.

JayCe
sumber
penggunaan cerdas :untuk mengkonversi ke integer!
Giuseppe
@ Giuseppe Bukan ide saya :) Saya mengambilnya dari sini . Saya mungkin bisa menerapkannya ke sejumlah jawaban saya yang ada!
JayCe
@ Giuseppe Saya baru saja menemukan peretasan yang lebih pendek menggunakan el- 1 byte lebih sedikit.
JayCe
1

J, 70 byte

4(}.((,~(_3]\'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'){~1-~".)~2&}.){.)]

Pemakaian

   f =: 4(}.((,~(_3]\'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'){~1-~".)~2&}.){.)]
   f '201604'
APR16
   f '200001'
JAN00
   f '000112'
DEC01
   f '123405'
MAY34

Penjelasan

4(}.((,~(_3]\'...'){~1-~".)~2&}.){.)] Input: s
                                    ] Identity function, gets the value s
4                                     The constant 4
                                 {.   Take the first 4 chars from s
                            2&}.      Drop the first 2 (Take the last 2) to get the year
  }.                                  Drop the first 4 chars from s to get the month
                        ".            Parse the month substring as a number
                     1-~              Subtract 1 from it
             '...'                    List of MMM month names
         _3]\                         Split the list into nonoverlapping sublists of size 3
      ,~                              Join the MMM month name with the year and return
mil
sumber
1

Pyth, 39 byte

Hexdump:

0000000: 2b 40 63 2e 22 41 59 12 56 0a 7c bd 93 e3 1c 07 +@c."AY.V.|.....
0000010: e3 d4 d9 ed 5b 49 02 cd b4 92 83 86 22 33 73 3e ....[I......"3s>
0000020: 32 7a 3a 7a 32 20 34                            2z:z2 4

Suite uji.

Biarawati Bocor
sumber
1

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 menggunakan ascii_upcasefungsi.))

strptime("%Y%m")|strftime("%^b%y")

Contoh dijalankan (Opsi -Rhanya digunakan dalam sampel ini untuk lulus semua kasus uji.)

bash-4.3$ jq -Rr 'strptime("%Y%m")|strftime("%^b%y")' <<END
201604
200001
000112
123405
END
APR16
JAN00
DEC01
MAY34

Tes online: (Melewati -R melalui URL tidak didukung - jadi input dilewatkan sebagai string JSON literal. Melewati -rURL tidak didukung - periksa Output Baku sendiri.)

manatwork
sumber
1

Factor, 82 78 byte

[ [ 2 tail* 10 base> month-abbreviation ] [ 4 head 2 tail ] bi append >upper ]

Eshplained:

[                    ! new anonymouse function block (quotation)
  [                  ! new quotation 
    2 tail*          ! "201604" -> "04"
    10 base>         ! "04"     -> 4
    month-abbreviation ! 4 -> "Apr"
  ]                  ! end quotation
  [                  ! new quotation
    4 head           ! "201604" -> "2016"
    2 tail           ! "2016"   -> "16" 
  ]                  ! end quotation
  bi                 ! bifurcate two quotations to TOS
  append             ! "Apr" "16" -> "Apr16"
  >upper             ! "Apr16"    -> "APR16"
]                    ! end quotation
kucing
sumber
1

PHP, 78 byte

<?=fscanf(STDIN,"%4d%d",$y,$m)?strtoupper(date("My",mktime(0,0,0,$m,1,$y))):0;

" Masalah tahun 2038" dapat terjadi pada beberapa komputer, seperti di sini . Tetapi tidak pada orang lain, seperti di sini .

Marco
sumber
@Titus, tolong jangan mencoba mengedit posting orang lain jika ada masalah dan masukkan solusi Anda sendiri; sebagai gantinya, silakan komentari jawabannya ATAU buat sendiri jawaban baru.
Value Ink
1

Swift 2.2, 149 byte

let f = NSDateFormatter(),g = NSDateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"
g.stringFromDate(f.dateFromString(i)!).uppercaseString

Mencoba untuk mendapatkan ini lebih pendek dari Kotlin ... Sayang NSDateFormattersekali tidak memiliki penginisialisasi yang mengatur nya dateFormat. NSDateFormatterjuga tidak memiliki dateFormatnilai default , menyebabkan kerugian tambahan.

Swift 3, 136 byte

let f = DateFormatter(),g = DateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"
g.string(from: f.date(from: i)!).uppercased()

Berkat penghapusan NSawalan pada beberapa kelas, saya dapat membuat jawaban Swift 3 sedikit lebih pendek. Masih tidak lebih pendek dari Kotlin ...

Fungsi tes dan kasus:

import Foundation
import XCTest

func dateConverter(i: String) -> String? {
    let f = DateFormatter(),g = DateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"

    if let date = f.date(from: i) {
        return g.string(from: date).uppercased()
    }

    return nil
}

XCTAssert(dateConverter(i: "201604") == "APR16")
XCTAssert(dateConverter(i: "200001") == "JAN00")
XCTAssert(dateConverter(i: "000112") == "DEC01")
XCTAssert(dateConverter(i: "123405") == "MAY34")
JAL
sumber
1

R, 154 150 114 112 byte

Mengambil 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:

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="")}

Tidak Disatukan:

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="")
}

EDIT: diganti nama duplikat dengan variabel; membuat saya tetap bodoh. -2 byte dengan memutar fungsi anonim (terima kasih, cat).

bantal yang lembut
sumber
Jawaban bagus! Anda dapat meninggalkan a=fungsi anonim
cat
@cat Saya tidak terlalu terbiasa dengan fungsi anonim tetapi tidakkah saya perlu menambahkan tanda kurung di awal dan akhir fungsi jika saya menghapusnya a=? Sesuatu seperti ini: (function(m) {a=3;m*a})(10)
bantal lembut
1
Tidak, 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.
kucing
Tampaknya ini tidak berfungsi. pada RStudio with R 3.2.3 (2015-12-10)saya dapatkanError in i(o, b) : invalid format '%06d'; use format %s for character objects
kucing
@cat Siapkan versi baru yang mengacaukan semuanya! Saya menggunakan RStudio 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!
bantal lembut