Ai có dấu phẩy cho tên đệm?


18

Thử thách của bạn là lấy tên (chuỗi) làm đầu vào, như

Albert Einstein

và đầu ra:

Einstein, Albert

Mã giả:

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

Nhiều trường hợp thử nghiệm:

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

Quy tắc

  • Đầu vào sẽ luôn khớp với regex ^([A-Z][a-z]+ )+([A-Z][a-z]+)$.
  • Bạn không cần phải xử lý các tên lạ , ngay cả khi đầu ra không đúng về mặt kỹ thuật, nó vẫn ổn ở đây.
  • Trailing khoảng trắng / dòng mới là OK.
  • Có câu hỏi nào không? Bình luận dưới đây!

Được dấu không gian cho phép?
Mực giá trị

Tôi nhắm như dupe vì giải pháp khá nhiều siply có thể thay thế levới ,và bạn có câu hỏi này
Downgoat

2
@Downgoat Thử thách đó chỉ định hai từ, trong khi các giải pháp cho vấn đề này phải hoạt động với nhiều từ tùy ý. Theo như tôi có thể nói, về các câu trả lời với các liên kết TIO, chỉ có giải pháp Nghiêm túc đưa ra câu trả lời chính xác cho câu hỏi này thay thế lebằng ,.
ngenisis

7
@Downgoat cái đó có -4. Ít nhất là đóng cái đó như một bản dupe của cái này.
Stephen

1
Không gian dấu là ok?
Tom Carpenter

Câu trả lời:


10

05AB1E , 7 byte

Mã số:

',ì#Áðý

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình:

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

1
Chuẩn bị! Tôi biết rằng phải có một cách để làm điều đó trong listform.
Emigna

9

JavaScript (ES6), 34 byte

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

Bản giới thiệu:

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

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


8

Võng mạc , 19 17 16 byte

Chỉnh sửa: Cảm ơn Riker vì đã lưu 3 byte

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

Hãy thử trực tuyến!


1
giữ lên, (.+)làm việc quá cho cả hai.
Rɪᴋᴇʀ

Tôi không hiểu tại sao bạn lại sử dụng \wở nơi đầu tiên
theonlygusti

1
@theonlygusti Tôi quen thuộc hơn với kết hợp mẫu trong Mathicala, sử dụng kết hợp lười biếng thay vì tham lam.
ngenisis

7

Thạch , 7 byte

;”,Ḳṙ-K

Hãy thử trực tuyến!

Tôi không biết rõ về Jelly, nhưng đọc các câu trả lời khác thì có vẻ như họ không sử dụng thuật toán tối ưu ... vì vậy đây là:

Giải trình

;”,Ḳṙ-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 / tổ hợp phím

v$F dA, <esc>p

Hãy thử trực tuyến!


Đẹp, nhưng tôi đã đấu tranh để làm cho nó hoạt động, <esc>không hiển thị trong mã của bạn. Để thông báo cho những người khác muốn thử: Điều này giả định rằng tên được viết trong trình chỉnh sửa và bạn hiện đang ở đầu tệp ở chế độ bình thường.
sigvaldm

7

V / vim, 9 8 byte

$bD0Pa, 

Hãy thử trực tuyến!

Đã lưu một Byte nhờ

Lưu ý có một ký tự không gian dấu. Để lại một không gian dấu, được phép theo các quy tắc.

Giải trình:

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

Đẹp quá Suy nghĩ tốt đặt chế độ chèn vào cuối để tránh cần thiết <esc>. Bạn có thể lưu một byte bằng cách làm $bDthay vì $diw. :)
DJMcMayhem

Cảm ơn. $bDmặc dù không xử lý tên một ký tự, tôi đã hỏi OP nếu điều đó được cho phép.
Kevin

Hình như là vậy, nên đang cập nhật.
Kevin


6

Toán học, 52 40 byte

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


5

C, 45 byte

EDIT: Bây giờ tôi mới nhận thấy yêu cầu cho đầu vào có thể có nhiều hơn hai từ. Tôi sẽ để nó như là với một lưu ý rằng điều này chỉ hoạt động cho hai từ.

