同名,me子!


11

编写一个函数或程序,当给定名称列表时,输出或返回一个列表,其中给定名称的重复项具有其姓氏的唯一缩写形式。

输入:

名称列表,其中名称由给定名称定义,姓氏由空格分隔。名称是仅包含大写和小写字母的非空字符串。该列表可以是字符串数组,也可以是用恒定的非字母,非空格字符分隔的名称,但是输出的格式必须与输入的格式相同。

输出:

输入名称的列表,其顺序和格式与通过以下规则修改的输入相同:

  • 对于唯一的给定名称,仅输出给定名称
  • 对于具有相同给定名称的名称:
    • 除了其给定名称外,还要添加其姓氏的最短唯一版本,该版本不与其他名称共享,后跟一个句点。例如: John Clancy, John SmithJohn C.,John S.James Brown, James BratteJames Bro.,James Bra.
    • 如果一个姓氏是另一个姓氏的子集,例如Julian King,Julian Kingsley,则返回较小的姓氏的完整姓氏,不带句点。这个例子将成为Julian King,Julian King.
  • 基本上,句点代表正则表达式.+,其中只有一个名称应与之匹配。
  • 您可能会假设没有人会共享相同的给定名称和相同的姓氏
  • 名称区分大小写

测试用例:

  • 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

这是,因此每种语言的最低字节数为准。


相关相关(感谢@Laikoni)。Sandbox Post
Jo King

1
哪里的Angela C.测试用例来自?
Caird coinheringaahing

原本应该是Julie哎呀,谢谢。固定
乔金

Answers:


3

果冻 34 33 32  30 字节

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

单字链接,其中包含字符列表(即“字符串”列表)并以相同的格式和相对顺序返回缩写。

在线尝试!(完整的程序测试套件)

怎么样?

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

Ruby 165162161160字节

如果仅返回给定名称,则包括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]}]}}

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.