YYYYMM’yi MMMYY’ye dönüştür


54

Bu SO sorusuna dayanarak .

Zorluk oldukça basittir: formatta bir tarih periyodu verildiğinde YYYYMMformatta verilir MMMYY.

Kurallar:

  • Giriş, yalnızca rakamlardan oluşan, tam olarak 6 karakter uzunluğunda bir sayı veya bir dize olacaktır.
  • Son iki hane 01ve arasında olacaktır 12.
  • Çıkış şeklinde olmalıdır MMMYY, MMM(aşağıda) ay için büyük üç harfli kod temsil eder ve YYtemsil iki son basamak YYYYgiriş parçası.

İlgili koda sahip ayların listesi:

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

Örnekler:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34

5
Bu soru çok dengeli. Hem manuel ayrıştırma hem de tarih kitaplıkları en azından Python'da aynıdır.
bkul

10
Dün, SO logosunun yanında "YYYYMM’yi MMMYY’ye Dönüştür" yazısını gördüm. Şimdi aynı başlığı PCG logosunun yanında görüyorum. Kafam çok karıştı :)
kedi

Yanıtlar:


20

MATL, 18 14 13 bayt

4e!Z{Zc12XOXk

Giriş bir dizge olarak sağlanır (tek tırnak işareti içine alınmış).

Bu sürüm sadece MATLAB üzerinde MATLAB üzerinde çalışır çünkü MATLAB otomatik olarak ayrıştırılabilir datestr('2016 04').

açıklama

        % 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

İşte Octave (ve dolayısıyla çevrimiçi tercüman) üzerinde çalışan 18 byte versiyonudur.

'yyyymm'2$YO12XOXk

Çevrimiçi Deneyin

Tüm test durumları için değiştirilmiş versiyon

açıklama

            % 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

3
Bunun nasıl dövülebildiğini anlayamadım .. gg
Adnan

20

Python 3, 70 bayt

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

Bu yerleşik strftimeve strptimeişlevleri kullanır .

1 bayt daha fazlası için, dizgiyi elle ayrıştıran bir sürüm:

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

Bu, ay adlarını ilginç bir şekilde kodlar (Henry Gomersall'a bir baytı kaydettiği için teşekkürler).


11
Bu manuel ayrıştırma delilik.
Morgan Thrapp

@ MorganThrapp Bu cevaptan bir fikrim var .
bkul

1
Girdi olarak bir sayı alırsanız, manuel sürümünüz Python 2'deki 69 baytta yapılabilir lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor

1
Bu bir bayt kaybeder rağmen:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall

1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "içe aktarma süresi" size 6 karakter kazandırır, ancak 10'a ("zaman" olarak iki kez) mal olur
TLW


18

PowerShell v2 +, 49 46 bayt

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

3 byte tasarruf için @Joey teşekkürler!

Girişi alır $args[0]açık bir dize (örn olarak '201604'komut satırı girişi ile). Uygun boşluğa string.Insert()koyma işlevini kullanır -ve sonuçta elde edilen dize , üç aylık kısayol artı iki basamaklı yılı belirten format parametresi ile Get-Datecmdlet'e girdi oluşturur -U. Bunu parenler içinde kapsülleniriz .ToUpper()ve çıktı dizesini büyük harf yapmak için a işaretini atarız . Bu dize boru hattında bırakılır ve yazdırma gizlidir.

Ayrıca, işaret edildiği gibi, bu yerel duyarlıdır. İşte bunun doğru çalıştığı yerde kullandığım yerel bilgiler.

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

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)

MMMyyBir cmdlet için basit bir argüman olduğundan alıntı yapmanıza gerek yok . Ayrıca, sadece kullanabilirsiniz -UFormat %b%y, yani -u %b%ydaha kısa olan yerine. Not: Bu çözüm yerel olarak hassastır (ki şahsen hoşuma gitmedi), ancak bunu hesaba katmak biraz daha uzun sürecek.
Joey

-UFormatBunun yerine mükemmel çağrı . Teşekkürler! Ayrıca etraftaki alıntıları da bilmiyordum MMMyy- gelecek için bilmek güzel.
AdmBorkBork

8

Retina , 71 70 bayt

1 byte tasarruf için Sp3000 teşekkürler.

Bayt sayısı, ISO 8859-1 kodlamasını varsayar. Sondaki satır besleme kayda değerdir.

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

R-6`.

Çevrimiçi deneyin!

açıklama

Alarak 201604bir örnek olarak:

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

Bu, yılın son iki basamağını ayla değiştirirken aynı zamanda ayları satır besleme kullanarak unary olarak genişletir ve ay listesini tersten hazırlayarak şöyle yaparız:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

Nerede linefeeds (0x0A) temsil eder.

+`...¶

Şimdi, satır sonu olmayan üç karakteri ve ardından satır sonu izini kaldırıyoruz. Yani, bir ayı temsil eden her besleme hattının sonundan itibaren ay listesini yiyoruz:

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

Bu yüzden şunu ekledik XXX: aylar saymaya başladığından beri, 1Ocak ayı için bile en az üç karakter kaldıracağız.

R-6`.

Sonunda, 6. karaktere kadar olan her şeyi sondan kaldırıyoruz. Başka bir deyişle, sadece son beş karakteri saklarız.


Bu oldukça akıllıca bir serseri.
AdmBorkBork

7

CJam, 50 46 bayt

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

Çevrimiçi deneyin. Martin Ender'e birkaç bayttan tasarruf etmek için dizgiyi sıkıştırdığı için teşekkür ederiz.

açıklama

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


6

Java 7, 137 karakter (161 bayt)

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

Her ayın adının (JAN, FEB vs. ...) baz 36'daki bir sayı olduğunu ve ilgili Unicode sembolüne kodlandığını düşünün. Ardından dizeden karşılık gelen sembolü tekrar baz 36'da tekrar kodlayın ve bundan sonra bazı düz dize manipülasyonları.

Biraz ungolfed:

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
}

Burada çalıştığını görebilirsiniz: https://ideone.com/IKlnPY


5

Python, 83 bayt

from datetime import*
lambda x:datetime.strptime(x,'%Y%m').strftime('%b%y').upper()

Az önce sizinkilerle aynı olan bir cevap gönderdim. Seninkini görmedim, çünkü cevabı yazmak biraz zaman aldı. Madeni silmemi istiyorsan, yaparım veya bazı ekstra baytlar almak için benimkini kullanabilirsin.
bkul

1
Sorun değil, beni 13 byte yendin, kabul ediyorum. Manuel cevabını da seviyorum.
atlasolog

5

Kotlin, 100 bayt

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

Java SimpleDateFormat'ın oldukça yalındır kullanımı


1
Hmm, Kotlin'i tanımıyorum, fakat Java'dan türetildiği için, SimpleDateFormat(yani import java.text.*;) ' nın ithalatını dahil etmemelisiniz ?
Kevin Cruijssen

Zorluk çıktısını istediğinden, fonksiyonunuzun bir parçası olarak bir baskı yapılması gerektiğini varsayardım.
JohnWells

5

MATLAB / Octave, 42 bayt

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

Adlı bir anonim işlev oluşturur anstarihini temsil eden bir dize ile çağrılır: ans('201604').

Çevrimiçi Demo

Bu çözüm datenumgiriş tarihini seri tarih numarasına dönüştürmek için kullanılır ve daha sonra dateströnceden tanımlanmış çıktı spesifikasyonuyla mmmyy( 12) dize gösterimini istenen formatta verir. Son olarak, büyük ayın çıkış seçeneği olmadığı için upperbunu değiştirmek için kullanıyoruz MMMYY.


1
Vay, gj'yi herkesi golf dışı bir dilde yenmek!
Downgoat

5

05AB1E, 51 42 41 bayt

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

açıklama

                                           # 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

Çevrimiçi deneyin

String sıkıştırma sayesinde 9 bayt kaydedildi, @Adnan'ın izniyle


1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"9 bayt yerine kaydeder.
Adnan

5

JavaScript, 87 84 80 79 bayt

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

Ayı almak için ("YYYYMM" den "YYYYMM" den oluşan) tarihi alır ve ayın ilk üç harfi olan 5 - 8 arasındaki karakterleri alır. Fakat onu büyük harfe dönüştürmek çok pahalı.

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'));


İlk önce olmalıAPR16
Downgoat

@Upgoat Ve sizin için görünen ne?
nicael

1
Ben alıyorumMAR16
Downgoat

@ UPgoat Huh, bu garip, neden bu şekilde olabilir? Ben Çünkü bu olsun .
nicael

Benim için gösteriyor APR16, ancak üçüncü test olayı sadece DECbenim için gösteriyor .
Adnan

4

Julia, 57 56 53 bayt

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

Bu, bir dizgeyi kabul eden ve bir dize döndüren adsız bir işlevdir. Aramak için değişkene atayın.

İlk DateTimeönce type yapısını ve format dizesini kullanarak bir nesne oluşturuyoruz. Tek unutmayın meski durum burada alakasız olsa biçim dizesinde, hem tek ve iki basamaklı ay alacak. Hiçbir gün belirtilmediğinden, ayın ilki varsayılır.

Daha sonra Dates.format, Base.Datesalt modüldeki işlevi kullanarak değeri bir dize olarak biçimlendirebiliriz . Dize uyyüç harfli ay adını ve iki basamaklı yılı alır, ancak sonuç başlıkta, örneğin istenen APR16 yerine Apr16, bu nedenle buna ihtiyacımız uppercasevar.

Çevrimiçi deneyin! (tüm test durumlarını içerir)


4

C, 147 145 112 bayt

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

Çevrimiçi demo

Sağol ugoren !


2
Bazı ucuz püf noktaları - silmek, parametre olarak #includetanımlamak m- main(m),
ugoren

2
Ayrıca, %.3sbiçim boş sonlandırmayı da kaydeder.
ugoren

@Ugoren teşekkürler! Ben de değişti "%4s%2d"etmek "%4s%d".
Marco,

main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}çok kısa
l4m2

4

JavaScript ES6, 77 66 bayt

@ Bálint sayesinde 11 bayt kaydedildi!

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

DateSınıf tarafından döndürülen dizgeyi çıkararak tarihi alın . sonra büyük harfle yazılır ve yılı ekler.

ES5 sürümü:

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


Aynı atob tekniği ile 66 bayttan birini yaptım, ancak kopyalayamıyorum
Bálint

@ Bálint Ben de 66 bayt aldığımı sanıyordum ancak bayt sayacımızı kötü kopya yapıştırma nedeniyle
yanlıyorum

Ayın ismini(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint

1
Anlamadım a[4]- -a[5]. Yanlış olan a[4]+a[5]-1neydi?
Neil

1
new Date(0,a[4]+a[5]-1)+""=>new Date(0,a[4]+a[5]-1)+0
l4m2

3

C #, 94 87 bayt

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

C # 6 Sözdizimi kullanarak 7 bayt kaydedildi.

Çevrimiçi dene


Lambdas için dönüş türü bilgilerini bırakabilirsiniz, yaniC(string s)=>...
kedi


3

Java 8, 154 113 bayt

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

Açıklama:

Çevrimiçi deneyin.

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

Sanırım içe aktarmayı kaldırırsanız ve bunun yerine doğrudan ona başvurursanız, kısaltabilirsiniz java.text.SimpleDateFormat.
Frozn

2
@Frozn Aslında, import java.text.*;19 bayt ve java.text.her ikisi de önünde iki kez SimpleDateFormat20 bayt. Böylece düşürmek yerine 1 bayt artacaktır.
Kevin Cruijssen

Oh evet haklısın. Ben her zaman ungolfed versiyonuna bakarım ve golf versiyonuna eşit olduğunu düşünüyorum. Üzgünüm :)
Frozn

@Frozn Ah, ayrıca biraz da kötü. Genellikle hala .*;kodlanmamış kod için kullanıyorum , ama bu sefer onu ihmal etmiş gibiyim. import java.text.*;
İşimde

2

Oracle SQL, 49 Bayt

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

Veriler, bir tür Tsütunla adlandırılan bir tabloya eklenmelidir , ya da sadece tüm yıllar> 1000, NVARCHAR2(6)CHAR(6)NUMBER

Kullanımı:

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;

SELECT yerine PRINT kullanmak ve bunun yerine değişken olarak bir değişken kullanarak tabloya başvurmamak mümkün mü? Girdi değişkenini bildirmek ve değeri atamak bayt sayısını etkilemez
t-clausen.dk

Tablodan girdi alma izni var mı? Codegolf Etiket bilgileri hiçbir düşündürmektedir.
pajonk

@ t-clausen.dk, baskı kullanmanın en kısa yolu 58 karakterdir: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print nve daha kısa yollarınız varsa lütfen bana bildirin VARIABLE n varchar2;BEGIN:n:='201605';END;(31) yerine tek bir giriş için 42 ekstra karakter gerekir insert into t values('000112');.
Giacomo Garabello

@pajonk bu cevapta kimse bana masa kullanımı hakkında hiçbir şey söylemedi
Giacomo Garabello

1
@pajonk göre bu , giriş için tabloları kullanabilirsiniz
t-clausen.dk

2

Microsoft SQL Server, 57 Bayt

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

UpperFonksiyon ile bekleneceği üzere Büyük harf ay üretmez biçimi olarak gereklidir MMM biçimi deseni.

Kullanımı:

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

Sadece cevabını gördüm, benimki gibi, şu ana kadar fark etmedim, cevabımı kaldırdım
t-clausen.dk

Tablodan girdi alma izni var mı? Codegolf Etiket bilgileri hiçbir düşündürmektedir.
pajonk

@pajonk burada cevap bir tablodan girdi kullanmaz, cevap en üst satırdır ve giriş değişkeni kodlanmıştır. Daha önce bahsettiğim gibi tabloları giriş değişkenleri olarak kullanabileceğinizi unutmayın. Alt kısım birkaç değerin nasıl dönüştürüleceğine bir örnektir. TSQL'de STDIN veya giriş ifadeleri yoktur. Veri eklemenin tek yolu değişkenleri veya tabloları kullanmaktır. Cevaplarımın tümü giriş için olanları kullanıyor
t-clausen.dk

Tamam, açıkladığınız için teşekkürler.
pajonk

2

Pyth, 45 bayt

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

Çevrimiçi deneyin!

Açıklama:

+:."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).

Paketlenmiş dize içerir "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". İkisi JANde onu dizine dizilmiş bir dizine dizine yerleştireyim.

EDIT: TIO ile uğraşan hata giderildi


2

R , 65 bayt

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

Çevrimiçi deneyin!

Bir dize olarak girdi alır, sabiti kullanır month.abb. Modül kullanır ve substrilgili değerleri çıkarmak.


:dönüştürmek için akıllıca kullanın integer!
Giuseppe

@Giuseppe Benim fikrim değil :) Buradan aldım . Muhtemelen bunu mevcut cevaplarımın bir kısmına uygulayabilirim!
JayCe

@Giuseppe Kullanırken daha kısa bir hack buldum el- 1 az bayt.
JayCe,

1

J, 70 bayt

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

kullanım

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

açıklama

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

1

Pyth, 39 bayt

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

Test odası.


1

jq, 35 karakter

(34 karakter kod + 1 karakter komut satırı seçeneği.)

(Sadece olmadığını çalıştı ^tarafından kullanılan hile Dijital Travma onun içinde Bash cevap çok JQ çalışır.. Şimdi bu cevabın en önemli karakteri ilham kim olduğunu işleri. (Alternatif kullanmaktır ascii_upcaseişlevi.))

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

Örnek çalışması ( -RTüm test durumlarını geçmek için sadece bu örnekte kullanılan seçenek .)

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

On-line test: (-R'nin URL'den geçirilmesi desteklenmiyor - bu nedenle giriş JSON dizgisi hazırlığı olarak geçildi. -rURL'den geçmek desteklenmiyor - Ham Çıktıyı kendiniz kontrol edin.)


1

Faktör, 82 78 bayt

[ [ 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

1

PHP, 78 bayt

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

"2038 yılı problemi" gibi bazı bilgisayarlarda oluşabilir burada . Ama diğerleri gibi, burada olduğu gibi .


@Titus, lütfen sorun olursa diğer insanların yayınlarını düzenlemeyi dene ve kendi çözümlerini ekle; bunun yerine, lütfen cevaba yorum yapın VEYA kendinize yeni bir cevap oluşturun.
Value Ink

1

Hızlı 2.2, 149 bayt

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

Bunu Kotlin'den daha kısa almaya çalışıyorum ... Utanç verici bir ayarlayıcı NSDateFormatteryok dateFormat. NSDateFormatterayrıca dateFormatek kayıplara neden olan varsayılan bir değere sahip değildir .

Swift 3, 136 bayt

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

NSBazı sınıflardaki ön ekin kaldırılması sayesinde Swift 3'ün biraz daha kısa cevap vermesini sağladım. Yine de Kotlin’den daha kısa değil.

Test işlevi ve durumlar:

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

1

R, 154 150 114 112 bayt

Altı basamaklı girişi "b" ye alır, ilk dört basamağı son iki basamağından ayırır, 2 basamaklı ayı kısaltır ve büyük harf yapar ve 3. ve 4. basamakla birleştirir.

golfed:

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

Ungolfed:

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

EDITS: değişkenli ikilileri değiştir; aptal olmamı düzeltti. Fonksiyonu isimsiz olarak çevirerek -2 byte (teşekkürler, cat).


Güzel cevap! a=Anonim bir işlev için bırakabilirsiniz
kedi

@cat Anonim işlevler hakkında fazla bilgim yok ama işlevi kaldırırsam işlevin başına ve sonuna parantez eklemem gerekmez a=mi? Bunun gibi bir şey: (function(m) {a=3;m*a})(10)
yumuşak bir yastık

1
Hayır, 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="")}kendi başına bir işlev nesnesidir.
kedi

Bu işe görünmüyor. üzerinde RStudio with R 3.2.3 (2015-12-10)alıyorumError in i(o, b) : invalid format '%06d'; use format %s for character objects
kedi

@ Cat Darn yeni sürümler her şeyi karıştırıyor! RStudio yayınındayım R version 3.1.1 (2014-07-10)ve iyi çalışıyor. Bu nasıl çalışıyor, yeni sürümü alıp kodu değiştirmeli miyim? Ayrıca anonim işlev ipucu için teşekkürler!
yumuşak bir yastık
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.