EDIT: loại bỏ \n. Thêm 2 byte nếu bạn thấy cần thiết.

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

Biên dịch với gcc name.c, GCC 6.3.1. Bỏ qua cảnh báo. Sử dụng:

$./a.out Albert Einstein
Einstein, Albert

Lạm dụng ngôn ngữ:

  • Implicit kiểu trả về intcủa mainvà không có gì trả lại.
  • Khai báo ngầm của printf. GCC sẽ bao gồm nó anyway.
  • Sai loại b. Không quan trọng với%s

Cảm ơn @ Khaled.K về các mẹo sử dụng main(a,b)int**b;chứ không phải main(int a, int **b).


Golf đầu tiên đẹp, chào mừng bạn đến với trang web, cũng main(a,**b){printf("%s, %s",b[2],b[1]);}là 40 byte
Khaled.K

Cảm ơn :) Tôi thực sự đã nghĩ đến việc bỏ qua các loại hoàn toàn, nhưng vì một số lý do, nó sẽ không được biên dịch.
sigvaldm

1
Tác phẩm nàymain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Khaled.K


4

sed, 19 + 1 cho -E = 20 byte

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

Phải sử dụng -r (GNU) hoặc -E (BSD, các GNU gần đây) để tránh phải thoát khỏi dấu ngoặc đơn nhóm.

Nếu được viết trên dòng lệnh, phải được đặt trong dấu ngoặc kép để tránh bị phân tách thành nhiều mã thông báo bởi trình bao:

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

4

C, 68 byte

Hy vọng không sai khi thêm một bài đăng khác nhưng đây là một giải pháp hơi khác so với giải pháp C đã đăng trước đây của tôi. Điều này chấp nhận bất kỳ số lượng tên.

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

Biên dịch với gcc name.c(GCC 6.3.1) và bỏ qua các cảnh báo. Sử dụng:

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

Cảm ơn @ Khaled.K vì những lời khuyên về main(a,b)int**b;

Cảm ơn về mẹo trên vòng lặp for @Alkano.


1
bạn có thể đạt được 2 byte, bằng cách sử dụng thay vì trong một thời gian main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
Alkano

Điều này nghe có vẻ điên rồ, nhưng bạn có thể làm điều nàymain(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
Khaled.K

Thủ thuật rất hay :) Tôi chưa bao giờ nghĩ đến việc gọi chính đệ quy. Nhưng nó không hoạt động. Đầu ra của nó là "Kennedy, Fitzgerald, John ,. / A.out", một giải pháp một phần sẽ là main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}. Nó ngắn hơn 2 byte và đảm bảo bạn không in tên chương trình, nhưng nó vẫn sử dụng dấu phẩy giữa mỗi tên.
sigvaldm

3

Toán học, 45 byte

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

Đã lưu một vài byte qua câu trả lời của ngenisis bằng cách lấy đầu vào làm danh sách các ký tự thay vì dưới dạng chuỗi. Hàm thuần túy sử dụng quy tắc thay thế mẫu.

Toán học, 49 byte

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

Một hàm thuần túy khác lấy danh sách các ký tự làm đầu vào và trả về danh sách các ký tự. Cái này gắn thêm ","" "vào đầu vào và sau đó quay danh sách các nhân vật cho đến khi không gian cuối cùng là lúc kết thúc. (Do đó, đầu ra có một khoảng trắng ở cuối, không giống như hàm đầu tiên ở trên.)


#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&4byte ngắn hơn, nhưng tôi phát hiện ra rằng Exceptkhông cần thiết cho các mẫu chuỗi, tiết kiệm cho tôi 12byte.
ngenisis

ah, nó có tự động chọn xcâu trả lời dài nhất không?
Greg Martin

Đúng, khớp mẫu chuỗi là tham lam nhưng khớp mẫu thông thường là lười biếng.
ngenisis

<cờ trắng đẹp>
Greg Martin

3

