Golf giù i nomi utente PPCG


32

Un commento che ho fatto in chat e la conseguente conversazione mi hanno ispirato a fare questa sfida.

Sono l'unico a cui fanno riferimento le iniziali qui? Siamo tutti appassionati di golf. Possiamo avere MB, D-nob e ... O.

Se sono noto come "CH", penso che anche tutti gli altri dovrebbero avere un soprannome basato inizialmente.

Ecco un elenco dei 100 migliori utenti di Puzzle di programmazione e Code Golf per reputazione con cui giocare:

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

( ecco come l'ho preso )

Sfida

Scrivi un programma o una funzione che contiene un elenco di stringhe e genera un altro elenco di stringhe con i loro nickname minimi, unici e basati sull'iniziale, dando la preferenza a quelli più vicini all'inizio dell'elenco.

Applica questo metodo a ciascuna stringa S nell'elenco nell'ordine indicato per creare i nickname:

  1. Dividi S in parole separate da spazi, rimuovendo tutti gli spazi nel processo.
  2. Elenca i prefissi non vuoti della stringa delle prime lettere delle parole in S, dal più corto al più lungo.
    ad esempio Just Some NameJ, JS,JSN
  3. Scegli il primo elemento in questo elenco che non è identico a un nickname già scelto come nickname per S. Stop se è stato scelto un nickname, continua al passaggio 4 altrimenti.
    ad esempio, se è Just Some Namestata la prima stringa, Jè garantito che sia il soprannome.
  4. Elenca nuovamente i prefissi, ma questa volta includi la seconda lettera della prima parola al suo posto naturale.
    ad esempio Just Some NameJu, JuS,JuSN
  5. Fai lo stesso del passaggio 3 per questo elenco, fermandoti se viene trovato un soprannome univoco.
  6. Ripeti questo processo con le lettere rimanenti della prima parola, inserendo infine le lettere nella seconda parola, quindi nella terza e così via, fino a quando non viene trovato un soprannome univoco.
    ad esempio, la prima stringa univoca elencate qui sarà il soprannome:
    Jus, JusS, JusSN
    Just, JustS, JustSN
    Just, JustSo, JustSoN(nota che onon è stato aggiunto dopo Just)
    Just, JustSom, JustSomN
    Just, JustSome, JustSomeN
    Just, JustSome,JustSomeNa
    Just , JustSome, JustSomeNam
    Just, JustSome,JustSomeName

Alla fine tutte le stringhe di input dovrebbero finire con un nickname univoco (potenzialmente identico alla stringa). Puoi supporre che nessuna delle stringhe di input verrà mappata allo stesso nickname usando questo metodo.

Esempio

Aggiornato per correggere il mio errore!

Per l'input

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

i soprannomi sarebbero

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

Dettagli

  • L'input può provenire da un file (un nome per riga) o un nome alla volta tramite stdin / riga di comando o come argomento di funzione di un elenco di stringhe o come argomento arg di una singola stringa con nuove righe tra i nomi.
  • L'output deve essere stampato su stdout (un nickname per riga) o restituito dalla funzione come un elenco di stringhe o come una stringa con newline tra i nickname.
  • Idealmente, i programmi funzioneranno con nomi che contengono caratteri esclusi i terminatori di riga . Tuttavia, si può presumere che tutti i nomi contengano solo ASCII stampabili . (I nomi PPCG no.)
  • Solo il carattere spaziale normale conta come separatore di parole. Gli spazi iniziali e finali possono essere ignorati.

punteggio

Vince l' invio più breve in byte . Tiebreaker va alla risposta pubblicata prima.


49
Questo spiega perché mi sono svegliato nel cuore della notte con questa vaga sensazione di sentirsi violato.
Martin Ender,

Risposte:


8

CJam, 58 53 byte

Questo può essere giocato molto a golf .. Ma per cominciare:

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

Espansione del codice :

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

Provalo online qui


2
Vedi il mio commento a OP: se "Ju" o "Jus" sono soprannomi validi per "Just Some Name", "Maertin Butter" deve essere "Ma", quindi "MaB", "Mar", "MarB".
edc65,

Quello che dice @ edc65 è vero. Mi dispiace per quello. Ti permetterò di non cambiare le cose se vuoi; è stato un mio errore.
Calvin's Hobbies,

9

JavaScript (ES6) 159

Seguendo le specifiche e non l'esempio.

Genero i soprannomi candidati con una parola centrale corrente (all'inizio, la prima parola). Le parole prima della corrente sono usate "così come sono". Le parole dopo l'attuale contribuiscono con nessun - o solo con il primo - carattere. La parola corrente contribuisce con 1 carattere in più per ogni ciclo.

Esempio 'Proprio qualche nome' => 'Just', 'Alcune', 'Nome'
Cw Just, la posizione 1, prova J, JS, JSN
Cw Just, la posizione 2, prova Ju, JuS, JuSN
Cw Just, la posizione 3, prova Jus, JusS, JusSN
Cw Just, la posizione 4, prova Just, JustS, JustSN
ora Justè esaurito ,Some diventa Cw, posizione riavviata su 2 (per la posizione 1, tutto già provato)

Cw Some, la posizione 2, prova Just, JustSo, JustSoN
Cw Some, la posizione 3, prova Just, JustSom, JustSomN
Cw Some, la posizione 4, prova Just, JustSome, JustSomeN
ora Someè esausto, Namediventa Cw, posizione riavviato per 2

Cw Name, la posizione 2, prova Just, JustSome, JustSomeNa
Cw Name, la posizione 3, prova Just, JustSome, JustSomeNam
Cw Name, la posizione 4, prova Just, JustSome, JustSomeName
Questo è tutto gente!

Il codice

(q è la posizione della parola corrente, p è la posizione di taglio)

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 nella console di 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

Potrebbe esserci ancora un piccolo potenziale di golf.

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,'
';}
  • Il programma funziona su stdin / stdout, funziona su ASCII, buggy su UTF
  • utilizzo: php -d error_reporting=0 golfnicks.php < nicknames.txt
  • o cat <<EOF | php -d error_reporting=0 golfnicks.php+ elenco di nomi +EOF
  • Per eseguire il test come funzione nel browser Web: recuperare la suddivisione, rimuovere il commento da tutte le righe contrassegnate con // FUNCe commentare quella contrassegnata da //PROG. Provaref(array_fill(0,21,'Just Some Name'));

abbattersi

#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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.