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!

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

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)}`)
)


8

Retina , 19 17 16 byte

Sunting: Terima kasih kepada Riker karena telah menyimpan 3 byte

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

Cobalah online!


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

7

Vim, 10 byte / penekanan tombol

v$F dA, <esc>p

Cobalah online!


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

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]


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


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/'

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.


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


#/.{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(' '));

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!



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

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!



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.


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.


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'


2

Java, 110 62 byte

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

Metode non-statis.

-48 byte terima kasih kepada Kevin Cruijssen


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


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.


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

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'

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.