Golf Down the PPCG


32

Комментарий , который я сделал в чате и последующий разговор вдохновил меня , чтобы сделать этот вызов.

Я единственный, кого здесь называют инициалы? Мы все о гольфе. У нас могут быть MB и D-nob и ... O.

Если я известен как «CH», то я думаю, что все остальные также должны иметь псевдоним, основанный на начальной букве.

Вот список из 100 лучших программистов и пользователей Code 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

Детали

  • Входные данные могут быть из файла (одно имя на строку) или по одному имени за раз через стандартный ввод / командную строку, либо в качестве аргумента функции списка строк, либо в виде аргумента функции из одной строки с символами новой строки между именами.
  • Вывод должен быть напечатан на стандартный вывод (один псевдоним на строку) или возвращен функцией в виде списка строк или в виде одной строки с символами новой строки между псевдонимами.
  • В идеале программы будут работать с именами, содержащими любые символы, кроме разделителей строк . Однако вы можете предположить, что все имена содержат только печатный ASCII . (Названия PPCG нет.)
  • Только обычный символ пробела считается разделителем слов. Начальные и конечные пробелы можно игнорировать.

счет

Победит самая короткая подача в байтах . Tiebreaker отправляется на ответ, отправленный раньше всего.


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
Смотрите мой комментарий к OP: если 'Ju' или 'Jus' являются действительными псевдонимами для 'Just Some Name', 'Maertin Butter' должно быть '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.