Même nom, Lame!

11

Écrivez une fonction ou un programme qui, lorsqu'il reçoit une liste de noms, génère ou renvoie une liste où les doublons de prénoms ont une version abrégée unique de leur nom de famille.

Contribution:

Une liste de noms, où un nom est défini par un nom donné et un nom de famille séparés par un espace. Les noms sont des chaînes non vides contenant uniquement des lettres majuscules et minuscules. La liste peut être un tableau de chaînes ou les noms séparés par un caractère constant non alpha, non espace, mais la sortie doit être au même format que l'entrée.

Production:

Une liste des noms saisis dans le même ordre et format que l'entrée qui ont été modifiés par ces règles:

  • Pour les prénoms uniques, affichez uniquement le prénom
  • Pour les noms qui partagent le même prénom:
    • En plus de leur prénom, ajoutez la version unique la plus courte de leur nom de famille qui n'est pas partagée par un autre nom, suivie d'un point. Par exemple: John Clancy, John Smithdevient John C.,John S.et James Brown, James BrattedevientJames Bro.,James Bra.
    • Si un nom de famille est un sous-ensemble d'un autre, par exemple Julian King,Julian Kingsley, renvoyez le nom de famille complet du plus petit sans point. L'exemple deviendraitJulian King,Julian King.
  • Fondamentalement, un point représente l'expression régulière .+, où un seul nom doit correspondre.
  • Vous pouvez supposer que personne ne partagera le même prénom et le même nom de famille
  • Les noms sont sensibles à la casse

Cas de test:

  • 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

Il s'agit de , donc le nombre d'octets le plus bas pour chaque langue l'emporte.

Jo King
la source
Lié , lié (Merci @Laikoni). Sandbox Post
Jo King
1
D'où Angela C.vient le dans le cas de test?
caird coinheringaahing
Conçu pour être un Julieoups, merci. Corrigé
Jo King

Réponses:

3

Gelée ,  34 33 32  30 octets

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

Un lien monadique prenant une liste de listes de caractères (ie une liste de "chaînes") et renvoyant les abréviations dans le même format et le même ordre.

Essayez-le en ligne! (une suite complète de tests de programme)

Comment?

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

Python 2 , 130 octets

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]

Essayez-le en ligne!

Génère d'abord tous les surnoms, comme suit:

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

Choisit ensuite le premier * de chaque liste qui est le moins fréquent dans sum(n,[]). Ce sera toujours le premier surnom unique.

Notez que cela ninclut les pseudonymes erronés 'John .', etc., mais ils ne seront jamais sélectionnés.

(* CPython 2.7 le minfait de toute façon. Ce code n'est peut-être pas portable !)

Lynn
la source
2

Rubis 165162166160 octets

Comprend 1 espace de fin si seul le nom donné est retourné, par exemple. "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]}]}}

Essayez-le en ligne!

163 octets si vous ne voulez pas l'espace de fin

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

Essayez-le en ligne!

Asone Tuhid
la source