ミドルネームのコンマは誰ですか?


18

あなたの課題は、入力として名前(文字列)を取得することです

Albert Einstein

および出力:

Einstein, Albert

擬似コード:

set in to input
set arr to in split by " "
set last to the last element of arr
remove the last element of arr
set out to arr joined with " "
prepend ", " to out
prepend last to out
output out

その他のテストケース:

John Fitzgerald Kennedy => Kennedy, John Fitzgerald
Abraham Lincoln => Lincoln, Abraham

ルール

  • 入力は常に正規表現に一致し^([A-Z][a-z]+ )+([A-Z][a-z]+)$ます。
  • 変な名前を処理する必要はありません。たとえ出力が技術的に間違っていても、ここで問題ありません。
  • 末尾の空白/改行は問題ありません。
  • 質問は?以下にコメントしてください!

末尾のスペースは許可されますか?
バリューインク

解決策はかなりsiply私置き換えることができますので、私はだまされやすい人として閉じle,、あなたがこの質問を持っている
Downgoat

2
@Downgoatこのチャレンジでは2つの単語を指定しますが、これに対する解決策は任意の数の単語に対して機能する必要があります。私の知る限り、TIOリンクを持つ回答の、唯一真剣に解決策を置き換えて、この質問に対する正しい答え与えleては,
-ngenisis

7
@Downgoatに-4があります。少なくともこれのだましとしてその1つを閉じます。
スティーブン

1
末尾のスペースは大丈夫ですか?
トムカーペンター

回答:


10

05AB1E、7バイト

コード:

',ì#Áðý

05AB1Eエンコードを使用します。オンラインでお試しください!

説明:

',ì         # Prepend the input to ","
   #        # Split on spaces
    Á       # Rotate every element one position to the right (wrapping)
     ðý     # Join the array by spaces

1
よろしく!リスト形式でそれを行う方法がなければならないと知っていました。
エミグナ

9

JavaScript(ES6)、34バイト

s=>s.replace(/(.+) (.+)/,'$2, $1')

デモ:

let f = s=>s.replace(/(.+) (.+)/,'$2, $1')

;[ 'Albert Einstein', 'John Fitzgerald Kennedy', 'Abraham Lincoln' ].forEach(
  s => console.log(`${s} => ${f(s)}`)
)



7

ゼリー、7バイト

;”,Ḳṙ-K

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

私はジェリーをあまりよく知りませんが、他の答えを読んで、彼らは最適なアルゴリズムを使用していないように見えました...だからここにあります:

説明

;”,Ḳṙ-K
;”,        Append a comma to the end of the string
   Ḳ       Split on spaces
    ṙ-     Rotate the array by -1 (1 time towards the right)
      K    Join with spaces

7

Vim、10バイト/キーストローク

v$F dA, <esc>p

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


良いものですが、私はそれを機能させるのに苦労し<esc>ましたが、あなたのコードには現れません。試してみたい他の人への通知:これは、名前がエディターに書き込まれ、現在は通常モードでファイルの先頭にいることを前提としています。
sigvaldm

7

V / vim、9 8バイト

$bD0Pa, 

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

おかげで1バイト節約

末尾にスペース文字があることに注意してください。ルールごとに許可されている末尾のスペースを残します。

説明:

$       " move the cursor to the end of the line
 b      " move the cursor to the beginning of the current word
  D     " delete to the end of the line
   0    " move the cursor to the start of the line
    P   " paste in front of the cursor.
     a  " append (enter insert mode with the cursor one character forward)
      , " Literal text, ", "

良いですね!挿入モードを最後に置くことが必要なことを避けるために良い考え<esc>です。$bD代わりにを実行すると、1バイト節約できます$diw。:)
DJMcMayhem

ありがとう。$bDしかし、1文字の名前を処理しません。許可されるかどうかをOPに尋ねました
ケビン

そのように見えるので、更新しています。
ケビン




5

C、45バイト

編集:たぶん、2つ以上の単語を含む入力の要件に気付きました。これは現状のままにしておきますが、これは2つの単語に対してのみ機能することに注意してください。

編集:削除されました\n。必要に応じて2バイトを追加してください。