C #, 76 72 byte

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

Đã lưu 4 byte với sự trợ giúp của @KevinCruijssen

Phiên bản cũ sử dụng chuỗi con cho 76 byte:

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

1
Quá tệ System.Text.RegularExpressions.Regexlà quá lâu trong C # .. s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");chỉ là một byte nữa.
Kevin Cruijssen

1
@KevinCruijssen Đúng nhưng tôi có thể sử dụng phương thức tĩnh trên Regexđể lưu 4 byte
TheLethalCoder



2

05AB1E , 9 byte

#`',«.Áðý

Hãy thử trực tuyến!

Giải trình

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

Vâng, tôi có lẽ nên tham gia bằng lệnh không gian: p
Adnan

@Adnan: Sẽ rất tuyệt khi thấy tần suất sử dụng :)
Emigna



2

MATLAB / Octave , 37 byte

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

Hãy thử trực tuyến!

Dựa trên câu trả lời Retina của @ngenisis, chúng tôi cũng có thể chơi trò chơi regex trong cả Octave và MATLAB, tiết kiệm một vài byte công bằng so với câu trả lời trước đây của tôi.


Câu trả lời cũ:

Tôi sẽ để lại câu trả lời này ở đây cũng như xem xét nó là một cách làm độc đáo hơn so với một regex đơn giản.

Octave , 49 47 byte

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

Cũ thử trực tuyến!

Một chức năng ẩn danh để tạo đầu ra.

Về cơ bản, mã đầu tiên tìm thấy không gian cuối cùng trong chuỗi bằng cách sử dụng b=find(a==32)(end). Sau đó, nó lấy phần cuối của chuỗi (sau khoảng trắng) bằng cách sử dụng a(b+1:end), nơi bđầu ra của việc tìm khoảng trắng cuối cùng. Nó cũng bắt đầu chuỗi với a(1:b-1)và nối cả hai cùng với một ', 'ở giữa.

Tôi đã lưu một vài byte so với thông thường find(a==32,1,'last'). Không hoàn toàn chắc chắn có nhiều hơn để tiết kiệm.


2

Thạch , 9 byte

ḲµṪ;⁾, ;K

Giải thích, 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.

Hãy thử trực tuyến!

Hãy thử trên tất cả các trường hợp thử nghiệm.


2

Python 3, 52 byte

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

Rất đơn giản, có thể sử dụng trợ giúp chơi golf. Chỉ cần đặt từ cuối cùng ở phía trước và nối chúng với ",".

Testcase:

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

Phương pháp không tĩnh.

-48 byte nhờ Kevin Cruijssen


String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}ngắn hơn ( 91 byte ).
Kevin Cruijssen

String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}thậm chí còn ngắn hơn ( 62 byte ).
Kevin Cruijssen

@KevinCruijssen Ôi trời ơi. Cảm ơn! Tôi nên học cách sử dụng regex tốt hơn: P
HyperNeutrino


2

Excel, 174 170 168 byte

Đã lưu 2 byte nhờ Wernisch

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

Điều này không lạ mắt hay thông minh. Đây là một phương pháp khá cơ bản. Cảm giác như có một cách ngắn hơn với các công thức mảng nhưng tôi không thể tìm thấy cách nào hiệu quả.


Giải pháp chỉ hoạt động cho các trường hợp có ba tên. Không xử lý "Albert Einstein" chẳng hạn.
Wernisch

@Wernisch Cảm ơn! Nó nên hoạt động ngay bây giờ.
Kỹ sư Toast

Trailing khoảng trắng được cho phép theo câu hỏi. Hãy nghĩ rằng bạn có thể lưu 2 byte bằng cách bỏ qua -1hàm LEFT.
Wernisch


1

MATL , 10 byte

44hYb1YSZc

Hãy thử trực tuyến!

Giải trình

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 ký tự

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

Điều đáng chú ý duy nhất ở đây là làm thế nào để thử thách đánh vào điểm yếu của các mẫu Gema không tham lam.

Chạy mẫu:

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.