Đánh bóng tên người dùng PPCG


32

Một bình luận tôi đã thực hiện trong cuộc trò chuyện và cuộc trò chuyện tiếp theo đã truyền cảm hứng cho tôi để thực hiện thử thách này.

Tôi có phải là người duy nhất được nhắc đến bởi tên viết tắt quanh đây không? Chúng tôi là tất cả về những thứ golf xuống. Chúng ta có thể có MB và D-nob và ... O.

Nếu tôi được gọi là "CH" thì tôi nghĩ mọi người khác cũng nên có biệt danh dựa trên ban đầu.

Dưới đây là danh sách 100 người dùng lập trình Câu đố & Code Golf hàng đầu theo danh tiếng để chơi với:

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

( đây là cách tôi hiểu )

Thử thách

Viết chương trình hoặc hàm nhận danh sách các chuỗi và đưa ra danh sách các chuỗi khác có biệt danh dựa trên ban đầu, duy nhất, tối thiểu của chúng, ưu tiên cho các chuỗi gần hơn với đầu danh sách.

Áp dụng phương pháp này cho từng chuỗi S trong danh sách theo thứ tự được đưa ra để tạo biệt hiệu:

  1. Tách S thành các từ cách nhau bởi khoảng trắng, loại bỏ tất cả khoảng trắng trong quy trình.
  2. Liệt kê các tiền tố không trống của chuỗi các chữ cái đầu tiên của các từ trong S, từ ngắn nhất đến dài nhất.
    ví dụ Just Some NameJ, JS,JSN
  3. Chọn mục đầu tiên trong danh sách này không trùng với biệt hiệu đã được chọn làm biệt hiệu cho S. Dừng nếu chọn biệt hiệu, tiếp tục bước 4 nếu không.
    ví dụ: nếu Just Some Namelà chuỗi đầu tiên thì Jđược đảm bảo là biệt danh.
  4. Liệt kê lại các tiền tố một lần nữa, nhưng lần này bao gồm chữ cái thứ hai của từ đầu tiên ở vị trí tự nhiên.
    ví dụ Just Some NameJu, JuS,JuSN
  5. Thực hiện tương tự như trong bước 3 cho danh sách này, dừng lại nếu tìm thấy một biệt danh duy nhất.
  6. Lặp lại quy trình này với các chữ cái còn lại của từ đầu tiên, cuối cùng chèn các chữ cái vào từ thứ hai, sau đó là từ thứ ba, v.v., cho đến khi tìm thấy một biệt danh duy nhất.
    ví dụ Chuỗi độc đáo đầu tiên được liệt kê ở đây sẽ là nickname:
    Jus, JusS, JusSN
    Just, JustS, JustSN
    Just, JustSo, JustSoN(lưu ý rằng okhông được thêm vào sau Just)
    Just, JustSom, JustSomN
    Just, JustSome, JustSomeN
    Just, JustSome, JustSomeNa
    Just, JustSome, JustSomeNam
    Just, JustSome,JustSomeName

Cuối cùng, tất cả các chuỗi đầu vào sẽ có một biệt danh duy nhất (có khả năng giống hệt với chuỗi). Bạn có thể cho rằng không có chuỗi đầu vào nào sẽ ánh xạ tới cùng một tên hiệu bằng phương thức này.

Thí dụ

Cập nhật để sửa lỗi của tôi!

Đối với đầu vào

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

biệt danh sẽ là

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

Chi tiết

  • Đầu vào có thể từ một tệp (một tên trên mỗi dòng) hoặc một tên tại một thời điểm thông qua stdin / dòng lệnh hoặc dưới dạng đối số chức năng của danh sách các chuỗi hoặc dưới dạng hàm đối số của một chuỗi có dòng mới giữa các tên.
  • Đầu ra phải được in ra thiết bị xuất chuẩn (một biệt danh trên mỗi dòng) hoặc được hàm trả về dưới dạng danh sách các chuỗi hoặc dưới dạng một chuỗi có dòng mới giữa các biệt danh.
  • Các chương trình lý tưởng sẽ hoạt động cho các tên có chứa bất kỳ ký tự nào ngoại trừ các đầu cuối dòng . Tuy nhiên, bạn có thể cho rằng tất cả các tên chỉ chứa ASCII có thể in được . (Tên PPCG không.)
  • Chỉ có ký tự không gian thông thường được tính là một dấu tách từ. Không gian hàng đầu và dấu có thể được bỏ qua.

