Gleicher Name, lahm!

11

Schreiben Sie eine Funktion oder ein Programm, das bei Angabe einer Liste von Namen eine Liste ausgibt oder zurückgibt, in der Duplikate von Vornamen eine eindeutige verkürzte Version ihres Nachnamens haben.

Eingang:

Eine Liste von Namen, bei der ein Name durch einen bestimmten Namen und ein durch ein Leerzeichen getrennter Nachname definiert ist. Namen sind nicht leere Zeichenfolgen, die nur Groß- und Kleinbuchstaben enthalten. Die Liste kann ein Array von Zeichenfolgen oder die Namen sein, die durch ein konstantes Nicht-Alpha-Zeichen ohne Leerzeichen getrennt sind. Die Ausgabe muss jedoch dasselbe Format wie die Eingabe haben.

Ausgabe:

Eine Liste der eingegebenen Namen in derselben Reihenfolge und demselben Format wie die Eingabe, die durch diese Regeln geändert wurden:

  • Geben Sie für eindeutige Vornamen nur den Vornamen aus
  • Für Namen mit demselben Vornamen:
    • Fügen Sie neben dem Vornamen die kürzeste eindeutige Version ihres Nachnamens hinzu, die nicht von einem anderen Namen geteilt wird, gefolgt von einem Punkt. Zum Beispiel: John Clancy, John Smithwird John C.,John S.und James Brown, James BrattewirdJames Bro.,James Bra.
    • Wenn ein Nachname eine Teilmenge eines anderen ist, z. B. Julian King,Julian Kingsleyden vollständigen Nachnamen des kleineren ohne Punkt zurückgeben. Das Beispiel würde werdenJulian King,Julian King.
  • Grundsätzlich stellt ein Punkt den regulären Ausdruck dar .+, bei dem nur ein Name mit ihm übereinstimmen sollte.
  • Sie können davon ausgehen, dass niemand denselben Vor- und Nachnamen hat
  • Bei Namen wird zwischen Groß- und Kleinschreibung unterschieden

Testfälle:

  • 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

Dies ist , daher gewinnt die niedrigste Byteanzahl für jede Sprache.

Scherzen
quelle
Verwandte , verwandte (Danke @Laikoni). Sandbox Post
Jo King
1
Woher kommt das Angela C.im Testfall?
Caird Coinheringaahing
Soll ein JulieHoppla sein, danke. Behoben
Jo King

Antworten:

3

Gelee ,  34 33 32  30 Bytes

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

Ein monadischer Link, der eine Liste von Zeichenlisten (dh eine Liste von "Zeichenfolgen") enthält und die Abkürzungen im gleichen Format und in derselben relativen Reihenfolge zurückgibt.

Probieren Sie es online aus! (eine vollständige Programmtestsuite)

Wie?

;\ċÐ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
quelle
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]

Probieren Sie es online aus!

Generiert zuerst alle Spitznamen wie folgt:

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

Dann nimmt die erste * eine aus jeder Liste , die ist seltensten in sum(n,[]). Dies ist immer der erste eindeutige Spitzname.

Beachten Sie, dass ndie fehlerhaften Spitznamen 'John .'usw. enthalten sind, diese jedoch niemals ausgewählt werden.

(* CPython 2.7 mintut dies sowieso. Dieser Code ist möglicherweise nicht portabel !)

Lynn
quelle
2

Ruby 165 162 161 160 Bytes

Beinhaltet 1 nachfolgendes Leerzeichen, wenn nur der angegebene Name zurückgegeben wird, z. "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]}]}}

Probieren Sie es online aus!

163 Bytes, wenn Sie den nachgestellten Speicherplatz nicht möchten

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

Probieren Sie es online aus!

Asone Tuhid
quelle