PPCG 사용자 이름 아래로 골프


32

제가 채팅에서 언급내용 과 그에 따른 대화는이 도전에 대한 영감을주었습니다.

내가 이니셜로 언급 한 유일한 사람입니까? 우리는 모두 골프를 치는 일에 관한 것입니다. 우리는 MB와 D 노브를 가질 수 있고 ... O.

내가 "CH"로 알려진 경우 다른 모든 사람도 초기 기반 별명을 가져야한다고 생각합니다.

평판이 좋은 100 대 프로그래밍 퍼즐 및 코드 골프 사용자 목록은 다음과 같습니다.

Martin Büttner
Doorknob
Peter Taylor
Howard
marinus
Dennis
DigitalTrauma
David Carraher
primo
squeamish ossifrage
Keith Randall
Ilmari Karonen
Quincunx
Optimizer
grc
Calvin's Hobbies
ugoren
Mig
gnibbler
Sp3000
aditsu
histocrat
Ventero
xnor
mniip
Geobits
J B
Joe Z.
Gareth
Jan Dvorak
isaacg
edc65
Victor
steveverrill
feersum
ace
Danko Durbić
xfix
PhiNotPi
user23013
manatwork
es1024
Joey
daniero
boothby
nneonneo
Joey Adams
Timwi
FireFly
dansalmo
grovesNL
breadbox
Timtech
Flonk
algorithmshark
Johannes Kuhn
Yimin Rong
copy
belisarius
professorfish
Ypnypn
trichoplax
Darren Stone
Riot
ProgramFOX
TheDoctor
swish
minitech
Jason C
Tobia
Falko
PleaseStand
VisioN
leftaroundabout
alephalpha
FUZxxl
Peter Olson
Eelvex
marcog
MichaelT
w0lf
Ell
Kyle Kanos
qwr
flawr
James_pic
MtnViewMark
cjfaure
hammar
bitpwner
Heiko Oberdiek
proud haskeller
dan04
plannapus
Mr Lister
randomra
AShelly
ɐɔıʇǝɥʇuʎs
Alexandru
user unknown

( 이것이 내가 얻은 방법입니다 )

도전

문자열 목록을 가져 와서 최소한의 고유 한 초기 기반 닉네임의 다른 문자열 목록을 출력하는 프로그램이나 함수를 작성하여 목록의 시작에 가까운 사람들을 선호하십시오.

별명을 작성하기 위해 주어진 순서대로 목록의 각 문자열 S에이 메소드를 적용하십시오.

  1. S를 공백으로 구분 된 단어로 나누면 프로세스의 모든 공백이 제거됩니다.
  2. S에서 단어의 첫 문자 문자열의 비어 있지 않은 접두사를 가장 짧은 것부터 가장 긴 것까지 나열하십시오.
    예를 들어, Just Some NameJ, JS,JSN
  3. 이 목록에서 S의 닉네임으로 이미 선택된 닉네임과 동일하지 않은 첫 번째 항목을 선택하십시오. 닉네임을 선택한 경우 중지하고 그렇지 않으면 4 단계를 계속하십시오.
    예를 들어 Just Some Name첫 번째 문자열 인 J경우 별명이 보장됩니다.
  4. 접두사를 다시 나열하되 이번에는 첫 번째 단어의 두 번째 문자를 자연스럽게 포함시킵니다.
    예를 들어, Just Some NameJu, JuS,JuSN
  5. 고유 한 닉네임이 발견되면 중지하여이 목록에 대해 3 단계와 동일하게 수행하십시오.
  6. 첫 번째 단어의 나머지 문자에 대해이 과정을 반복하여 고유 한 닉네임을 찾을 때까지 두 번째 단어에 문자를 삽입 한 다음 세 번째 단어 등에 문자를 삽입합니다.
    예를 들어 여기에 나열된 첫 번째 고유 한 문자열이 별명이 될 것입니다 :
    Jus, JusS, JusSN
    Just, JustS, JustSN
    Just, JustSo, JustSoN(주 o이후에 추가되지 않았다 Just)
    Just, JustSom, JustSomN
    Just, JustSome, JustSomeN
    Just, JustSome, JustSomeNa
    Just, JustSome, JustSomeNam
    Just, JustSome,JustSomeName

