ชื่อเดียวกันง่อย!


11

เขียนฟังก์ชั่นหรือโปรแกรมที่เมื่อได้รับรายชื่อส่งออกหรือส่งกลับรายการที่ซ้ำกันของชื่อที่กำหนดมีรุ่นย่อที่ไม่ซ้ำกันของนามสกุลของพวกเขา

การป้อนข้อมูล:

รายการชื่อที่ชื่อถูกกำหนดโดยชื่อที่กำหนดและนามสกุลคั่นด้วยช่องว่าง ชื่อเป็นสตริงที่ไม่ว่างที่มีตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กเท่านั้น รายการสามารถเป็นอาร์เรย์ของสตริงหรือชื่อที่คั่นด้วยอักขระที่ไม่ใช่ alpha, non-space คงที่ แต่เอาต์พุตต้องอยู่ในรูปแบบเดียวกับอินพุต

เอาท์พุท:

รายการของชื่ออินพุตในลำดับและรูปแบบเดียวกันกับอินพุตที่แก้ไขโดยกฎเหล่านี้:

  • สำหรับชื่อที่กำหนดไม่ซ้ำกันให้ส่งออกเฉพาะชื่อที่กำหนด
  • สำหรับชื่อที่ใช้ชื่อเดียวกัน:
    • เช่นเดียวกับชื่อที่ให้เพิ่มนามสกุลที่เป็นเอกลักษณ์สั้นที่สุดที่ไม่ได้ใช้ร่วมกับชื่ออื่นแล้วตามด้วยจุด ตัวอย่างเช่น: John Clancy, John Smithกลายเป็นJohn C.,John S.และJames Brown, James Bratteกลายเป็นJames Bro.,James Bra.
    • หากนามสกุลหนึ่งเป็นชุดย่อยของอีกเช่นJulian King,Julian Kingsleyส่งคืนนามสกุลเต็มของขนาดเล็กโดยไม่มีจุด ตัวอย่างจะกลายเป็นJulian King,Julian King.
  • โดยทั่วไปจุดจะแสดงถึง regex .+โดยที่มีเพียงชื่อเดียวเท่านั้นที่ควรจับคู่
  • คุณอาจคิดว่าจะไม่มีใครแชร์ทั้งชื่อและนามสกุลเดียวกัน
  • ชื่อเป็นกรณี ๆ ไป

กรณีทดสอบ:

  • John Clancy,Julie Walker,John Walker,Julie Clancy -> John C.,Julie W.,John W.,Julie C.
  • Julian King,Jack Johnson,Julian Kingsley > Julian King,Jack,Julian King.
  • Jack Brown,Jack Black,Jack Blue > Jack Br.,Jack Bla.,Jack Blu.
  • John Storm,Jon Snow,Johnny Storm > John,Jon,Johnny
  • Jill DeSoma,Jill Desmond > Jill DeS.,Jill Des.
  • XxXnO sCOppeXxX,XxXNO MERCYXxX > XxXnO,XxXNO

นี่คือดังนั้นจำนวนไบต์ต่ำสุดสำหรับแต่ละภาษาจะชนะ



1
กรณีทดสอบAngela C.มาจากไหน?
caird coinheringaahing

แปลว่าJulieโอ๊ะโอขอบคุณ แก้ไขแล้ว
Jo King

คำตอบ:


3

เยลลี่ ,  34 33 32  30 ไบต์

;\ċÐf⁶t€⁶;€JṖḊ$$¦”.µ€ċ@ÐṂ€Ẏ$Ḣ€

ลิงก์ monadic ที่ใช้รายการรายการของอักขระ (เช่นรายการของ "สตริง") และส่งคืนตัวย่อในรูปแบบเดียวกันและลำดับที่สัมพันธ์กัน

ลองออนไลน์! (ชุดทดสอบโปรแกรมเต็มรูปแบบ)

อย่างไร?

;\ċÐf⁶t€⁶;€JṖḊ$$¦”.µ€ċ@ÐṂ€Ẏ$Ḣ€ - Link: list of lists    e.g. ["Sam Ng","Sam Li","Sue Ng"]
                   µ€          - monadically for €ach:  e.g. "Sue Ng"
 \                             -   cumulative reduce with:
;                              -     concatenation           ["S","Su","Sue","Sue ","Sue N","Sue Ng"]
     ⁶                         -   literal space character   ' '
   Ðf                          -   filter keep if:
  ċ                            -     count (spaces)          ["Sue ","Sue N","Sue Ng"]
        ⁶                      -   literal space character   ' '
      t€                       -   trim from €ach            ["Sue","Sue N","Sue Ng"]
                 ”.            -   literal period character  '.'
                ¦              -   sparse application...
         ;€                    -   ...of: concatenate €ach (with a period)
                               -   ...only for these indexes:
               $               -     last two links as a monad:
           J                   -       range of length       [1,2,3]
              $                -       last two links as a monad:
            Ṗ                  -         pop                 [1,2]
             Ḋ                 -         dequeue             [2]  (i.e. 2,3,...,length-1)
                               -   ...i.e.:                  ["Sue","Sue N.","Sue Ng"]
                               -                   yielding: [["Sam","Sam N.","Sam Ng"],["Sam","Sam L.","Sam Li"],["Sue","Sue N.","Sue Ng"]]
                           $   - last two links as a monad:
                          Ẏ    -   tighten                   ["Sam","Sam N.","Sam Ng","Sam","Sam L.","Sam Li","Sue","Sue N.","Sue Ng"]
                       ÐṂ€     -   filter keep minimals for €ach: 
                     ċ@        -     count (sw@ping args)    [["Sam N.","Sam Ng"],["Sam L.","Sam Li"],["Sue","Sue N.","Sue Ng"]]
                            Ḣ€ - head €ach                   ["Sam N.","Sam L.","Sue"]

3

Python 2 , 130 ไบต์

def f(a):n=[[x[:i]+'.'*(' 'in x[:i]<x)for i in range(x.find(' '),len(x)+1)]for x in a];print[min(x,key=sum(n,[]).count)for x in n]

ลองออนไลน์!

สร้างชื่อเล่นทั้งหมดก่อนดังนี้:

n == [
    ['John', 'John .', 'John C.', 'John Cl.', 'John Cla.', 'John Clan.', 'John Clanc.', 'John Clancy'],
    ['Julie', 'Julie .', 'Julie W.', 'Julie Wa.', 'Julie Wal.', 'Julie Walk.', 'Julie Walke.', 'Julie Walker'],
    ['John', 'John .', 'John W.', 'John Wa.', 'John Wal.', 'John Walk.', 'John Walke.', 'John Walker'],
    ['Julie', 'Julie .', 'Julie C.', 'Julie Cl.', 'Julie Cla.', 'Julie Clan.', 'Julie Clanc.', 'Julie Clancy'],
    ['Jill', 'Jill .', 'Jill D.', 'Jill De.', 'Jill Des.', 'Jill Desm.', 'Jill Desmo.', 'Jill Desmon.', 'Jill Desmond']
]

จากนั้นก็หยิบหนึ่ง * ครั้งแรกจากรายการที่แต่ละบ่อยอย่างน้อยsum(n,[])ใน นี่จะเป็นชื่อเล่นแรกเสมอ

โปรดทราบว่าnรวมถึงชื่อเล่นที่ผิดพลาด'John .'อื่น ๆ แต่จะไม่ถูกเลือก

(* CPython 2.7 minทำเช่นนั้นรหัสนี้อาจไม่สามารถพกพาได้ !)


2

ทับทิม 165 162 161 161 160 ไบต์

รวม 1 ช่องว่างต่อท้ายหากส่งคืนชื่อที่กำหนดเท่านั้นเช่น "John "

->a,n=0,s=0{a.group_by{|i|i[n]}.values.flat_map{|i|j=i[0];k=j.index' ';i.size<2?j.size>n ?j[0,[n+1,k].max-(s>1?0:1)]+(n>k ??.:''):j:f[i,n+=1,i.count{|l|l[n]}]}}

ลองออนไลน์!

163 ไบต์ถ้าคุณไม่ต้องการพื้นที่ต่อท้าย

->a,n=0,s=0{a.group_by{|i|i[n]}.values.flat_map{|i|j=i[0];k=j.index' ';i.size<2?j.size>n ?j[0..[n,k-1].max-(s>1?0:1)]+(n>k ??.: ''):j:f[i,n+1,i.count{|l|l[n+1]}]}}

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.