main(a,b)int**b;{printf("%s, %s",b[2],b[1]);}

gcc name.cGCC 6.3.1でコンパイルします。警告を無視します。使用法:

$./a.out Albert Einstein
Einstein, Albert

言語の乱用:

  • の暗黙的な戻りタイプintmain、何も返されませんでした。
  • の暗黙の宣言printf。とにかくGCCには含まれます。
  • のタイプが間違っていbます。関係ありません%s

@ Khaled.Kにではmain(a,b)int**b;なく、使用のヒントをありがとうmain(int a, int **b)


素敵な最初のゴルフ、ウェブサイトへようこそ、またmain(a,**b){printf("%s, %s",b[2],b[1]);}40バイト
Khaled.K

ありがとう:)私は実際に型を完全に省略することを考えましたが、何らかの理由でコンパイルされませんでした。
sigvaldm

1
これは動作しますmain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
-Khaled.K


4

sed、-E = 20バイトの場合は19 + 1

s/(.*) (.*)/\2, \1/

グループ化括弧をエスケープする必要を避けるために、-r(GNU)または-E(BSD、最近のGNU)を使用する必要があります。

コマンドラインで記述されている場合、シェルによって複数のトークンとして解析されないように、引用符で囲む必要があります。

sed -E 's/(.*) (.*)/\2, \1/'

4

C、68バイト

別の投稿を追加するのが間違っていないことを願っていますが、これは以前投稿したCソリューションとは少し異なるソリューションです。これは任意の数の名前を受け入れます。

main(a,b)int**b;{for(printf("%s,",b[--a]);--a;printf(" %s",*++b));}

gcc name.c(GCC 6.3.1)でコンパイルし、警告を無視します。使用法:

$./a.out John Fitzgerald Kennedy
Kennedy, John Fitzgerald

@ Khaled.Kのヒントをありがとう main(a,b)int**b;

@Alkanoへのforループのヒントをありがとう。


1
whileの代わりにforを使用すると、2バイトを獲得できます main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
-Alkano

これはクレイジーに聞こえますが、これを行うことができますmain(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
-Khaled.K

非常に素晴らしいトリック:)私はmainを再帰的に呼び出すことを考えたことがありません。しかし、それはまったく機能しません。出力は「Kennedy、Fitzgerald、John、。/ a.out」main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}でした。部分的な解決策は次のようになります。これは2バイト短く、プログラム名を印刷しないようにしますが、各名前の間にコンマを使用します。
sigvaldm

3

Mathematica、45バイト

#/.{a__,s=" ",b__}/;{b}~FreeQ~s->{b,",",s,a}&

入力を文字列としてではなく文字のリストとして取得することで、ngenisisの答えを数バイト節約しました。パターン置換ルールを使用する純粋な機能。

Mathematica、49バイト

#~Join~{","," "}~RotateLeft~Last@Position[#," "]&

文字のリストを入力として受け取り、文字のリストを返す別の純粋な関数。これは、入力に追加","" "てから、最後のスペースが最後になるまで文字のリストを回転させます。(したがって、上記の最初の関数とは異なり、出力には末尾スペースがあります。)


#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&ですが4短いバイトが、私はことを発見したExcept私は保存、文字列パターンには不要な12バイト。
-ngenisis

ああ、x答えの中で最長のものが自動的に選択されますか?
グレッグマーティン

はい、文字列のパターンマッチングは貪欲ですが、通常のパターンマッチングは怠zyです。
-ngenisis

nice <waves white flag>
グレッグマーティン

3

C#、76 72バイト

s=>System.Text.RegularExpressions.Regex.Replace(s,"(.+) (.+)","$2, $1");

@KevinCruijssenの助けを借りて4バイトを保存しました

76バイトの部分文字列を使用する古いバージョン:

s=>s.Substring(s.LastIndexOf(' ')+1)+", "+s.Substring(0,s.LastIndexOf(' '));

1
System.Text.RegularExpressions.RegexC#ではあまりにもひどいので、s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");1バイトだけです。
ケビンCruijssen

1
@KevinCruijssen本当ですが、静的メソッドを使用してRegex4バイトを保存できます
-TheLethalCoder



2

