같은 이름, 절름발이!


11

이름 목록이 주어 졌을 때, 주어진 이름의 중복이 성의 고유 한 단축 버전을 갖는 목록을 출력하거나 반환하는 함수 나 프로그램을 작성하십시오.

입력:

이름 목록. 여기서 이름은 주어진 이름과 성으로 공백으로 구분됩니다. 이름은 대문자와 소문자 만 포함하는 비어 있지 않은 문자열입니다. 이 목록은 문자열 배열이거나 이름이 영숫자가 아닌 비 공백 문자로 구분 된 이름 일 수 있지만 출력은 입력과 형식이 같아야합니다.

산출:

다음 규칙에 의해 수정 된 입력과 동일한 순서 및 형식으로 입력 된 이름 목록 :

  • 고유 한 이름의 경우 주어진 이름 만 출력하십시오.
  • 동일한 이름을 공유하는 이름의 경우 :
    • 이름뿐만 아니라 다른 이름과 공유하지 않는 마침표 뒤에 가장 짧은 고유 한 성을 추가하십시오. 예를 들어 : John Clancy, John Smith하게 John C.,John S.James Brown, James Bratte된다James 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). 샌드 박스 게시물
Jo King

1
Angela C.테스트 케이스의 출처는 어디 입니까?
caird coinheringaahing

될 운명 Julie, 죄송합니다 감사합니다. 수정
Jo King

답변:


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

파이썬 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

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

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.