Гольф вниз Імена користувачів PPCG


32

Коментар , який я зробив в чаті і подальшу розмову надихнув мене , щоб зробити цей виклик.

Я єдиний, на який згадуються ініціали тут? Ми все про те, що йде про гольф. Ми можемо мати MB та D-nob та ... O.

Якщо мене знають як "СН", то я думаю, що всі інші повинні мати також початкове прізвисько.

Ось список топ-100 користувачів програм-головоломок та коду Golf за репутацією, з якими можна грати:

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 ні.)
  • Тільки звичайний символ пробілу вважається роздільником слів. Провідні та кінцеві пробіли можна ігнорувати.

Оцінка балів

Виграє найкоротше подання в байтах . Tiereaker переходить до відповіді, розміщеної якнайшвидше.


49
Це пояснює, чому я прокинувся посеред ночі з цим розпливчастим відчуттям порушеного почуття.
Мартін Ендер

Відповіді:


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' sholud буде 'Ma', то 'MaB', 'Mar', 'MarB'.
edc65

Що говорить @ edc65 - це правда. Вибач за це. Я дозволю вам не змінювати речі, якщо хочете; це була моя помилка.
Захоплення Кальвіна

9

JavaScript (ES6) 159

Слідуючи специфікаціям, а не прикладу.

Я генерую прізвиська кандидата, що мають поточне середнє слово (на початку, перше слово). Слова перед течією вживаються "як є". Слова після течії вносять символи без - або лише першого. Поточне слово сприяє ще 1 символу для кожного циклу.

Приклад 'Просто деякі Name' => 'Просто', 'Деякі', 'Name'
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вичерпано , Someстає Cw, позиція перезавантажується до 2 (для позиції 1, всі вже пробували)

Cw Some, положення 2, спроба Just, JustSo, JustSoN
Cw Some, положення 3, спробуйте Just,JustSom , JustSomN
Cw Some, положення 4, спробуйте Just, JustSome, JustSomeN
зараз Someвичерпано, Nameстає Cw, положення перезапустити 2

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.