ใครมีเครื่องหมายจุลภาคสำหรับชื่อกลาง


18

ความท้าทายของคุณคือใช้ชื่อ (สตริง) เป็นอินพุตเช่น

Albert Einstein

และเอาท์พุท:

Einstein, Albert

pseudocode:

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

กฎระเบียบ

  • อินพุตจะตรงกับ regex ^([A-Z][a-z]+ )+([A-Z][a-z]+)$เสมอ
  • คุณไม่จำเป็นต้องจัดการชื่อแปลก ๆแม้ว่าผลลัพธ์จะไม่ถูกต้องทางเทคนิค แต่ก็ใช้ได้ที่นี่
  • ช่องว่างต่อท้าย / ขึ้นบรรทัดใหม่ตกลง
  • มีอะไรจะถามอีกไหม? แสดงความคิดเห็นด้านล่าง!

อนุญาตให้ใช้ช่องว่างต่อท้ายได้หรือไม่
Ink Value

ฉันปิดเหมือนคนโง่เพราะคำตอบสามารถแทนที่leด้วยsiply ,และคุณมีคำถามนี้
Downgoat

2
@Downgoat ความท้าทายนั้นระบุสองคำในขณะที่วิธีแก้ปัญหานี้จะต้องใช้กับหลาย ๆ คำโดยพลการ เท่าที่ผมสามารถบอกได้คำตอบด้วยการเชื่อมโยง TIO เพียงการแก้ปัญหาอย่างจริงจังจะช่วยให้คำตอบที่ถูกต้องสำหรับการทดแทนคำถามนี้ด้วยle ,
ngenisis

7
@ ลงนามว่ามี -4 อย่างน้อยก็ปิดอันนั้นเป็นดักฟังของสิ่งนี้
Stephen

1
ช่องว่างต่อท้ายตกลงหรือไม่
Tom Carpenter

คำตอบ:


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
ย่อหน้า! ฉันรู้ว่าต้องมีวิธีที่จะทำใน listform
Emigna


8

จอประสาทตา , 19 17 16 ไบต์

แก้ไข: ขอบคุณ Riker สำหรับการบันทึก 3 ไบต์

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

ลองออนไลน์!


1
เดี๋ยวก่อน(.+)ทำงานเกินไปสำหรับทั้งคู่
2560

ฉันไม่เข้าใจว่าทำไมคุณถึงใช้\wในครั้งแรก
theonlygusti

1
@theonlygusti ฉันคุ้นเคยกับการจับคู่รูปแบบใน Mathematica ซึ่งใช้การจับคู่แบบขี้เกียจมากกว่าโลภ
ngenisis

7

เยลลี่ขนาด 7 ไบต์

;”,Ḳṙ-K

ลองออนไลน์!

ฉันไม่รู้จัก Jelly มากนัก แต่การอ่านคำตอบอื่น ๆ ดูเหมือนว่าพวกเขาไม่ได้ใช้อัลกอริธึมที่เหมาะสมที่สุดดังนั้นนี่คือ:

คำอธิบาย

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

เป็นกลุ่ม 10 ไบต์ / การกดแป้น

v$F dA, <esc>p

ลองออนไลน์!


เป็นคนดี แต่ฉันพยายามทำให้มันใช้งาน<esc>ได้ไม่แสดงในรหัสของคุณ สำหรับการแจ้งเตือนไปยังผู้อื่นที่ต้องการลอง: นี่ถือว่าชื่อเขียนในตัวแก้ไขและคุณอยู่ที่จุดเริ่มต้นของไฟล์ในโหมดปกติ
sigvaldm

7

V / vim, 9 8 ไบต์

$bD0Pa, 

ลองออนไลน์!

บันทึกหนึ่งไบต์ด้วย

โปรดทราบว่ามีอักขระช่องว่างต่อท้าย ออกจากพื้นที่ต่อท้ายซึ่งได้รับอนุญาตตามกฎ

คำอธิบาย:

$       " 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 $diw:)
DJMcMayhem

ขอบคุณ $bDไม่ได้จัดการชื่อตัวละครเดียวแม้ว่าฉันจะถาม OPหากได้รับอนุญาต
Kevin

ดูเหมือนว่าจะเป็นดังนั้นการปรับปรุง
Kevin




5

C, 45 ไบต์

แก้ไข: ฉันเพิ่งสังเกตเห็นข้อกำหนดสำหรับการป้อนข้อมูลที่อาจมีมากกว่าสองคำ ฉันจะทิ้งมันตามที่เป็นอยู่พร้อมกับข้อความที่ใช้งานได้กับสองคำเท่านั้น

แก้ไข: ลบ\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

การใช้ภาษาที่ไม่เหมาะสม:

  • ชนิดส่งคืนโดยนัยintของmainและไม่มีอะไรส่งคืน
  • 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, 19 + 1 สำหรับ -E = 20 bytes

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

