Aynı İsim, Lame!


11

Bir ad listesi verildiğinde, verilen adların kopyalarının soyadının benzersiz bir kısaltılmış sürümüne sahip olduğu bir liste çıktısı veren veya döndüren bir işlev veya program yazın.

Giriş:

Bir adın, belirli bir adla ve soyadıyla boşlukla ayrılmış olarak tanımlandığı adların listesi. Adlar, yalnızca büyük ve küçük harf içeren boş olmayan dizelerdir. Liste bir dizeler dizisi olabilir veya sabit bir alfa olmayan, boşluk olmayan karakterle ayrılmış adlar olabilir, ancak çıktı girdiyle aynı biçimde olmalıdır.

Çıktı:

Girilen adların, bu kurallar tarafından değiştirilen girdiyle aynı sırada ve biçimde bir listesi:

  • Benzersiz verilen adlar için yalnızca belirtilen adı girin
  • Aynı adı taşıyan adlar için:
    • Adlarının yanı sıra, soyadlarının başka bir adla paylaşılmayan en kısa benzersiz sürümünü ve ardından bir nokta ekleyin. Örneğin: John Clancy, John Smitholur John C.,John S.ve James Brown, James BratteolurJames Bro.,James Bra.
    • Bir soyadı, örneğin diğerinin alt kümesiyse Julian King,Julian Kingsley, küçük adın tam soyadını bir nokta olmadan döndürün. Örnek olurJulian King,Julian King.
  • Temel olarak nokta .+, yalnızca bir adın eşleşmesi gereken normal ifadeyi temsil eder .
  • Hiç kimsenin hem aynı adı hem de aynı soyadını paylaşmayacağını varsayabilirsiniz.
  • İsimler büyük / küçük harfe duyarlıdır

Test Durumları:

  • 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

Bu , bu nedenle her dil için en düşük bayt sayısı kazanır.


İlgili , ilgili (Teşekkürler @Laikoni). Sandbox Post
Jo King

1
Angela C.Test davasında nereden geliyor?
Caird coinheringaahing

Üzgünüz Julie, teşekkürler. Düzeltildi
Jo King

Yanıtlar:


3

Jöle ,  34 33 32  30 bayt

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

Karakterlerin listesini (yani "dizelerin listesi") alan ve kısaltmaları aynı biçimde ve göreli sırayla döndüren monadik bir bağlantı.

Çevrimiçi deneyin! (tam bir program test paketi)

Nasıl?

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

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]

Çevrimiçi deneyin!

İlk önce tüm takma adları aşağıdaki gibi üretir:

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

Ardından, her listeden en az sıklıkta bulunan ilkini seçer sum(n,[]). Bu her zaman ilk benzersiz takma ad olacaktır.

Not nhatalı takma içerir 'John .'vb ama alınmayı asla.

(* CPython 2.7'ler minyine de yapar. Bu kod taşınabilir olmayabilir !)


2

Yakut 1651621616160 bayt

Yalnızca verilen ad döndürülürse 1 arka boşluk içerir, örn. "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]}]}}

Çevrimiçi deneyin!

Sondaki alanı istemiyorsanız 163 bayt

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.