PPCG Kullanıcı Adlarını Aşağı Golf


32

Bir Yorum Ben sohbet yapılmış ve ardından gelen konuşma bu zorluğu yapmak bana ilham verdi.

Buradaki baş harflerin tek bahsettiği ben miyim? Hepimiz golf oynamaktan bahsediyoruz. MB, D-nob ve ... O.

Eğer "CH" olarak biliniyorsam, o zaman herkesin de baştaki bir takma adı olması gerektiğini düşünüyorum.

İşte oynayacağınız üne göre en iyi 100 Programlama Bulmacaları ve Code Golf kullanıcılarının listesi:

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

( bu nasıl anladım )

Meydan okuma

Dizelerin listesini alan ve minimal, benzersiz, ilke dayalı takma adların dizelerinin listesini çıkaran, listenin başlangıcına daha yakın olanları tercih eden bir program veya işlev yazın.

Bu yöntemi, takma adları oluşturmak için verilen sıradaki listedeki S dizelerine uygulayın:

  1. İşlemdeki tüm boşlukları kaldırarak S'yi boşluklarla ayrılmış kelimelere ayırın.
  2. S kelimelerinin ilk harflerinin dizgisinin boş olmayan öneklerini en kısadan en uzun zamana kadar listeleyin.
    örneğin Just Some NameJ, JS,JSN
  3. Bu listede, S için takma ad olarak önceden seçilen bir takma adla aynı olmayan ilk öğeyi seçin. Takma ad seçildiyse, 4. adıma geçin.
    Örneğin Just Some Name, ilk dizge olsaydı , Jtakma ad olduğu garanti edilir.
  4. Önekleri tekrar listeleyin, ancak bu kez ilk kelimenin ikinci harfini doğal yerine ekleyin.
    örneğin Just Some NameJu, JuS,JuSN
  5. Benzersiz bir takma ad bulunursa, bu liste için 3. adımdakilerle aynı işlemi yapın.
  6. Bu işlemi ilk kelimenin kalan harfleriyle, sonunda ikinci kelimeye harfleri ekleyerek, sonra üçüncü ve benzeri şeyleri, benzersiz bir takma ad bulunana kadar tekrarlayın.
    mesela burada listelenen ilk benzersiz dize takma olacaktır:
    Jus, JusS, JusSN
    Just, JustS, JustSN
    Just, JustSo, JustSoN(not osonra eklenmedi Just)
    Just, JustSom,JustSomN
    Just , JustSome, JustSomeN
    Just, JustSome, JustSomeNa
    Just, JustSome, JustSomeNam
    Just, JustSome,JustSomeName

Sonunda, tüm giriş dizeleri benzersiz bir takma adla bitmelidir (dizgeyle aynı olabilir). Bu yöntemi kullanarak giriş dizelerinin hiçbirinin aynı takma adla eşleşmeyeceğini varsayabilirsiniz.

Örnek

Hatamı düzeltmek için güncellendi!

Giriş için

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

takma isimler

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

ayrıntılar

  • Girdi, bir dosyadan (satır başına bir ad) veya stdin / komut satırı aracılığıyla bir defada bir ad veya dizelerin bir listesinin işlev argümanı olarak veya adlar arasında newlines içeren tek bir dizenin işlev argümanı olabilir.
  • Çıktı stdout'a (satır başına bir takma ad) yazdırılmalı veya işlev tarafından dizelerin bir listesi olarak veya takma isimler arasında yeni satırlara sahip bir dize olarak döndürülmelidir.
  • İdeal olarak programlar, dışındaki karakterleri içeren isimler için çalışacaktır. satır sonlandırıcılar . Ancak, tüm adların yalnızca yazdırılabilir ASCII içerdiğini varsayabilirsiniz . (PPCG adları yok.)
  • Sadece normal boşluk karakteri sözcük ayırıcı olarak sayılır. Önde gelen ve sondaki boşluklar göz ardı edilebilir.

puanlama

Bayt cinsinden en kısa gönderme kazanır. Tiebreaker en erken gönderilen cevaba gider.


49
Bu, gecenin ortasında neden bu belirsiz duygu duygusunun ihlal edildiğiyle uyandığımı açıklıyor.
Martin Ender

Yanıtlar:


8

CJam, 58 53 bayt

Bu çok golf olabilir .. Ama yeni başlayanlar için:

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

Kod Genişletme :

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

Burada çevrimiçi deneyin


2
OP hakkındaki yorumuma bakın: 'Ju' veya 'Jus' 'Just Some Name' için geçerli takma adlarsa, 'Maertin Butter', 'Ma', sonra 'MaB', 'Mar', 'MarB' olmalı.
edc65

@ Edc65'in söylediği doğru. Bunun için üzgünüm. İsterseniz bir şeyleri değiştirmenize izin vermeyeceğim; benim hatamdı.
Calvin'in Hobileri

9

JavaScript (ES6) 159

Örnek takip değil özelliklerin ardından.

Geçerli bir orta kelimeye sahip aday takma isimler oluşturuyorum (başlangıçta ilk kelime). Akımdan önceki kelimeler 'olduğu gibi' kullanılır. Akımdan sonraki sözcükler, hayır ya da sadece ilk karakter ile katkıda bulunur. Mevcut kelime her döngü için 1 karakter daha ekler.

Örnek 'Sadece Bazı Adı' => 'Sadece', 'Bazı', 'Adı'
Cw Just, pozisyon 1, denemek J, JS, JSN
Cw Just, pozisyon 2, denemek Ju, JuS, JuSN
Cw Just, pozisyon 3, denemek Jus, JusS, JusSN
Cw Just, pozisyon 4, denemek Just, JustS, JustSN
Şimdi Justbitti , SomeCw olur, konum 2'ye yeniden başlatılır (konum 1 için, zaten denendi)

Cw Some, pozisyon 2, deneyin Just, JustSo, JustSoN
Cw Some, pozisyon 3, denemek Just, JustSom, JustSomN
Cw Some, pozisyon 4, denemek Just, JustSome, JustSomeN
Şimdi Sometükenmiş, Namepozisyon 2'ye yeniden Cw olur

Cw Name, pozisyon 2, deneyin Just, JustSome, JustSomeNa
Cw Name, pozisyon 3, denemek Just, JustSome, JustSomeNam
Cw Name, pozisyon 4, denemek Just, JustSome, JustSomeName
Bu millet!

Kod

(q geçerli kelime pozisyonu, p dilimleme konumu)

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

Firefox / FireBug konsolunda test edin

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

Hala biraz golf potansiyeli olabilir.

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 stdin / stdout, ASCII üzerinde çalışıyor, UTF'de çalışıyor
  • kullanımı: php -d error_reporting=0 golfnicks.php < nicknames.txt
  • veya cat <<EOF | php -d error_reporting=0 golfnicks.php + isim listesi +EOF
  • Web tarayıcısında işlev olarak test etmek için: dağıtımı getirin, ile işaretli tüm satırları // FUNCyorumlayın ve ile işaretlenmiş olana yorum yapın //PROG. Deneyinf(array_fill(0,21,'Just Some Name'));

Yıkmak

#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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.