Строка - Имена Пользователей В Гольфе Ppcg

  • Автор темы Lyloalgerrult92
  • Обновлено
  • 22, Oct 2024
  • #1

А комментарий, который я оставил в чате и последовавший за этим разговор вдохновил меня на этот вызов.

Я единственный, кого здесь называют инициалами? Мы все стремимся к тому, чтобы все было в гольфе. У нас могут быть и МБ и Д-ноб и... О.

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

Вот список 100 лучших пользователей Programming Puzzles & Code Golf по репутации, с которыми можно играть:

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

(вот как я это понял)

Испытание

Напишите программу или функцию, которая принимает список строк и выводит другой список строк с их минимальными уникальными псевдонимами, основанными на инициалах, отдавая предпочтение тем, которые находятся ближе к началу списка.

Примените этот метод к каждой строке S в списке в порядке, указанном для создания псевдонимов:

  1. Разделите S на слова, разделенные пробелами, удалив при этом все пробелы.
  2. Перечислите непустые префиксы строки первых букв слов из S, от самого короткого до самого длинного.
    например 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 JustSomeName , JustSome , Just
  3. В качестве псевдонима для S выберите первый элемент в этом списке, который не идентичен уже выбранному псевдониму. Если псевдоним был выбран, остановитесь, в противном случае перейдите к шагу 4.
    например если JustSomeNam was the first string then JustSome гарантированно будет ником.
  4. Перечислите префиксы еще раз, но на этот раз включите вторую букву первого слова на свое естественное место.
    например JustJustSomeNa , JustSome , Just
  5. Сделайте то же самое, что и в шаге 3 для этого списка, останавливаясь, если найден уникальный псевдоним.
  6. Повторите этот процесс с оставшимися буквами первого слова, постепенно вставляя буквы во второе слово, затем в третье и так далее, пока не будет найден уникальный никнейм.
    например Первой уникальной строкой, указанной здесь, будет псевдоним:
    JustSomeN , JustSome , Just
    JustSomN , JustSom , Just
    Just , o , JustSoN (note that JustSo не был добавлен после Just )
    JustSN , JustS , Just
    JusSN , JusS , Jus
    JuSN , JuS , Ju
    Just Some Name , J , Just Some Name
    JSN , JS , J

В конце концов, все входные строки должны иметь уникальный псевдоним (потенциально идентичный строке). Вы можете предположить, что при использовании этого метода ни одна из входных строк не будет соответствовать одному и тому же псевдониму.

Пример

Обновлено, чтобы исправить мою ошибку!

Для ввода

Just Some Name

прозвища были бы

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

Подробности

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

Подсчет очков

Самая короткая подача в байтах побеждает. Тай-брейк переходит к ответу, опубликованному раньше всех.

#код-гольф #строка

Lyloalgerrult92


Рег
13 Feb, 2011

Тем
84

Постов
204

Баллов
634
  • 26, Oct 2024
  • #2

JavaScript (ES6) 159

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

Я генерирую ники-кандидаты, имеющие текущее среднее слово (в начале первое слово). Слова перед текущими используются «как есть». Слова после текущего вносятся без символа или только с первым символом. Текущее слово добавляет еще 1 символ для каждого цикла.

Пример «Просто какое-то имя» => «Просто», «Некоторые», «Имя»
Cw

 
 
 
 
 
 #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
 
, position f(array_fill(0,21,'Just Some Name')); , пытаться //PROG , // FUNC , EOF
Cw cat <<EOF | php -d error_reporting=0 golfnicks.php , position php -d error_reporting=0 golfnicks.php < nicknames.txt , пытаться 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,' ';} , 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"; , LqN/{:Q1<aQ,,:)QS/f{{1$<_,@-z1e>}%W<s}+{a1$&!}=a+}/N*
Cw F(['Martin Buttner','Doorknob','Peter Taylor','Howard','marinus' ,'Dennis','DigitalTrauma','David Carraher' ,'Martin Bitter','Martin Butter','Martin Battle','Martini Beer','Mart Beer']) , position 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 , пытаться JustSomeName , JustSome , Just
Cw 4 , position Name , пытаться JustSomeNam , JustSome , Just
Сейчас 3 is exhausted, Name становится Cw, позиция перезапускается на 2 (для позиции 1 все уже перепробовано)

Cw JustSomeNa , position JustSome , пытаться Just , 2 , Name
Cw Name , position Some , пытаться JustSomeN , JustSome , Just
Cw 4 , position Some , пытаться JustSomN , JustSom , Just
Сейчас 3 is exhausted, Some становится Cw, позиция возобновляется на 2

Cw JustSoN , position JustSo , пытаться Just , 2 , Some
Cw Some , position Just , пытаться JustSN , JustS , Just
Cw 4 , position Just , пытаться JusSN , JusS , Jus
Вот и все, ребята!

Код

(q — текущая позиция слова, p — позиция нарезки)

3

Тест В консоли Firefox/FireBug

Just

["М", "Д", "П", "Ч", "м", "Де", "Ди", "ДК", "МБ", "Ма", "МаБ", "Мар", " МарБ"]

 

Oksano4ka


Рег
19 Nov, 2008

Тем
66

Постов
205

Баллов
565
  • 26, Oct 2024
  • #4

PHP, 327 289 275 274 270

Возможно, еще есть небольшой потенциал для игры в гольф.

Ju
  • Программа работает со стандартным вводом/выводом, работает с ASCII, с ошибками в UTF.
  • использование: 2
  • или Just + list of names + JSN
  • Чтобы протестировать функцию в веб-браузере: получите разбивку, раскомментируйте все строки, отмеченные значком JS and comment the one marked with J . 1

Пытаться

Just
 

Мария Курникова


Рег
03 Dec, 2011

Тем
76

Постов
194

Баллов
574
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно