Golf Di Bawah Nama Pengguna PPCG

32

Sebuah komentar yang saya buat dalam obrolan dan percakapan berikutnya menginspirasi saya untuk membuat tantangan ini.

Apakah saya satu-satunya yang dirujuk oleh inisial di sekitar sini? Kita semua tentang bermain golf. Kita dapat memiliki MB dan D-nob dan ... O.

Jika saya dikenal sebagai "CH" maka saya pikir semua orang harus memiliki nama panggilan berbasis awal juga.

Berikut daftar top 100 pengguna Programming Puzzles & Code Golf menurut reputasinya:

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

( ini adalah bagaimana saya mendapatkannya )

Tantangan

Tulis sebuah program atau fungsi yang memasukkan daftar string dan menampilkan daftar string lain, minimal, unik, nama panggilan berbasis awal, memberikan preferensi kepada mereka yang lebih dekat dengan awal daftar.

Terapkan metode ini ke setiap string S dalam daftar dalam urutan yang diberikan untuk membuat nama panggilan:

  1. Membagi S menjadi kata-kata yang dipisahkan oleh spasi, menghapus semua spasi dalam proses.
  2. Daftar awalan nonempty dari string huruf pertama dari kata-kata di S, dari yang terpendek ke yang terpanjang.
    misalnya Just Some NameJ, JS,JSN
  3. Pilih item pertama dalam daftar ini yang tidak identik dengan nama panggilan yang sudah dipilih sebagai nama panggilan untuk S. Hentikan jika nama panggilan itu dipilih, lanjutkan ke langkah 4 jika tidak.
    misal jika Just Some Nametadi string pertama maka Jdijamin menjadi julukan.
  4. Buat daftar awalan lagi, tetapi kali ini sertakan huruf kedua dari kata pertama di tempat asalnya.
    misalnya Just Some NameJu, JuS,JuSN
  5. Lakukan hal yang sama seperti pada langkah 3 untuk daftar ini, berhenti jika nama panggilan unik ditemukan.
  6. Ulangi proses ini dengan sisa huruf dari kata pertama, akhirnya memasukkan huruf ke dalam kata kedua, kemudian yang ketiga, dan seterusnya, hingga nama panggilan unik ditemukan.
    misalnya string unik pertama yang tercantum di sini akan julukan:
    Jus, JusS, JusSN
    Just, JustS, JustSN
    Just, JustSo, JustSoN(catatan bahwa otidak ditambahkan setelah Just)
    Just, JustSom, JustSomN
    Just, JustSome, JustSomeN
    Just, JustSome, JustSomeNa
    Just, JustSome, JustSomeNam
    Just, JustSome,JustSomeName

Pada akhirnya semua string input harus diakhiri dengan nama panggilan unik (berpotensi identik dengan string). Anda dapat mengasumsikan bahwa tidak ada string input yang akan dipetakan ke nama panggilan yang sama menggunakan metode ini.

Contoh

Diperbarui untuk memperbaiki kesalahan saya!

Untuk 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

julukan itu akan

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

Detail

  • Input dapat berasal dari file (satu nama per baris), atau satu nama pada suatu waktu melalui stdin / baris perintah, atau sebagai argumen fungsi dari daftar string, atau sebagai argumen fungsi string tunggal dengan baris baru di antara nama.
  • Output harus dicetak ke stdout (satu nama panggilan per baris) atau dikembalikan oleh fungsi sebagai daftar string, atau sebagai satu string dengan baris baru di antara nama panggilan.
  • Idealnya program akan berfungsi untuk nama yang mengandung karakter apa pun kecuali terminator baris . Namun, Anda dapat mengasumsikan bahwa semua nama hanya berisi ASCII yang dapat dicetak . (Nama-nama PPCG tidak.)
  • Hanya karakter spasi reguler yang dianggap sebagai pemisah kata. Ruang depan dan belakang dapat diabaikan.

Mencetak gol

Pengajuan terpendek dalam byte menang. Tiebreaker pergi ke jawaban yang diposting paling awal.

Hobi Calvin
sumber
49
Ini menjelaskan mengapa saya terbangun di tengah malam dengan sensasi perasaan yang tidak jelas ini dilanggar.
Martin Ender

Jawaban:

8

CJam, 58 53 byte

Ini bisa bermain golf banyak .. Tapi sebagai permulaan:

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

Ekspansi Kode :

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

Cobalah online di sini

Pengoptimal
sumber
2
Lihat komentar saya untuk OP: jika 'Ju' atau 'Jus' adalah nama panggilan yang sah untuk 'Just Some Name', 'Maertin Butter' sholud menjadi 'Ma', maka 'MaB', 'Mar', 'MarB'.
edc65
Apa yang dikatakan @ edc65 benar. Maaf soal itu. Saya akan memungkinkan Anda untuk tidak mengubah hal-hal jika Anda mau; itu adalah kesalahanku.
Calvin Hobbies
9

JavaScript (ES6) 159

Mengikuti spesifikasi dan bukan contoh.

Saya menghasilkan nama panggilan kandidat memiliki kata tengah saat ini (di awal, kata pertama). Kata-kata sebelum saat ini digunakan 'apa adanya'. Kata-kata setelah arus berkontribusi tanpa - atau hanya karakter pertama. Kata saat ini berkontribusi dengan 1 karakter lebih untuk setiap loop.

Misalnya 'Hanya Beberapa Nama' => 'Hanya', 'Beberapa', 'Nama'
Cw Just, posisi 1, mencoba J, JS, JSN
Cw Just, posisi 2, mencoba Ju, JuS, JuSN
Cw Just, posisi 3, mencoba Jus, JusS, JusSN
Cw Just, posisi 4, mencoba Just, JustS, JustSN
Sekarang Justhabis , Somemenjadi Cw, posisi direstart ke 2 (untuk posisi 1, semua sudah mencoba)

Cw Some, posisi 2, mencoba Just, JustSo, JustSoN
cw Some, posisi 3, mencoba Just, JustSom, JustSomN
cw Some, posisi 4, mencoba Just, JustSome, JustSomeN
Sekarang Somehabis, Namemenjadi cw, posisi restart untuk 2

Cw Name, posisi 2, mencoba Just, JustSome, JustSomeNa
cw Name, posisi 3, mencoba Just, JustSome, JustSomeNam
cw Name, posisi 4, mencoba Just, JustSome, JustSomeName
Itu semua orang!

Kode

(q adalah posisi kata saat ini, p adalah posisi mengiris)

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

Uji di Firefox / konsol 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
sumber
2

PHP, 327 289 275 274 270

Mungkin masih ada sedikit potensi 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,'
';}
  • Program beroperasi pada stdin / stdout, bekerja pada ASCII, kereta pada UTF
  • pemakaian: php -d error_reporting=0 golfnicks.php < nicknames.txt
  • atau cat <<EOF | php -d error_reporting=0 golfnicks.php+ daftar nama +EOF
  • Untuk menguji sebagai fungsi di browser web: ambil rinciannya, batalkan komentar semua baris yang ditandai dengan // FUNCdan beri komentar yang ditandai //PROG. Mencobaf(array_fill(0,21,'Just Some Name'));

kerusakan

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