Siapa yang memiliki koma untuk nama tengah?

18

Tantangan Anda adalah mengambil nama (string) sebagai input

Albert Einstein

dan output:

Einstein, Albert

Kodesemu:

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

Lebih banyak kasus uji:

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

Aturan

  • Input akan selalu cocok dengan regex ^([A-Z][a-z]+ )+([A-Z][a-z]+)$.
  • Anda tidak perlu menangani nama-nama aneh , bahkan jika outputnya secara teknis salah, tidak masalah di sini.
  • Trailing whitespace / newline adalah OK.
  • Ada pertanyaan? Komentar dibawah!
programmer5000
sumber
Apakah spasi tambahan diperbolehkan?
Value Ink
Aku menutup sebagai korban penipuan karena solusi dapat cukup banyak siply ganti ledengan ,dan Anda memiliki pertanyaan ini
Downgoat
2
@Downgoat Tantangan itu menentukan dua kata, sedangkan solusi untuk ini harus bekerja untuk banyak kata. Sejauh yang saya tahu, dari jawaban dengan link TIO, hanya Serius solusi memberikan jawaban yang benar untuk penggantinya pertanyaan ini ledengan ,.
ngenisis
7
@Downgoat yang memiliki -4. Paling tidak tutuplah yang sebagai penipu ini.
Stephen
1
Apakah trailing spasi ok?
Tom Carpenter

Jawaban:

10

05AB1E , 7 byte

Kode:

',ì#Áðý

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan:

',ì         # Prepend the input to ","
   #        # Split on spaces
    Á       # Rotate every element one position to the right (wrapping)
     ðý     # Join the array by spaces
Adnan
sumber
1
Tergantung! Saya tahu harus ada cara untuk melakukannya dalam bentuk daftar.
Emigna
9

JavaScript (ES6), 34 byte

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

Demo:

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

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

pilin
sumber
8

Retina , 19 17 16 byte

Sunting: Terima kasih kepada Riker karena telah menyimpan 3 byte

(.+) (.+)
$2, $1

Cobalah online!

ngenisis
sumber
1
tahan, (.+)bekerja juga untuk keduanya.
Rɪᴋᴇʀ
Saya tidak mengerti mengapa Anda menggunakan \wdi tempat pertama
theonlygusti
1
@ theonlygusti Saya lebih akrab dengan pencocokan pola di Mathematica, yang menggunakan pencocokan malas daripada serakah.
ngenisis
7

Jelly , 7 byte

;”,Ḳṙ-K

Cobalah online!

Saya tidak terlalu mengenal Jelly, tetapi membaca jawaban lain sepertinya mereka tidak menggunakan algoritma yang optimal ... jadi ini dia:

Penjelasan

;”,Ḳṙ-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
Leo
sumber
7

Vim, 10 byte / penekanan tombol

v$F dA, <esc>p

Cobalah online!

DJMcMayhem
sumber
Bagus, tapi saya kesulitan membuatnya berfungsi, <esc>tidak muncul dalam kode Anda. Untuk pemberitahuan kepada orang lain yang ingin mencoba: Ini mengasumsikan bahwa namanya ditulis dalam editor dan bahwa Anda saat ini berada di awal file dalam mode normal.
sigvaldm
7

V / vim, 9 8 byte

$bD0Pa, 

Cobalah online!

Disimpan satu Byte berkat

Perhatikan ada karakter spasi tambahan. Meninggalkan ruang tambahan, yang diizinkan sesuai aturan.

Penjelasan:

$       " 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, ", "
Kevin
sumber
Yang bagus! Pemikiran yang baik menempatkan mode penyisipan di akhir untuk menghindari kebutuhan <esc>. Anda dapat menyimpan satu byte dengan melakukan $bDalih - alih $diw. :)
DJMcMayhem
Terima kasih. $bDtidak menangani nama satu karakter, saya sudah bertanya OP apakah itu diizinkan.
Kevin
Sepertinya begitu, jadi memperbarui.
Kevin
6

Mathematica, 52 40 byte

StringReplace[x__~~" "~~y__:>y<>", "<>x]
ngenisis
sumber
5

C, 45 byte

EDIT: Saya baru saja memperhatikan persyaratan untuk input mungkin memiliki lebih dari dua kata. Saya akan membiarkannya apa adanya dengan catatan bahwa ini hanya berfungsi untuk dua kata.

EDIT: dihapus \n. Tambahkan 2 byte jika Anda anggap perlu.

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

Kompilasi dengan gcc name.c, GCC 6.3.1. Abaikan peringatan. Pemakaian:

$./a.out Albert Einstein
Einstein, Albert

Penyalahgunaan bahasa:

  • Tipe kembali implisit intdari maindan tidak kembali.
  • Deklarasi implisit dari printf. GCC tetap akan memasukkannya.
  • Jenis salah b. Tidak masalah dengan%s