Chấm điểm

Đệ trình ngắn nhất tính bằng byte thắng. Tiebreaker đi đến câu trả lời được đăng sớm nhất.


49
Điều này giải thích tại sao tôi thức dậy vào giữa đêm với cảm giác mơ hồ về cảm giác bị xâm phạm.
Martin Ender

Câu trả lời:


8

CJam, 58 53 byte

Điều này có thể được chơi golf rất nhiều .. Nhưng đối với người mới bắt đầu:

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

Mở rộng mã :

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

Dùng thử trực tuyến tại đây


2
Xem nhận xét của tôi với OP: nếu 'Ju' hoặc 'Jus' là biệt danh hợp lệ của 'Chỉ một số tên', 'Maertin Butter' sholud là 'Ma', sau đó là 'MaB', 'Mar', 'MarB'.
edc65

Những gì @ edc65 nói là đúng. Xin lỗi vì điều đó. Tôi sẽ cho phép bạn không thay đổi mọi thứ nếu bạn muốn; đó là sai lầm của tôi.
Sở thích của Calvin

9

JavaScript (ES6) 159

Theo thông số kỹ thuật và không phải là ví dụ.

Tôi tạo các biệt danh ứng cử viên có một từ giữa hiện tại (ở đầu, từ đầu tiên). Các từ trước hiện tại được sử dụng 'như là'. Các từ sau đóng góp hiện tại không có - hoặc chỉ là ký tự đầu tiên. Từ hiện tại đóng góp thêm 1 ký tự cho mỗi vòng lặp.

Ví dụ 'Chỉ cần Một số Tên' => 'Chỉ', 'Một số', 'Tên'
Cw Just, vị trí 1, hãy thử J, JS, JSN
Cw Just, vị trí 2, hãy thử Ju, JuS, JuSN
Cw Just, vị trí 3, hãy thử Jus, JusS, JusSN
Cw Just, vị trí 4, hãy thử Just, JustS, JustSN
Bây giờ Justlà kiệt sức , Sometrở thành Cw, vị trí được khởi động lại thành 2 (đối với vị trí 1, tất cả đã được thử)

Cw Some, vị trí 2, thử Just, JustSo, JustSoN
cw Some, vị trí 3, hãy thử Just, JustSom, JustSomN
cw Some, vị trí 4, hãy thử Just, JustSome, JustSomeN
Bây giờ Somelà kiệt sức, Nametrở thành cw, vị trí khởi động lại để 2

Cw Name, vị trí 2, thử Just, JustSome, JustSomeNa
cw Name, vị trí 3, hãy thử Just, JustSome, JustSomeNam
cw Name, vị trí 4, hãy thử Just, JustSome, JustSomeName
Đó là tất cả các folks!

Mật mã

(q là vị trí từ hiện tại, p là vị trí cắt)

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

Kiểm tra trong bảng điều khiển 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", " Tháng ba "]


2

PHP, 327 289 275 274 270

Có thể vẫn còn một chút tiềm năng chơi 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,'
';}
  • Chương trình hoạt động trên stdin / stdout, hoạt động trên ASCII, lỗi trên UTF
  • sử dụng: php -d error_reporting=0 golfnicks.php < nicknames.txt
  • hoặc cat <<EOF | php -d error_reporting=0 golfnicks.php+ danh sách tên +EOF
  • Để kiểm tra chức năng trong trình duyệt web: tìm nạp sự cố, bỏ ghi chú tất cả các dòng được đánh dấu // FUNCvà nhận xét dòng được đánh dấu //PROG. Thửf(array_fill(0,21,'Just Some Name'));

phá vỡ

#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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.