YYYYMMからMMMYYに変換


54

このSO質問に基づいて。

チャレンジはかなり単純YYYYMMですMMMYY。フォーマットで日付期間を指定すると、フォーマットで出力します。

ルール:

  • 入力は、数字または数字のみで構成される正確に6文字の文字列になります。
  • 最後の2桁がの間になります0112
  • 出力は、月の大文字の3文字コード(下)を表し、入力の一部の最後の2桁を表す形式MMMYYでなければなりません。MMMYYYYYY

対応するコードを含む月のリスト:

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

例:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34

5
この質問は非常にバランスが取れています。少なくともPythonでは、手動解析と日付ライブラリはほぼ同じになります。
bkul

10
昨日、SOロゴの横にあるHNQで「YYYYMMをMMMYYに変換」を見ました。これで、PCGロゴの横に同じタイトルが表示されます。私は非常に混乱していた:)

回答:


20

MATL、18 14 13バイト

4e!Z{Zc12XOXk

入力は文字列として提供されます(単一引用符で囲みます)。

MATLABは自動的に解析できるため、このバージョンはMATLAB上のMATLでのみ実行されますdatestr('2016 04')

説明

        % 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

これはOctaveで動作する18バイトのバージョンです(したがってオンライン通訳)

'yyyymm'2$YO12XOXk

オンラインで試す

すべてのテストケースの修正バージョン

説明

            % 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
私はこれがどのように破られるかわかりません.. gg
アドナン

20

Python 3、70バイト

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

これには、組み込み関数strftimestrptime関数が使用されます。

さらに1バイトの場合、文字列を手動で解析するバージョンを次に示します。

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

これは月の名前を興味深い方法でエンコードします(バイトを保存してくれたHenry Gomersallに感謝します)。


11
その手動解析はおかしいです。
モーガンスラップ

@MorganThrapp この答えからアイデアを得た。
bkul

1
手動バージョンは、数値を入力として使用する場合、Python 2で69バイトで実行できますlambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]
xnor

1
これは1バイトを失いますが:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
ヘンリーゴマーサル

1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae-「インポート時間」は6文字節約できますが、10(「時間」、2回)かかります
TLW


18

PowerShell v2 +、49 46バイト

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

3バイトを節約してくれた@Joeyに感謝します!

コマンドライン入力を介して入力$args[0]を明示的な文字列(例:)として'201604'受け取ります。string.Insert()関数を使用-して適切なスペースにaを入れ、その結果の文字列は、3か月の略記と2桁の年を指定するformatパラメーターを使用して、Get-Dateコマンドレットへの入力を形成します-U。それを括弧にカプセル化し.ToUpper()、出力文字列を大文字にするためにタックします。その文字列はパイプラインに残り、印刷は暗黙的です。

また、指摘したように、これはロケールに依存します。以下は、これが正しく機能する場所で使用しているロケール情報です。

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

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

を引用符で囲む必要はありませんMMMyy。これはコマンドレットへの単純な引数だからです。また、単に使用することができ-UFormat %b%y、すなわち、-u %b%yさらに短くなる、代わりに。補足:このソリューションはロケールに依存します(個人的には嫌いです)が、それを説明するのはかなり長いでしょう。
ジョーイ

-UFormat代わりに優れたコール。ありがとう!私は周りの引用についても知りませんでしたMMMyy-それは将来のために知っておくと良いことです。
AdmBorkBork

8

網膜71 70バイト

1バイトを節約してくれたSp3000に感謝します。

バイトカウントはISO 8859-1エンコードを前提としています。後続の改行は重要です。

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

R-6`.

オンラインでお試しください!

説明

撮影201604例として:

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

これにより、年の最後の2桁が月に置き換えられます。また、改行を使用して単項式で月が拡張され、月のリストが逆に追加されます。

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

ここで、改行(0x0A)を表します。

+`...¶