결국 모든 입력 문자열은 고유 한 닉네임 (문자열과 잠재적으로 동일)으로 끝나야합니다. 이 방법을 사용하여 입력 문자열 중 어느 것도 동일한 별명에 맵핑되지 않을 것이라고 가정 할 수 있습니다.

내 실수를 해결하기 위해 업데이트되었습니다!

입력

Martin Buttner
Doorknob
Peter Taylor
Howard
marinus
Dennis
DigitalTrauma
David Carraher
Martin Bitter
Martin Butter
Martin Battle
Martini Beer
Mart Beer
Mars Bar
Mars Barn

별명은

M
D
P
H
m
De
Di
DC
MB
Ma
MaB
Mar
MarB
Mars
MarsB

세부

  • 입력은 파일 (한 줄에 하나의 이름) 또는 stdin / 명령 줄을 통해 한 번에 하나의 이름 또는 문자열 목록의 함수 인수 또는 이름 사이에 줄 바꿈이있는 단일 문자열의 함수 인수로 입력 할 수 있습니다.
  • 출력은 stdout (행당 하나의 별명)으로 인쇄되거나 함수에 의해 문자열 목록 또는 별명 사이에 줄 바꿈이있는 하나의 문자열로 리턴되어야합니다.
  • 프로그램은 줄 종결 자를 제외한 모든 문자가 포함 된 이름에 적합합니다 . 그러나 모든 이름에는 인쇄 가능한 ASCII 만 포함되어 있다고 가정 할 수 있습니다 . (PPCG 이름은 그렇지 않습니다.)
  • 일반 공백 문자 만 단어 구분 기호로 계산합니다. 선행 및 후행 공백은 무시할 수 있습니다.

채점

바이트 단위 의 최단 제출 이깁니다. Tiebreaker는 가장 빨리 게시 된 답변으로 이동합니다.


49
이것은 내가 한밤중에 깨어 난 느낌의 막연한 느낌으로 일어났던 이유를 설명합니다.
Martin Ender 2019

답변:


8

CJam, 58 53 바이트

이것은 골프를 많이 할 수 있습니다.

LqN/{:Q1<aQ,,:)QS/f{{1$<_,@-z1e>}%W<s}+{a1$&!}=a+}/N*

코드 확장 :

L                         "Put an empty array on stack. This is the final nickname array";
 qN/{  ...   }/           "Read the input and split it on new lines. Run the block for each";
     :Q1<a                "Store each name in Q and get its first char. Wrap it in an array";
          Q,,:)           "Get an array of 1 to length(name) integers";
               QS/        "Split the name on spaces";
f{{           }%   }      "for each of the integer in the array, run the code block";
                          "and then for each of the name part, run the inner code block";
   1$<                    "Copy the integer, take first that many characters from the";
                          "first part of the name";
      _,@-z1e>            "Get the actual length of the part and the number of characters";
                          "to be taken from the next name part, minimum being 1";
                W<        "Get rid of the last integer which equals 1";
                  s       "Concat all name parts in the array";
                    +     "Add the list of nick names as per spec with the first character";
{     }=                  "Get the first nick name that matches the criteria";
 a1$&                     "Wrap the nick name in an array and do set intersection with";
                          "the copy of existing nick names";
     !                    "Choose this nick name if the intersection is empty";
N*                        "After the { ... }/ for loop, the stack contains the final";
                          "nick names array. Print it separated with new lines";

여기에서 온라인으로 사용해보십시오


2
'Ju'또는 'Jus'가 'Just Some Name', 'Maertin Butter'에서 유효한 별명 인 경우 'Ma', 'MaB', 'Mar', 'MarB'입니다.
edc65

@ edc65가 말하는 것은 사실입니다. 미안합니다. 원하는 경우 변경하지 않도록 허용합니다. 내 실수 였어
Calvin 's Hobbies

9

자바 스크립트 (ES6) 159

예제가 아닌 사양을 따르십시오.

현재 중간 단어 (처음에는 첫 단어)가있는 후보 별명을 생성합니다. 전류 이전의 단어는 '있는 그대로'사용됩니다. 현재 이후의 단어는 첫 번째 문자가 없거나 첫 번째 문자 만 사용합니다. 현재 단어는 각 루프마다 1 문자를 더 제공합니다.

