Golf sur les noms d'utilisateur PPCG

32

Un commentaire que j'ai fait dans le chat et la conversation qui a suivi m'ont inspiré à relever ce défi.

Suis-je le seul mentionné par des initiales ici? Nous voulons tous jouer au golf. Nous pouvons avoir MB et D-nob et ... O.

Si je suis connu sous le nom de "CH", je pense que tout le monde devrait également avoir un surnom initial.

Voici une liste des 100 meilleurs utilisateurs de puzzles de programmation et de golf de code par réputation pour jouer avec:

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

( c'est comme ça que je l'ai eu )

Défi

Écrivez un programme ou une fonction qui prend une liste de chaînes et génère une autre liste de chaînes de leurs surnoms minimaux, uniques et basés sur les initiales, en donnant la préférence à ceux qui sont plus proches du début de la liste.

Appliquez cette méthode à chaque chaîne S de la liste dans l'ordre donné pour créer les surnoms:

  1. Divisez S en mots séparés par des espaces, supprimant tous les espaces du processus.
  2. Liste les préfixes non vides de la chaîne des premières lettres des mots en S, du plus court au plus long.
    par exemple , Just Some NameJ, JS,JSN
  3. Choisissez le premier élément de cette liste qui n'est pas identique à un surnom déjà choisi comme surnom pour S. Arrêtez si un surnom a été choisi, passez à l'étape 4 sinon.
    Par exemple, si Just Some Nameétait la première chaîne, il Jest garanti que c'est le surnom.
  4. Répertoriez à nouveau les préfixes, mais cette fois, incluez la deuxième lettre du premier mot dans son emplacement naturel.
    par exemple , Just Some NameJu, JuS,JuSN
  5. Faites la même chose qu'à l'étape 3 pour cette liste, en s'arrêtant si un surnom unique est trouvé.
  6. Répétez ce processus avec les lettres restantes du premier mot, en insérant éventuellement des lettres dans le deuxième mot, puis le troisième, et ainsi de suite, jusqu'à ce qu'un surnom unique soit trouvé.
    par exemple , la première chaîne unique énumérés ici sera le surnom:
    Jus, JusS, JusSN
    Just, JustS, JustSN
    Just, JustSo, JustSoN(notez que on'a pas été ajouté après Just)
    Just, JustSom, JustSomN
    Just, JustSome, JustSomeN
    Just, JustSome, JustSomeNa
    Just, JustSome, JustSomeNam
    Just, JustSome,JustSomeName

En fin de compte, toutes les chaînes d'entrée devraient se retrouver avec un surnom unique (potentiellement identique à la chaîne). Vous pouvez supposer qu'aucune des chaînes d'entrée ne correspondra au même surnom en utilisant cette méthode.

Exemple

Mis à jour pour corriger mon erreur!

Pour l'entrée

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

les surnoms seraient

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

Détails

  • L'entrée peut être à partir d'un fichier (un nom par ligne), ou un nom à la fois via stdin / ligne de commande, ou comme argument de fonction d'une liste de chaînes, ou comme argument de fonction d'une chaîne unique avec des retours à la ligne entre les noms.
  • La sortie doit être imprimée sur stdout (un surnom par ligne) ou renvoyée par la fonction sous la forme d'une liste de chaînes, ou sous la forme d'une chaîne avec des retours à la ligne entre les surnoms.
  • Idéalement, les programmes fonctionneront pour les noms qui contiennent tous les caractères sauf les terminateurs de ligne . Cependant, vous pouvez supposer que tous les noms contiennent uniquement de l' ASCII imprimable . (Les noms PPCG ne le font pas.)
  • Seul le caractère espace régulier compte comme séparateur de mots. Les espaces de début et de fin peuvent être ignorés.

Notation

La soumission la plus courte en octets l' emporte. Tiebreaker passe à la réponse publiée le plus tôt.

Les passe-temps de Calvin
la source
49
Cela explique pourquoi je me suis réveillé au milieu de la nuit avec cette vague sensation de se sentir violée.
Martin Ender

Réponses:

8

CJam, 58 53 octets

Cela peut être beaucoup joué au golf. Mais pour commencer:

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

Expansion du code :

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";

Essayez-le en ligne ici

Optimiseur
la source
2
Voir mon commentaire à OP: si «Ju» ou «Jus» sont des surnoms valides pour «Just Some Name», «Maertin Butter» devrait être «Ma», puis «MaB», «Mar», «MarB».
edc65
Ce que @ edc65 dit est vrai. Désolé pour ça. Je vous permettrai de ne pas changer les choses si vous le souhaitez; c'etait mon erreur.
Calvin's Hobbies
9

JavaScript (ES6) 159

En suivant les spécifications et non l'exemple.

Je génère les surnoms candidats ayant un mot du milieu courant (au début, le premier mot). Les mots précédant le courant sont utilisés tels quels. Les mots après le courant ne contiennent ni - ni juste le premier - caractère. Le mot actuel contribue avec 1 caractère de plus pour chaque boucle.

Exemple 'Just Some Name' => 'Just', 'Some', 'Nom'
Cw Just, la position 1, essayer J, JS, JSN
Cw Just, la position 2, essayer Ju, JuS, JuSN
Cw Just, la position 3, essayer Jus, JusS, JusSN
Cw Just, la position 4, essayer Just, JustS, JustSN
maintenant Justest épuisé , Somedevient Cw, position redémarrée à 2 (pour la position 1, tous déjà essayés)

Cw Some, la position 2, essayer Just, JustSo, JustSoN
cw Some, la position 3, essayer Just, JustSom, JustSomN
cw Some, la position 4, essayer Just, JustSome, JustSomeN
maintenant Someest épuisé, Namedevient cw, la position à 2 redémarrée

Cw Name, la position 2, essayer Just, JustSome, JustSomeNa
cw Name, la position 3, essayer Just, JustSome, JustSomeNam
cw Name, la position 4, essayer Just, JustSome, JustSomeName
C'est tout!

Le code

(q est la position actuelle du mot, p est la position de découpage)

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

Tester dans la console 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 "]

edc65
la source
2

PHP, 327 289 275 274 270

Il y a peut-être encore un peu de potentiel golfique.

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,'
';}
  • Le programme fonctionne sur stdin / stdout, fonctionne sur ASCII, buggy sur UTF
  • usage: php -d error_reporting=0 golfnicks.php < nicknames.txt
  • ou cat <<EOF | php -d error_reporting=0 golfnicks.php+ liste de noms +EOF
  • Pour tester en tant que fonction dans le navigateur Web: récupérez la ventilation, décommentez toutes les lignes marquées avec // FUNCet commentez celle marquée avec //PROG. Essayerf(array_fill(0,21,'Just Some Name'));

panne

#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
Titus
la source