Nama yang sama, lumpuh!

11

Tulis fungsi atau program yang, ketika diberi daftar nama, mengeluarkan atau mengembalikan daftar di mana duplikat nama yang diberikan memiliki versi singkat yang unik dari nama mereka.

Memasukkan:

Daftar nama, di mana nama didefinisikan oleh nama yang diberikan dan nama belakang yang dipisahkan oleh spasi. Nama adalah string non-kosong yang hanya berisi huruf besar dan kecil. Daftar dapat berupa array string, atau nama-nama yang dipisahkan oleh karakter non-alpha, non-spasi konstan, tetapi output harus dalam format yang sama dengan input.

Keluaran:

Daftar nama yang dimasukkan dalam urutan dan format yang sama dengan input yang telah dimodifikasi oleh aturan ini:

  • Untuk nama yang diberikan unik, output hanya nama yang diberikan
  • Untuk nama yang memiliki nama yang sama:
    • Serta nama yang diberikan, tambahkan versi unik terpendek dari nama keluarga mereka yang tidak dibagikan dengan nama lain, diikuti dengan tanda titik. Misalnya: John Clancy, John Smithmenjadi John C.,John S.dan James Brown, James BrattemenjadiJames Bro.,James Bra.
    • Jika satu nama keluarga adalah subset dari yang lain, seperti Julian King,Julian Kingsley, kembalikan nama lengkap dari yang lebih kecil tanpa tanda titik. Teladan akan menjadiJulian King,Julian King.
  • Pada dasarnya suatu periode mewakili regex .+, di mana hanya satu nama yang cocok dengan itu.
  • Anda dapat berasumsi bahwa tidak ada yang akan berbagi nama yang diberikan dan nama keluarga yang sama
  • Nama bersifat case-sensitive

Kasus uji:

  • 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

Ini adalah , sehingga jumlah byte terendah untuk setiap bahasa menang.

Jo King
sumber
Terkait , terkait (Terima kasih @Laikoni). Sandbox Post
Jo King
1
Dari mana datangnya Angela C.dalam kasus uji?
caird coinheringaahing
Dimaksudkan untuk menjadi Julieoops, terima kasih. Diperbaiki
Jo King

Jawaban:

3

Jelly ,  34 33 32  30 byte

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

Tautan monadik yang mengambil daftar daftar karakter (yaitu daftar "string") dan mengembalikan singkatan dalam format dan urutan relatif yang sama.

Cobalah online! (paket uji program lengkap)

Bagaimana?

;\ċÐ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"]
Jonathan Allan
sumber
3

Python 2 , 130 byte

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]

Cobalah online!

Pertama menghasilkan semua nama panggilan, sebagai berikut:

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

Kemudian pilih yang pertama * dari setiap daftar yang paling jarang masuk sum(n,[]). Ini akan selalu menjadi nama panggilan unik pertama.

Catatan yang nmencakup nama panggilan yang salah 'John .'dll, tetapi mereka tidak akan pernah dipilih.

(* Bagaimanapun juga, CPython 2.7 minmelakukannya. Kode ini mungkin tidak portabel !)

Lynn
sumber
2

Ruby 165 162 161 160 160 byte

Termasuk 1 spasi tambahan jika hanya nama yang diberikan dikembalikan, mis. "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]}]}}

Cobalah online!

163 byte jika Anda tidak ingin ruang tambahan

->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]}]}}

Cobalah online!

Asone Tuhid
sumber