예 '그냥 몇 가지 이름'=> '그냥', '일부', '이름'
의 Cw는 Just, 위치 1, 시도 J, JS, JSN
의 Cw는 Just, 위치 2, 시도 Ju, JuS, JuSN
의 Cw는 Just, 위치 3, 시도 Jus, JusS, JusSN
의 Cw는 Just, 위치 4, 시도는 Just, JustS, JustSN
이제 Just소진 , SomeCw가되고 위치가 2로 다시 시작됨 (위치 1의 경우 이미 시도)

CW는 Some, 위치 2, 시도는 Just, JustSo, JustSoN
CW는 Some, 위치 3, 시도 Just, JustSom, JustSomN
CW는 Some, 위치 4, 시도 Just, JustSome, JustSomeN
지금 Some소진, Name위치 2로 다시 시작 CW가되고,

CW는 Name, 위치 2, 시도 Just, JustSome, JustSomeNa
CW는 Name, 위치 3, 시도 Just, JustSome, JustSomeNam
CW는 Name, 위치 4, 시도 Just, JustSome, JustSomeName
즉 모든 사람이야!

코드

(q는 현재 단어 위치, p는 슬라이싱 위치입니다)

F=l=>
  l.map(w=>{ 
    for(w=w.match(/[^ ]+/g),q=p=0;
        w.every((w,i)=>~o.indexOf(t+=i<q?w:i>q?w[0]:w.slice(0,p+1)),t='')
        &&(w[q][p++]||(p=1,w[++q]));
       );
    o.push(t)
  },o=[])&&o

Firefox / FireBug 콘솔에서 테스트

F(['Martin Buttner','Doorknob','Peter Taylor','Howard','marinus'
  ,'Dennis','DigitalTrauma','David Carraher'
  ,'Martin Bitter','Martin Butter','Martin Battle','Martini Beer','Mart Beer'])

[ "M", "D", "P", "H", "m", "De", "Di", "DC", "MB", "Ma", "MaB", "Mar", " MarB "]


2

PHP, 327 289 275 274 270

아직 골프 잠재력이 조금있을 수 있습니다.

while($n=fgets(STDIN)){$c=count($w=preg_split('/\s+/',trim($n)));$p=[];for($k=0;$k<$c;$p[$k]++){for($t='',$j=0;$j<$c;$j++)$t.=substr($w[$j],0,$p[$j]+1);for($j=1;$j<=strlen($t);$j++)if(!in_array($v=substr($t,0,$j),$u))break 2;$k+=$p[$k]==strlen($w[$k]);}echo$u[]=$v,'
';}
  • 프로그램은 stdin / stdout에서 작동하고 ASCII에서 작동하며 UTF에서 버그가 있음
  • 용법: php -d error_reporting=0 golfnicks.php < nicknames.txt
  • 또는 cat <<EOF | php -d error_reporting=0 golfnicks.php+ 이름 목록 +EOF
  • 웹 브라우저의 함수로 테스트하려면 : 붕괴를 가져, 표시된 주석 모든 줄 // FUNC에 표시된 하나와 코멘트 //PROG. 시험f(array_fill(0,21,'Just Some Name'));

고장

#error_reporting(0);function f($a){echo'<pre>'; // FUNC
#foreach($a as$n) // FUNC
while($n=fgets(STDIN)) // PROG
{
    $c=count($w=preg_split('/\s+/',trim($n)));     // split name to words, count them
    $p=[];                                         // initialize cursors
    for($k=0;$k<$c;$p[$k]++)
    {
        for($t='',$j=0;$j<$c;$j++)$t.=substr($w[$j],0,$p[$j]+1); // concatenate prefixes
        for($j=1;$j<=strlen($t);$j++)              // loop through possible nicks
            if(!in_array($v=substr($t,0,$j),$u))   // unused nick found
                break 2;                           // -> break cursor loop
        $k+=$p[$k]==strlen($w[$k]);                // if Cw exhausted -> next word
        // strlen()-1 would be correct; but this works too)
    }
    echo$u[]=$v,'
';
}
#echo '</pre>';} // FUNC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.