ต้องใช้ -r (GNU) หรือ -E (BSD, GNUs ล่าสุด) เพื่อหลีกเลี่ยงการหลีกเลี่ยงการจัดกลุ่มวงเล็บ

หากเขียนบนบรรทัดคำสั่งจะต้องอยู่ในเครื่องหมายคำพูดเพื่อหลีกเลี่ยงการวิเคราะห์คำโดยเชลล์:

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;

ขอบคุณสำหรับเคล็ดลับในการ for loop ถึง @Alkano


1
คุณสามารถรับ 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

ลูกเล่นที่ดีมาก ๆ :) ฉันไม่เคยคิดถึงการโทรหาสายหลักแบบวนซ้ำ แต่มันก็ใช้งานไม่ได้ มันเอาท์พุทคือ "เคนเนดี้, ฟิตซ์เจอรัลด์, จอห์น. / 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คำตอบที่ยาวที่สุดของคุณโดยอัตโนมัติหรือไม่?
Greg Martin

ใช่การจับคู่รูปแบบสตริงเป็นโลภ แต่การจับคู่รูปแบบปกติขี้เกียจ
ngenisis

nice <waves white flag>
Greg Martin

3

C #, 76 72 ไบต์

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

บันทึก 4 ไบต์ด้วยความช่วยเหลือของ @KevinCruijssen

เวอร์ชันเก่าที่ใช้สตริงย่อยเป็น 76 ไบต์:

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

1
เลวร้ายเกินไปSystem.Text.RegularExpressions.Regexด่าใน C # .. s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");เป็นเพียงหนึ่งไบต์เพิ่มเติม
Kevin Cruijssen

1
@KevinCruijssen True แต่ฉันสามารถใช้วิธีการแบบคงที่Regexเพื่อบันทึก 4 ไบต์
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
Adnan

@Adnan: จะดีเห็นวิธีการที่มักจะใช้ :)
Emigna



2

MATLAB / Octave , 37 ไบต์

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

ลองออนไลน์!

จากคำตอบจอประสาทตา @ngenisis เราสามารถเล่นเกม regex ได้ทั้ง Octave และ MATLAB ซึ่งช่วยประหยัดพื้นที่ได้ไม่กี่ไบต์เมื่อเทียบกับคำตอบก่อนหน้านี้


คำตอบเก่า:

ฉันจะปล่อยคำตอบนี้ไว้ที่นี่ด้วยการพิจารณาว่ามันเป็นวิธีที่พิเศษกว่าเมื่อเทียบกับ regex ธรรมดา

อ็อกเท49 49ไบต์

@(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)และเชื่อมทั้งสองเข้าด้วยกันด้วย', 'ระหว่าง

ผมเคยบันทึกไว้แล้วไม่กี่ไบต์ VS find(a==32,1,'last')ทั่วไป ไม่ค่อยแน่ใจว่ามีอะไรอีกมากมายให้บันทึก


2

เยลลี่ขนาด 9 ไบต์

ḲµṪ;⁾, ;K

อธิบายแล้ว 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.

ลองออนไลน์!

ลองในกรณีทดสอบทั้งหมด


2

Python 3, 52 ไบต์

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

ง่ายมากสามารถเล่นกอล์ฟได้ เพียงแค่ใส่คำสุดท้ายที่ด้านหน้าและรวมกับ ","

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 ไบต์

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 ไบต์ )
Kevin Cruijssen

และString d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}ยิ่งสั้น ( 62 ไบต์ )
Kevin Cruijssen

@KevinCruijssen โอ้ดีมาก ขอบคุณ! ฉันควรเรียนรู้การใช้ regex ให้ดีขึ้น: P
HyperNeutrino

2

PHP , 62 59 ไบต์

-3 ไบต์ขอบคุณJörg

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

ลองออนไลน์!

โซลูชันเก่า 63 ไบต์

ไม่ทำงานหากบุคคลนั้นมีชื่อซ้ำกัน 3 ชื่อ

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

ลองออนไลน์


คุณสามารถใช้$argnแทน$argv[1]
JörgHülsermann

2

Excel, 174 170 168 ไบต์

บันทึก 2 ไบต์ขอบคุณ Wernisch

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

นี่ไม่ใช่แฟนซีหรือฉลาด มันเป็นวิธีพื้นฐานที่ค่อนข้างยุติธรรม รู้สึกว่าควรจะมีวิธีที่สั้นกว่าด้วยสูตรอาร์เรย์ แต่ฉันไม่สามารถหาสูตรที่ใช้ได้


โซลูชันใช้งานได้กับกรณีที่มีสามชื่อเท่านั้น ไม่ได้จัดการ "Albert Einstein" เช่น
เวอร์นิช

@Wernisch ขอบคุณ! มันควรจะใช้งานได้แล้ว
Engineer Toast

ช่องว่างต่อท้ายได้รับอนุญาตตามคำถาม คิดว่าคุณสามารถบันทึกได้ 2 ไบต์ด้วยการปล่อย-1ฟังก์ชั่น LEFT ออกมา
เวอร์นิช



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.