Terima kasih kepada @ Khaled.K untuk tips tentang penggunaan main(a,b)int**b;daripada main(int a, int **b).

sigvaldm
sumber
Golf pertama yang bagus, selamat datang di situs web, juga main(a,**b){printf("%s, %s",b[2],b[1]);}berukuran 40 byte
Khaled.K
Terima kasih :) Saya benar-benar berpikir untuk menghapus semua jenis, tetapi untuk beberapa alasan tidak dapat dikompilasi.
sigvaldm
1
Ini berfungsimain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Khaled.K
4

sed, 19 +1 untuk -E = 20 byte

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

Harus menggunakan -r (GNU) atau -E (BSD, GNU baru-baru ini) untuk menghindari keharusan lolos dari tanda kurung pengelompokan.

Jika dituliskan pada command-line, harus dilampirkan dalam tanda kutip untuk menghindari diuraikan sebagai beberapa token oleh shell:

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

C, 68 byte

Semoga tidak salah menambahkan posting lain tapi ini solusi yang sedikit berbeda dari solusi C yang saya posting sebelumnya. Yang ini menerima sejumlah nama.

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

Kompilasi dengan gcc name.c(GCC 6.3.1) dan abaikan peringatan. Pemakaian:

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

Terima kasih kepada @ Khaled.K untuk tipsnya main(a,b)int**b;

Terima kasih atas tip untuk loop ke @Alkano.

sigvaldm
sumber
1
Anda bisa mendapatkan 2 byte, dengan menggunakan alih-alih sementara main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
Alkano
Ini kedengarannya gila, tetapi Anda bisa melakukan inimain(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
Khaled.K
Trik yang sangat bagus :) Saya tidak pernah berpikir untuk memanggil main secara rekursif. Tapi itu tidak berhasil. Keluarannya adalah "Kennedy, Fitzgerald, John,. / A.out," Solusi parsial adalah main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}. Ini 2 byte lebih pendek, dan itu memastikan Anda tidak mencetak nama program, tetapi masih menggunakan koma antara masing-masing nama.
sigvaldm
3

Mathematica, 45 byte

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

Menyimpan beberapa byte pada jawaban ngenisis dengan mengambil input sebagai daftar karakter dan bukan sebagai string. Fungsi murni yang menggunakan aturan penggantian pola.

Mathematica, 49 byte

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

Fungsi murni lain mengambil daftar karakter sebagai input dan mengembalikan daftar karakter. Yang ini menambahkan ","dan " "ke input dan kemudian memutar daftar karakter sampai ruang terakhir di akhir. (Dengan demikian output memiliki ruang tambahan, tidak seperti fungsi pertama di atas.)

Greg Martin
sumber
#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&adalah 4byte lebih pendek, tapi saya menemukan bahwa Excepttidak perlu untuk pola string menyelamatkan saya 12byte.
ngenisis
ah, apakah itu secara otomatis memilih yang terlama xdalam jawaban Anda?
Greg Martin
Yap, pencocokan pola string serakah tetapi pencocokan pola biasa malas.
ngenisis
<Bagus ombak bendera putih>
Greg Martin
3

C #, 76 72 byte

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

Disimpan 4 byte dengan bantuan @KevinCruijssen

Versi lama menggunakan substring untuk 76 byte:

s=>s.Substring(s.LastIndexOf(' ')+1)+", "+s.Substring(0,s.LastIndexOf(' '));
TheLethalCoder
sumber
1
Sayang sekali System.Text.RegularExpressions.Regexbegitu lama di C # .. s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");hanya satu byte lebih.
Kevin Cruijssen
1
@KevinCruijssen Benar tapi saya bisa menggunakan metode statis Regexuntuk menyimpan 4 byte
TheLethalCoder
3

Awk, 18 karakter

{$1=$NF", "$1}NF--

Contoh dijalankan:

bash-4.4$ awk '{$1=$NF", "$1}NF--' <<< 'John Fitzgerald Kennedy'
Kennedy, John Fitzgerald

Cobalah online!

manatwork
sumber
2

Jelly , 8 byte

Ḳ©Ṫ”,⁶®K

Cobalah online!

HyperNeutrino
sumber
Sialan, Ninja'd dan outgolfed.
ATaco
@ATaco gg :) dan itu adalah ninja yang cukup besar.
HyperNeutrino
1
(Saya bermain golf, shhh)
ATaco
2

05AB1E , 9 byte

#`',«.Áðý

Cobalah online!

Penjelasan

