Golf Down the PPCG Benutzernamen

32

Ein Kommentar, den ich im Chat gemacht habe, und das anschließende Gespräch haben mich dazu inspiriert, diese Herausforderung anzunehmen.

Bin ich der einzige, auf den hier mit Initialen hingewiesen wird? Es geht uns nur darum, Dinge herunter zu spielen. Wir können MB und D-nob haben und ... O.

Wenn ich als "CH" bekannt bin, denke ich, dass jeder andere auch einen initialen Spitznamen haben sollte.

Hier ist eine Liste der Top 100 Programmierpuzzles & Code Golf-Benutzer nach Ansehen, mit denen Sie spielen können:

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

( so habe ich es bekommen )

Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die eine Liste von Zeichenfolgen aufnimmt und eine weitere Liste von Zeichenfolgen mit ihren minimalen, eindeutigen, initialen Spitznamen ausgibt, wobei diejenigen bevorzugt werden, die näher am Anfang der Liste stehen.

Wenden Sie diese Methode auf jede Zeichenfolge S in der Liste in der angegebenen Reihenfolge an, um die Kurznamen zu erstellen:

  1. Teilen Sie S in Wörter auf, die durch Leerzeichen getrennt sind, und entfernen Sie dabei alle Leerzeichen.
  2. Listen Sie die nicht leeren Präfixe der Zeichenfolge der ersten Buchstaben der Wörter in S auf, von der kürzesten bis zur längsten.
    zB Just Some NameJ, JS,JSN
  3. Wählen Sie das erste Element in dieser Liste aus, das nicht mit einem bereits ausgewählten Spitznamen identisch ist, wie der Spitzname für S. Wenn Sie einen Spitznamen ausgewählt haben, fahren Sie ansonsten mit Schritt 4 fort.
    zB wenn Just Some Nameder erste String war, dann Jist garantiert der Spitzname.
  4. Listen Sie die Präfixe erneut auf, aber fügen Sie diesmal den zweiten Buchstaben des ersten Wortes an seiner natürlichen Stelle ein.
    zB Just Some NameJu, JuS,JuSN
  5. Gehen Sie für diese Liste wie in Schritt 3 vor und halten Sie an, wenn ein eindeutiger Kurzname gefunden wird.
  6. Wiederholen Sie diesen Vorgang mit den verbleibenden Buchstaben des ersten Wortes und fügen Sie schließlich Buchstaben in das zweite Wort, dann in das dritte usw. ein, bis ein eindeutiger Spitzname gefunden wird.
    zB Die erste eindeutige Zeichenfolge hier aufgeführt wird der Spitzname:
    Jus, JusS, JusSN
    Just, JustS, JustSN
    Just, JustSo, JustSoN(Anmerkung , die onicht nach wurde hinzugefügt Just)
    Just, JustSom, JustSomN
    Just, JustSome, JustSomeN
    Just, JustSome, JustSomeNa
    Just, JustSome, JustSomeNam
    Just, JustSome,JustSomeName

Am Ende sollten alle Eingabezeichenfolgen einen eindeutigen Kurznamen haben (möglicherweise identisch mit der Zeichenfolge). Sie können davon ausgehen, dass mit dieser Methode keine der Eingabezeichenfolgen demselben Kurznamen zugeordnet wird.

Beispiel

Aktualisiert, um meinen Fehler zu beheben!

Für die Eingabe

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

die Spitznamen wären

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

Einzelheiten

  • Die Eingabe kann aus einer Datei (ein Name pro Zeile) oder jeweils einem Namen über die Standard- / Befehlszeile oder als Funktionsargument einer Liste von Zeichenfolgen oder als Funktionsargument einer einzelnen Zeichenfolge mit Zeilenumbrüchen zwischen den Namen erfolgen.
  • Die Ausgabe sollte auf stdout (ein Kurzname pro Zeile) gedruckt oder von der Funktion als Liste von Zeichenfolgen oder als eine Zeichenfolge mit Zeilenumbrüchen zwischen Kurznamen zurückgegeben werden.
  • Im Idealfall funktionieren Programme für Namen, die keine Zeichen außer Zeilenabschlusszeichen enthalten . Sie können jedoch davon ausgehen, dass alle Namen nur druckbares ASCII enthalten . (Die PPCG-Namen nicht.)
  • Nur das reguläre Leerzeichen zählt als Worttrennzeichen. Führende und nachfolgende Leerzeichen können ignoriert werden.