ここで、3つの非改行文字とそれに続く改行を繰り返し削除します。つまり、月を表す各ラインフィードの最後から月のリストを使い果たします。

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

これが挿入された理由ですXXX。月がから数え始めるので、11月でも少なくとも3文字は常に削除します。

R-6`.

最後に、最後から6文字目までをすべて削除します。つまり、最後の5文字のみを保持します。


それはかなり賢いことです。
AdmBorkBork

7

CJam、50 46バイト

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

オンラインでお試しください。文字列を圧縮して数バイトを節約してくれたMartin Enderに感謝します。

説明

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文字(161バイト)

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

各月の名前(JAN、FEBなど)が基数36の数字であり、対応するUnicodeシンボルにエンコードされることを考慮してください。次に、文字列から対応するシンボルを取得し、それを再びベース36でエンコードし、その後、いくつかの単純な文字列操作を行います。

わずかに未使用:

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
}

ここで実行されていることがわかります:https : //ideone.com/IKlnPY


5

Python、83バイト

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

あなたとほぼ同じ答えを投稿しました。答えを書くのに時間がかかったので、私はあなたのものを見ませんでした。あなたが私に私のものを削除して欲しいなら、私はそうするでしょう、またはあなたは私のものを使っていくつかの余分なバイトを取り除くことができます。
bkul

1
大丈夫、あなたは私を13バイト倒しました、私は認めます。私もあなたのマニュアル回答が好きです。
アトラロジスト

5

Kotlin、100バイト

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

Java SimpleDateFormatのかなり簡単な使用


1
うーん、私はKotlinを知りませんが、Javaから派生しているので、SimpleDateFormat(つまりimport java.text.*;)のインポートを含めるべきではありませんか?
ケビンCruijssen

チャレンジは出力を要求するため、機能の一部として印刷が必要であると想定します。
ジョンウェルズ

5

MATLAB /オクターブ、42バイト

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

ans日付を表す文字列で呼び出されるという名前の匿名関数を作成しますans('201604')

オンラインデモ

このソリューションではdatenum、入力日付をシリアル日付番号に変換datestrし、定義済みの出力仕様mmmyy12)を使用して、必要な形式の文字列表現を生成します。最後に、大文字の月は出力オプションではないため、upperこれをに変更しMMMYYます。


1
うわー、ゴルフ以外の言語で他の全員を打ち負かすことにgj!
ダウンゴート

5

05AB1E、51 42 41バイト

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

説明

                                           # 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

オンラインで試す

@Adnanの好意により、文字列圧縮により9バイト節約


1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"9バイトを節約する代わりに。
アドナン

5

JavaScript、87 84 80 79バイト

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

月を取得するには、日付( "YYYYMM"から "YYYY-MM"に変換されます)を取得し、月の最初の3文字である文字5〜8を取得します。ただし、大文字に変換するには多くの費用がかかります。

デモ:

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


最初はAPR16
Downgoat

@Upgoatそして、あなたのために何が表示されますか?
ニカエル

1
私は取得していますMAR16
Downgoat

@Upgoat Huh、それは奇妙です、なぜこのようになるのでしょうか?私がこれ得るからです。
ニカエル

私にとってはそれが表示されますAPR16が、3番目のテストケースはDEC私のためにのみ表示されます。
アドナン

4

ジュリア、57 56 53バイト

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

これは、文字列を受け入れて文字列を返す匿名関数です。呼び出すには、変数に割り当てます。

最初にDateTime、型コンストラクタとフォーマット文字列を使用してオブジェクトを構築します。ここでm前者のケースは関係ありませんが、フォーマット文字列のシングルは1桁と2桁の両方の月を取得することに注意してください。日が指定されていないため、月の最初が想定されます。

次にDates.formatBase.Datesサブモジュールの関数を使用して、値を文字列としてフォーマットできます。文字列uyyは3文字の月名と2桁の年を取得しますが、結果はタイトルケースになります。たとえば、目的のAPR16ではなく、Apr16であるため、必要uppercaseです。

オンラインでお試しください!(すべてのテストケースを含む)


4

C、147の 145 112バイト

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

オンラインデモ

ありがとう、ウゴレン


2
いくつかの安価なトリック-削除、パラメーターとして#include定義m- main(m)
ugoren

2
また、この%.3s形式はヌル終了を保存します。
ウゴレン

ありがとう@ugoren!私もに変更"%4s%2d"しました"%4s%d"
マルコ

main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}かなり短い
-l4m2

4

JavaScriptのES6、77の 66バイト

@Bálintのおかげで11バイト節約されました!

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

Dateクラスから返された文字列を抽出して日付を取得します。その後、年を大文字にして追加します。

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


私は、同じATOB技術と66バイトに1を作ったが、私はそれをコピーすることはできません
バリント

@Bálint66バイトもあると思ったが、コピーペーストが
不適切で

あなたはと月の名前を得ることができる(Date(0,a[4]- -a[5])+"").substr(4,3)
バリント

1
分かりませんa[4]- -a[5]。何が問題だったのa[4]+a[5]-1ですか?
ニール

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

3

C#、94 87バイト

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

C#6構文を使用して7バイトを保存しました。

オンラインで試す


あなたはすなわち、ラムダのための戻り値の型情報をオフに残すことができますC(string s)=>...


3

Java 8、154 113バイト

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

説明:

オンラインでお試しください。

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

インポートを削除し、代わりにで直接参照する場合は、短縮できると思いますjava.text.SimpleDateFormat
Frozn

2
@Frozn実際にimport java.text.*;は、19バイトでありjava.text.、両方の前の2回SimpleDateFormatは20バイトです。したがって、値を下げる代わりに1バイトずつ増やします。
ケビンCruijssen

ああそうだね。私はいつもゴルフのないバージョンを見て、それはゴルフのバージョンと等しいと思います。すみません:)
Frozn

@Froznああ、これもちょっと悪い。通常.*;、未使用のコードにはまだ使用していますが、今回はそれを無視しているようです。私は私の仕事でJavaを使用しているため、自動的に純粋な輸入品に変換オプションを保存していて、私は単純にそれを変更するのを忘れてimport java.text.*;...
ケビンCruijssen

2

Oracle SQL、49バイト

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

データが呼び出され、テーブルに挿入されなければならないT列でNのタイプのVARCHAR2(6)CHAR(6)または、すべての年>は1000年である場合にのみ、 NUMBER

使用法:

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の代わりにPRINTを使用し、代わりに変数を入力として使用してテーブルを参照しないことは可能ですか?入力変数の宣言と値の割り当ては、バイトカウントに影響しません
-t-clausen.dk

テーブルから入力を取得できますか?codegolfタグ情報がないことを示唆しています。
パジョン

@ t-clausen.dk printを使用する最短の方法は58文字です。1 begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print nつのinput(VARIABLE n varchar2;BEGIN:n:='201605';END;)に対して、31(insert into t values('000112');)ではなく42の追加の文字が必要です。短い方法がある場合は教えてください。
ジャコモガラベッロ

中@pajonk この回答の誰もが私のテーブルの使用については何も教えてくれ
ジャコモGarabello

1
@pajonkによると、この、あなたが入力のためにテーブルを使用することができます
t-clausen.dk

2

Microsoft SQL Server、57バイト

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

Upperフォーマットと予想されるように、上ケースヶ月生成しないように機能が必要とされるMMMのフォーマットパターンを。

使用法:

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

ちょうどあなたの答えを見た、それは私のようなもので、今まで気づかなかった、私の答えを削除した
-t-clausen.dk

テーブルから入力を取得できますか?codegolfタグ情報がないことを示唆しています。
パジョン

@pajonkここでの答えはテーブルからの入力を使用せず、答えは一番上の行で、入力変数はハードコードされています。前述のように、テーブルを入力変数として使用できることに注意してください。下部は、いくつかの値を変換する方法の例です。TSQLには、STDINも入力ステートメントもありません。データを追加する唯一の方法は、変数またはテーブルを使用することです。私の答えはすべて入力に使用しています
-t-clausen.dk

わかりました、ありがとう。
パジョン

2

Pyth、45バイト

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

オンラインでお試しください!

説明:

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

パックされた文字列にはが含まれます"JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"。2つJANのsは、1を擬似的にインデックス付けできるようにするためのものです。

編集:TIOをいじっていたバグを修正


2

R、65バイト

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

オンラインでお試しください!

入力を文字列として受け取り、定数を活用しmonth.abbます。モジュラスを使用して、substr関連する値を抽出します。


巧妙な使用:に変換しますinteger
ジュゼッペ

@Giuseppe私の考えではありません:)私はここからそれを取りまし。おそらく、既存の多くの回答に適用できます!
JayCe

@Giuseppe el-1バイト少ない- を使用して短いハックを見つけました。
JayCe

1

J、70バイト

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

使用法

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

説明

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バイト

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

テストスイート。


1

jq、35文字

(34文字のコード+ 1文字のコマンドラインオプション。)

Bashの回答Digital Trauma^使用するトリックがjqでも機能するかどうかを試してみました。これで、この回答の最も重要なキャラクターに影響を与えた人がわかりました(代わりに関数を使用します)。ascii_upcase

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

サンプルの実行(-Rすべてのテストケースに合格するために、このサンプルでのみ使用されるオプション)

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

オンラインテスト:(URLを介した-Rの受け渡しはサポートされていません。そのため、入力はJSON文字列リテラルとして渡されます-r。URLを介した受け渡しはサポートされていません。


1

ファクター、82 78バイト

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

説明した:

[                    ! 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バイト

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

「2038年問題は、」よう、一部のコンピュータで発生する可能性がここに。しかし、ではない、他では、としてここに


@Titus、問題がある場合は他の人の投稿を編集したり、独自の解決策を挿入したりしないでください。代わりに、回答にコメントするか、自分で新しい回答を作成してください。
バリューインク

1

Swift 2.2、149バイト

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

これをKotlinより短くしようとしています...これNSDateFormatterは、を設定するイニシャライザーがないのは残念dateFormatです。 NSDateFormatterまた、デフォルトdateFormat値がないため、追加の損失が発生します。

Swift 3、136バイト

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

NS一部のクラスでプレフィックスが削除されたおかげで、Swift 3の回答を少し短くすることができました。それでもKotlinよりも短くありません...

テスト機能とケース:

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バイト

6桁の入力を「b」に入力し、最初の4桁を最後の2桁から分離し、2桁の月を省略して大文字にし、3桁目と4桁目と連結します。

ゴルフ:

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

ゴルフをしていない:

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

編集:重複した名前を変数に置き換えました。私が愚かであることを修正しました。-関数を匿名にすることで2バイト(ありがとう、cat)。


素敵な答え!あなたはオフに残すことができますa=匿名関数のために

@cat私は匿名関数にあまり精通していませんが、a=?を削除しても関数の最初と最後に括弧を追加する必要はありません。このようなもの: (function(m) {a=3;m*a})(10)
柔らかい枕

1
いや、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="")}それ自体が関数オブジェクトです。

これは機能していないようです。上でRStudio with R 3.2.3 (2015-12-10)私を取得Error in i(o, b) : invalid format '%06d'; use format %s for character objects

@catダーン新バージョンはすべてを台無しにします!RStudioを実行R version 3.1.1 (2014-07-10)していますが、正常に動作します。ここでこれはどのように機能しますか?新しいバージョンを取得してコードを変更する必要がありますか?また、匿名関数のヒントをありがとう!
柔らかい枕
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.