#           # split input on spaces
 `          # push each name separately to stack
  ',«       # concatenate a comma to the last name
     .Á     # rotate stack right
       ðý   # join stack by spaces
Emigna
sumber
Ya, saya mungkin harus bergabung dengan perintah luar angkasa: p
Adnan
@ Adnan: Akan menyenangkan melihat seberapa sering itu digunakan :)
Emigna
2

Pyth , 11 byte

jd.>c+z\,d1

Penjelasan:

jd.>c+z\,d1
     +z\,      Append the "," to the input
    c+z\,d     Split the string on " "
  .>c+z\,d1    Rotate the array one element right
jd.>c+z\,d1    Join the array on " "

Uji secara online!

Jim
sumber
2

PHP, 45 Bytes

<?=preg_filter("#(.*) (.+)#","$2, $1",$argn);

Cobalah online!

Jörg Hülsermann
sumber
1
Kenapa \pL+bukannya .+?
Kevin Cruijssen
@KevinCruijssen Anda benar, bagian pertama regex serakah sehingga tidak masalah untuk menggunakan .atau\pL
Jörg Hülsermann
2

MATLAB / Oktaf , 37 byte

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

Cobalah online!

Berdasarkan jawaban Retina @ngenisis, kami juga dapat memainkan permainan regex di Oktaf dan MATLAB, menghemat beberapa byte yang adil dari jawaban saya sebelumnya.


Jawaban lama:

Saya akan meninggalkan jawaban ini di sini juga mengingat itu adalah cara yang lebih unik untuk melakukannya dibandingkan dengan regex sederhana.

Oktaf , 49 47 byte

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

Tua coba online!

Fungsi anonim untuk menghasilkan output.

Pada dasarnya kode pertama kali menemukan ruang terakhir dalam string menggunakan b=find(a==32)(end). Kemudian Dibutuhkan bagian akhir dari string (setelah spasi) menggunakan a(b+1:end), di mana badalah output dari menemukan ruang terakhir. Ini juga membutuhkan awal string a(1:b-1), dan menggabungkan keduanya bersama-sama dengan ', 'di antaranya.

Saya sudah menyimpan beberapa byte vs yang khas find(a==32,1,'last'). Tidak yakin ada banyak yang harus diselamatkan.

Tom Carpenter
sumber
2

Jelly , 9 byte

ḲµṪ;⁾, ;K

Dijelaskan, ish:

ḲµṪ;⁾, ;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.

Cobalah online!

Coba semua uji kasus.

ATaco
sumber
2

Python 3, 52 byte

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

Sangat sederhana, bisa menggunakan bantuan golf. Cukup letakkan kata terakhir di depan dan gabungkan dengan ",".

Kasus cobaan:

>>> 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'
OldBunny2800
sumber
2

Java, 110 62 byte

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

Metode non-statis.

-48 byte terima kasih kepada Kevin Cruijssen

HyperNeutrino
sumber
String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}lebih pendek ( 91 byte ).
Kevin Cruijssen
Dan String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}bahkan lebih pendek ( 62 byte ).
Kevin Cruijssen
@KevinCruijssen Oh ya ampun. Terima kasih! Saya harus belajar menggunakan regex lebih baik: P
HyperNeutrino
2

PHP , 62 59 byte

-3 byte, terima kasih Jörg

$a=explode(' ',$argn);echo array_pop($a).', '.join(' ',$a);

Cobalah online!

Solusi lama, 63 Bytes

Tidak berfungsi jika orang tersebut memiliki 3 nama berulang.

<?=($a=strrchr($argv[1]," ")).", ".str_replace($a,'',$argv[1]);

Cobalah online

SAYA
sumber
Anda dapat menggunakan $argnsebagai gantinya$argv[1]
Jörg Hülsermann
2

Excel, 174 170 168 byte

Disimpan 2 byte berkat Wernisch

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

Ini tidak mewah atau pintar. Ini metode yang cukup mendasar. Rasanya seperti harus ada cara yang lebih pendek dengan rumus array tetapi saya tidak dapat menemukan yang berfungsi.

Toast insinyur
sumber
Solusi hanya berfungsi untuk kasus di mana ada tiga nama. Tidak menangani "Albert Einstein" misalnya.
Wernisch
@Wernisch Terima kasih! Itu seharusnya bekerja sekarang.
Engineer Toast
Trailing whitespace diizinkan menurut pertanyaan. Berpikir Anda dapat menyimpan 2 byte dengan meninggalkan -1fungsi LEFT.
Wernisch
1

JS (ES6), 52 44 byte

i=>(i=i.split` `,l=i.pop(),l+", "+i.join` `)
programmer5000
sumber
1

MATL , 10 byte

44hYb1YSZc

Cobalah online!

Penjelasan

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'
Luis Mendo
sumber
1

Gema, 23 karakter

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

Satu-satunya hal yang luar biasa di sini adalah bagaimana tantangan tersebut berhasil mengenai kelemahan pola Gema yang tidak serakah.

Contoh dijalankan:

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
manatwork
sumber