Mesmo nome, coxo!

11

Escreva uma função ou programa que, ao receber uma lista de nomes, produza ou retorne uma lista em que duplicatas de nomes próprios tenham uma versão abreviada exclusiva de seu sobrenome.

Entrada:

Uma lista de nomes, onde um nome é definido por um nome e um sobrenome separados por um espaço. Os nomes são cadeias não vazias que contêm apenas letras maiúsculas e minúsculas. A lista pode ser uma matriz de seqüências de caracteres ou os nomes separados por um caractere não-alfa e não-espaço constante, mas a saída deve estar no mesmo formato da entrada.

Resultado:

Uma lista dos nomes inseridos na mesma ordem e formato que a entrada que foi modificada por estas regras:

  • Para nomes exclusivos, digite apenas o nome
  • Para nomes que compartilham o mesmo nome:
    • Além do nome fornecido, adicione a versão mais curta e exclusiva do sobrenome, que não seja compartilhada por outro nome, seguida por um ponto. Por exemplo: John Clancy, John Smithtorna - se John C.,John S.e James Brown, James Brattetorna - seJames Bro.,James Bra.
    • Se um sobrenome for um subconjunto de outro, como, por exemplo Julian King,Julian Kingsley, retorne o sobrenome completo do menor sem um período. O exemplo se tornariaJulian King,Julian King.
  • Basicamente, um ponto representa a regex .+, onde apenas um nome deve corresponder a ele.
  • Você pode assumir que ninguém compartilhará o mesmo nome e o mesmo sobrenome
  • Os nomes diferenciam maiúsculas de minúsculas

Casos de teste:

  • 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

Isso é , então a contagem de bytes mais baixa para cada idioma vence.

Brincadeira
fonte
Relacionado , relacionado (Obrigado @Laikoni). Sandbox Post
Jo King
1
De onde Angela C.vem o caso de teste?
caird coinheringaahing
Era para ser um Julieoops, obrigado. Corrigido
Jo King

Respostas:

3

Geléia ,  34 33 32  30 bytes

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

Um link monádico que obtém uma lista de listas de caracteres (ou seja, uma lista de "strings") e retorna as abreviações no mesmo formato e ordem relativa.

Experimente online! (um conjunto completo de testes do programa)

Quão?

;\ċÐ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
fonte
3

Python 2 , 130 bytes

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]

Experimente online!

Primeiro gera todos os apelidos, da seguinte maneira:

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

Depois pega o primeiro * um de cada lista que é menos frequente no sum(n,[]). Este sempre será o primeiro apelido exclusivo.

Observe que ninclui os apelidos errados 'John .', etc., mas eles nunca serão escolhidos.

(* O CPython 2.7 o minfaz de qualquer maneira. Esse código pode não ser portátil !)

Lynn
fonte
2

Ruby 165 162 161 160 bytes

Inclui 1 espaço à direita se apenas o nome for retornado, por exemplo. "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]}]}}

Experimente online!

163 bytes se você não quiser o espaço à direita

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

Experimente online!

Asone Tuhid
fonte