Wertung

Die kürzeste Übermittlung in Bytes gewinnt. Tiebreaker geht zu der Antwort, die frühestens gepostet wurde.

Calvins Hobbys
quelle
49
Dies erklärt, warum ich mitten in der Nacht mit diesem vagen Gefühl der Verletzung aufgewacht bin.
Martin Ender

Antworten:

8

CJam, 58 53 Bytes

Dies kann viel Golf gespielt werden. Aber für den Anfang:

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

Code-Erweiterung :

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

Probieren Sie es hier online aus

Optimierer
quelle
2
Siehe meinen Kommentar zu OP: Wenn 'Ju' oder 'Jus' gültige Spitznamen für 'Just Some Name' sind, muss 'Maertin Butter' 'Ma' sein, dann 'MaB', 'Mar', 'MarB'.
Edc65
Was @ edc65 sagt, ist wahr. Das tut mir leid. Ich erlaube dir, Dinge nicht zu ändern, wenn du willst; es war mein Fehler.
Calvins Hobbys
9

JavaScript (ES6) 159

Befolgen Sie die Spezifikationen und nicht das Beispiel.

Ich generiere die Kandidaten-Spitznamen mit einem aktuellen Mittelwort (am Anfang das erste Wort). Die Wörter vor dem Strom werden "wie sie sind" verwendet. Die Wörter nach dem aktuellen tragen mit keinem oder nur dem ersten Zeichen bei. Das aktuelle Wort trägt mit 1 weiteren Zeichen für jede Schleife bei.

Beispiel 'Nur einige Namen' => 'Just', 'Einige', 'Name'
Cw Just, Position 1, versuchen Sie J, JS, JSN
Cw Just, Position 2, versuchen Sie Ju, JuS, JuSN
Cw Just, Position 3, versuchen Sie Jus, JusS, JusSN
Cw Just, Position 4, versuchen Sie Just, JustS, JustSN
Jetzt Justist erschöpft , Somewird Cw, Position 2 wieder gestartet (für Position 1, die alle bereits versucht)

Cw Some, Position 2, try Just, JustSo, JustSoN
Cw Some, Position 3, versuchen Sie Just, JustSom, JustSomN
Cw Some, Position 4, versuchen Sie Just, JustSome, JustSomeN
nun Someerschöpft ist, Namewird Cw, Position neu gestartet 2

Cw Name, Position 2, try Just, JustSome, JustSomeNa
Cw Name, Position 3, versuchen Sie Just, JustSome, JustSomeNam
Cw Name, Position 4, versuchen Sie Just, JustSome, JustSomeName
das ist alles , Leute!

Der Code

(q ist die aktuelle Wortposition, p ist die Schnittposition)

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

Test In der Firefox / FireBug-Konsole

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
quelle
2

PHP, 327 289 275 274 270

Möglicherweise gibt es noch ein kleines Golfpotential.

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,'
';}
  • Das Programm arbeitet mit stdin / stdout, arbeitet mit ASCII, fehlerhaft mit UTF
  • Verwendung: php -d error_reporting=0 golfnicks.php < nicknames.txt
  • oder cat <<EOF | php -d error_reporting=0 golfnicks.php+ Namensliste +EOF
  • So testen Sie die Funktion im Webbrowser: Rufen Sie die Aufschlüsselung ab, // FUNCkommentieren Sie alle mit gekennzeichneten Zeilen aus und kommentieren Sie die mit gekennzeichnete Zeile //PROG. Versuchenf(array_fill(0,21,'Just Some Name'));

Nervenzusammenbruch

#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
quelle