05AB1E、9バイト

#`',«.Áðý

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

説明

#           # split input on spaces
 `          # push each name separately to stack
  ',«       # concatenate a comma to the last name
     .Á     # rotate stack right
       ðý   # join stack by spaces

ええ、おそらくスペースコマンドで参加する必要があります:p
アドナン

@アドナン:どれくらいの頻度で使用されているかを見るといいでしょう:)
エミグナ



2

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

@(a)regexprep(a,'(.+) (.+)','$2, $1')

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

@ngenisisのRetinaの回答に基づいて、OctaveとMATLABの両方で正規表現ゲームをプレイすることもできます。これにより、以前の回答よりもかなり数バイト節約できます。


古い答え:

この答えは、単純な正規表現と比べてよりユニークな方法であると考えて、ここに残しておきます。

オクターブ49 47バイト

@(a)[a((b=find(a==32)(end))+1:end) ', ' a(1:b)]

古いオンラインで試してみてください!

出力を生成する匿名関数。

基本的に、コードはを使用して文字列の最後のスペースを最初に見つけますb=find(a==32)(end)。次にa(b+1:end)、を使用して文字列の最後の部分(スペースの後)をb取得します。ここで、は最後のスペースを見つける出力です。また、で文字列の先頭を取得しa(1:b-1)、両方を一緒に連結し', 'ます。

私はすでに典型的なものに対して数バイトを保存しましたfind(a==32,1,'last')。保存するものがもっとあるかどうかはよくわかりません。


2

ゼリー、9バイト

ḲµṪ;⁾, ;K

説明、っぽい:

ḲµṪ;⁾, ;K
Ḳ           # Split the input by spaces
 µ          # Separate the link into two chains. Essentially calls the right half with the split string monadically.
  Ṫ         # The last element, (The last name), modifying the array.
   ;        # Concatenated with...
    ⁾,      # The string literal; ", "
       ;    # Concatenated with...
        K   # The rest of the array, joined at spaces.

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

すべてのテストケースで試してください。


2

Python 3、52バイト

lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])

非常にシンプルで、ゴルフのヘルプを使用できます。最後の単語を先頭に置き、「、」で結合します。

テストケース:

>>> f=lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])
>>> f("Monty Python")
'Python, Monty'
>>> f("Albus Percival Wulfric Brian Dumbledore")
'Dumbledore, Albus Percival Wulfric Brian'


2

Java、110 62バイト

String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}

非静的メソッド。

-48バイト、Kevin Cruijssenのおかげ


String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}短い(91バイト)。
ケビンCruijssen

そして、String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}さらに短いです(62バイト)。
ケビンCruijssen

@KevinCruijssenああいいね。ありがとう!正規表現をより適切に使用することを学ぶ必要があります
。P– HyperNeutrino


2

Excel、174 170 168バイト

ヴェルニッシュのおかげで2バイト節約

=MID(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1))&", "&LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

これは空想的でも賢明でもありません。これはかなり基本的な方法です。配列の式にはもっと短い方法があるはずですが、うまく機能するものが見つかりません。


ソリューションは、3つの名前がある場合にのみ機能します。たとえば、「Albert Einstein」は処理しません。
ヴェルニッシュ

@Wernischありがとう!これで動作するはずです。
エンジニアトースト

末尾の空白は質問に従って許可されます。-1LEFT関数のtheを省くことで2バイト節約できると思います。
ヴェルニッシュ


1

MATL、10バイト

44hYb1YSZc

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

説明

44h    % Implicitly input a string. Postpend a comma
       % STACK: 'John Fitzgerald Kennedy,'
Yb     % Split on spaces
       % STACK: {'John', 'Fitzgerald', 'Kennedy,'}
1YS    % Circularly shift 1 step to the right
       % STACK: {'Kennedy,', 'John', 'Fitzgerald'}
Zc     % Join with spaces between. Implicitly display
       % STACK: 'Kennedy, John Fitzgerald'

1

Gema、23文字

* =@append{s; *}
\Z=,$s

ここでの唯一の注目すべき点は、チャレンジがどのようにしてGemaパターンの非貪欲性の弱点にぶつかったかです。

サンプル実行:

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.