Kelimeyi uzat


50

Giriş, boşlukla ayrılmamış küçük harflerden oluşan bir kelimedir. Sonunda yeni bir satır isteğe bağlıdır.

Aynı kelime değiştirilmiş bir sürümde çıkarılmalıdır: Her karakter için, orijinal kelimede göründüğü ikinci kez, üçüncü kez vb. Üçe katlayın.

Örnek giriş:

bonobo

Örnek çıktı:

bonoobbooo

Standart I / O kuralları geçerlidir. Bayt cinsinden en kısa kod kazanır.

@Neil tarafından sağlanan testler:

tutu -> tuttuu
queue -> queuuee
bookkeeper -> boookkkeeepeeer
repetitive -> repeetittiiveee
uncopyrightables -> uncopyrightables
abracadabra -> abraacaaadaaaabbrraaaaa
mississippi -> misssiisssssssiiipppiiii

Yanıtlar:


36

Jöle , 4 bayt

;\f"

Çevrimiçi deneyin!

Nasıl çalışır

;\f"  Main link. Argument: S (string)

;\    Cumulatively reduce by concatenation.
      This yields the array of all prefixes of S.
  f"  Vectorized filter.
      Keep only occurrences of the nth letter in the nth prefix.

21
O zaman ... Pyth'i parçala.
Adnan

2
Bu site en iyi genel amaçlı golf dili için bir rekabet haline geliyor ... o kadar da kötü bir şey değil.
Shelvacu

8
@shelvacu İkincisi tartışmalı, 2 arkadaş PPCG'ye ilk izlenim olarak "tüm en iyi cevapların sadece golf dillerini kullandığı" satırları boyunca bir şey söylediğini gösterdim.
Insane

@Insane var / var. Kod golf oldukça yaygın bir şey. Bu nedenle, diller yalnızca bu amaç için bir araya getirilir.
Evan Carslake,

Bu nasıl çalışıyor?
Outgolfer Erik,

21

Pyth, 6 bayt

1 byte ayırdığı için @Doorknob'a teşekkürler .

5 bayt ayırdığı için @Maltysen'e teşekkürler .

s@VQ._

Çevrimiçi deneyin!

Nasıl çalışır


Örneğin, ipi alın "bonobo".

._ bir liste yapar: ['b', 'bo', 'bon', 'bono', 'bonob', 'bonobo']

VQ._"vektörlü önceki fonksiyonu üzerinde (paralel olarak uygulanmış) anlamına gelir Qve ._" anlamına gelir Q: (giriş hesaplanmıştır) bir listesi olarak kabul edilir ['b', 'o', 'n', 'o', 'b', 'o']ve daha sonra tarafından eşleştirilmiş olacak @bu gibi:

     Q      ._         @ (intersect)
0:  'b'     'b'       'b'
1:  'o'     'bo'      'o'
2:  'n'     'bon'     'n'
3:  'o'     'bono'    'oo'
4:  'b'     'bonob'   'bb'
5:  'o'     'bonobo'  'ooo'

Bu nedenle @VQ._üretecek ['b', 'o', 'n', 'oo', 'bb', 'ooo'].

Daha ssonra hepsini bir araya getirir, 'bonoobbooo'daha sonra olması için basılan bir dize oluşturur bonoobbooo.


2
Kenny, açıklaman yanlış. VQsadece for N in Qbir işlevin içinde olmadığı zaman anlamına gelir . Bu durumda, aslında ne oluyor yani @Vgelir @sonraki iki argüman üzerinde (paralel uygulanan) vectorized işlevi, Qve ._. Bu belgelerde eksik, o yüzden düzelteceğim.
isaacg

14

Retina , 34 19 bayt

Isaac'ın çözümünden ilham alarak 15 bayt kurtardı.

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.


$`¶
(\D)(?!.*\1¶)

Öndeki ve sondaki boş çizgiler önemli.

Çevrimiçi deneyin!

açıklama


$`¶

Bu, boş regex'le (yani dizedeki her sıfır genişlik pozisyonu) eşleşen ve $`¶bunun yerine kullanılan $`, eşleşmenin öneki olan ve bir satır besleme ekleyen bir değiştirme aşamasıdır. Bu temelde tüm önekleri hesaplar ve bu ön ekin son karakteriyle birlikte ayrı bir satıra yerleştirir:

bb
obo
oboo
kbook
kbookk
ebookke
ebookkee
pbookkeep
ebookkeepe
rbookkeeper

Önde gelen ve takip eden bazı çekimler olacak, ama onları görmezden gelebiliriz.

Bu öneklerin her birinden, son karaktere eşit olan karakterleri tutmak istiyoruz. Bunun için başka bir değişim aşaması kullanıyoruz:

(\D)(?!.*\1¶)

Bu her şeyi maçları yok tutmak istiyoruz ve bir şey değiştirir. Herhangi bir karakterle eşleşiriz ( \Dgirişinde rakam olmayacağını bildiğimizden beri) ve satırın sonunda bu karakterin başka bir kopyasının olmadığından emin olun .


11

Python, 56 bayt

Aynı uzunlukta iki cevapla sıkışmış gibiyim:

f=lambda x,*y:x and-~y.count(x[0])*x[0]+f(x[1:],x[0],*y)
f=lambda x,y=0:x[y:]and-~x[:y].count(x[y])*x[y]+f(x,y+1)

Düzenleme: Daha kısa, alternatif bir Python yaklaşımı için @ pacholik'in cevabına bakınız .


Sizi> <> cevaplarımla yenmeye alışkın değilim, bunu düzeltmek için bir Gol bekliyorum> <> cevabını;)
Aaron

@Aaron Çok kötü, aslında seni tekrar yenmek için gidiyordum > <>: P
Sp3000

Python'da hat gürültüsü? Ne sapkınlık !
kedi,

Ne iş yapar? Olumsuzluktan sonra BİRLİKTE bit bitmediğini biliyorum, ancak birkaç bayttan tasarruf etmek için ne yapmaya çalışıyorsunuz?
Nic Hartley

2
@QPaysTaxes Parens gerekmeyecek +1kadar yüksek önceliğe sahip bir artış
Sp3000

10

Haskell, 39 bayt

f""=""
f x=f(init x)++filter(==last x)x

Kullanım örneği: f "bonobo"-> "bonoobbooo".

@ Damien'ın cevabından yeterince farklı . Son karakterin tüm oluşumlarını dizeden ayıklayarak ve son karakter hariç tümü ile özyinelemeli bir çağrı hazırlayarak dizeyi sağdan oluşturur.


9

> <> , 27 bayt

>i:0g1+:\
:{-1v!?:<}o
/p${/

-1 kod noktasını yazdırmaya çalışırken hatalı olan resmi tercümanı gerektirir. Çevrimiçi deneyin!

Kod, her seferinde bir karakter girişi okur ve kod kutusunun ilk satırını, her bir karakterin şimdiye kadar görülme sayısını depolayan büyük bir dizi olarak kullanır (> <>, program dışı hücreleri 0 olarak başlatır). İkinci satır, bir karakterin birden çok kez çıktısını almak için kullanılan bir döngüdür.

Alternatif olarak, temiz bir şekilde çıkan bir sürüm (37 bayt, uygun şekilde golf oynamamıştır):

>i:0(?;:0g1+:\
}o:{-1v!?:   <
v  p${<

Kahretsin, bu iyi! Online tercüman bu kadar ağır güvenerek durmalı, ben sadece böyle büyük Codebox kullanmayı düşündünüz mü asla ve hatta resmi tercüman -1 baskı üzerine çıkıldı biliyordu vermedi
Aaron

2
@Aaron Evet, yapmaya çalışırken Python hatalarının bir sonucu chr(-1). Animasyonlu tercüman görselleştirme için harika, fakat ne yazık ki resmi tercüman ile olan tutarsızlıkların bazıları biraz can sıkıcı: /
Sp3000

9

JavaScript (ES6), 48 45 bayt

s=>s.replace(n=/./g,c=>c.repeat(n[c]=-~n[c]))

Düzenleme: @ user81655 sayesinde 3 bayt kaydedildi.


8

Haskell, 50 42 41 bayt

Lynn sayesinde 8 bayt kaydedildi

f t=[c|(i,c)<-zip[1..]t,x<-take i t,c==x]

1
Nasıl:f t=[c|(i,c)<-zip[0..]t,j<-[0..i],c==t!!j]
Lynn

8

MATL , 8 bayt

tt!=RsY"

Çevrimiçi deneyin! Veya tüm test durumlarını bir kerede doğrulayın .

açıklama

t    % take input string implictly. Duplicate
t!   % duplicate and transpose into a column
=    % test for equality with broadcast. Gives an NxN array, where N is
     % input string length
R    % upper triangular part: set entries below the diagonal to 0
s    % sum of each column. For each postion in the input, gives how many
     % times that letter has appeared up to that position
Y"   % replicate elements (run-length decoding). Display implicitly

8

Labirent , 54 25 bayt

<#; "#: ={},>
 }=}(.);("@

Aslında yaptığımız @ MartinBüttner, bir başka collab en Bunun için neredeyse golf hepsi. Algoritmayı yenileyerek, program boyutunu biraz azaltmayı başardık!

Çevrimiçi deneyin!

açıklama

Hızlı bir Labrinth primer:

  • Labirent, yığın tabanlı bir 2B dilidir. İki yığın vardır, bir ana ve yardımcı yığın vardır ve boş bir yığıntan çıkma sıfır verir.

  • Yönergenin aşağıya hareket etmesi için birden fazla yolun bulunduğu her kavşakta, ana yığının tepesi, nereye gidileceğini görmek için kontrol edilir. Negatif sola, sıfır dümdüz ve pozitif sağa döner.

İki isteğe bağlı tamsayılı yığınının bellek seçenekleri açısından fazla esnekliği yoktur. Saymayı gerçekleştirmek için, bu program aslında iki yığını bir bant olarak kullanır, bir değeri bir yığından diğerine kaydırır ve bir bellek işaretçisini bir hücre tarafından sola / sağa hareket ettirmeye benzer. Bu tam olarak aynı değil, çünkü bir döngü sayacını yukarı çekmemiz gerekiyor.

görüntü tanımını buraya girin

Öncelikle, <ve >her iki ucunda bir ofset açılır ve bir sola veya sağa kaymış olan kod satırını döndürür. Bu mekanizma, kodun bir döngüde çalışmasını sağlamak için kullanılır - <pop bir sıfır çıkar ve mevcut satırı sola döndürür, IP'yi kodun sağına yerleştirir ve >pop bir başka sıfır çıkar ve satırı geri düzeltir.

Yukarıdaki diyagramla ilişkili olarak her yinelemede olanlar şöyledir:

[Section 1]
,}    Read char of input and shift to aux - the char will be used as a counter
      to determine how many elements to shift

[Section 2 - shift loop]
{     Shift counter from aux
"     No-op at a junction: turn left to [Section 3] if char was EOF (-1), otherwise
      turn right
(     Decrement counter; go forward to [Section 4] if zero, otherwise turn right
=     Swap tops of main and aux - we've pulled a value from aux and moved the
      decremented counter to aux, ready for the next loop iteration

[Section 3]
@     Terminate

[Section 4]
;     Pop the zeroed counter
)     Increment the top of the main stack, updating the count of the number of times
      we've seen the read char
:     Copy the count, to determine how many chars to output

[Section 5 - output loop]
#.    Output (number of elements on stack) as a char
(     Decrement the count of how many chars to output; go forward to [Section 6]
      if zero, otherwise turn right
"     No-op

[Section 6]
}     Shift the zeroed counter to aux

[Section 7a]
This section is meant to shift one element at a time from main to aux until the main
stack is empty, but the first iteration actually traverses the loop the wrong way!

Suppose the stack state is [... a b c | 0 d e ...].

=     Swap tops of main and aux               [... a b 0 | c d e ...]
}     Move top of main to aux                 [... a b | 0 c d e ...]
#;    Push stack depth and pop it (no-op)
=     Swap tops of main and aux               [... a 0 | b c d e ...]
      Top is 0 at a junction - can't move
      forwards so we bounce back
;     Pop the top 0                           [... a | b c d e ... ]

The net result is that we've shifted two chars from main to aux and popped the
extraneous zero. From here the loop is traversed anticlockwise as intended.

[Section 7b - unshift loop]

#     Push stack depth; if zero, move forward to the <, else turn left
}=    Move to aux and swap main and aux, thus moving the char below (stack depth)
      to aux
;     Pop the stack depth

7

Perl, 17

(16 bayt kodu, -p için +1)

s/./${$&}.=$&/ge

Kullanımı:

perl -pe 's/./${$&}.=$&/ge' <<< 'bonobo'
bonoobbooo

7

Pyth, 7 bayt

s@Led._

Test odası

DenkerAffe sayesinde test paketi

Açıklama:

s@Led._
     ._    All prefixes, implicitly applied to the input.
 @L        Filter each prefix for characters equal to
   ed      the last character of the prefix
s          Concatenate and implicitly print.


5

PowerShell v2 +, 52 47 bayt

$b=@{};-join([char[]]$args[0]|%{"$_"*++$b[$_]})

Boş bir karma tablo oluşturur, depolar $b. Bu bizim gördüğümüz harflerin "sayacı" dır. Daha sonra girdi alıyoruz $args[0], karakter dizisi olarak yayınlıyoruz ve bir döngüden gönderiyoruz. Her yinelemede, mevcut karakteri alırız "$_"ve verilen değeri önceden artan sayıcı ile çarptırırız; bu, ilk oluşumun çarpımını 1, ikincisi ile çarpımını sağlar 2. Bunu, kapsanan -jointek bir kelime ile kaplıyoruz.

Dizi yerine bir karma tablo kullanarak TessellatingHeckler sayesinde 5 bayt kurtardı , bu yüzden 97uygun dizine ulaşmak için ASCII karakterini düşürmemize gerek yoktu . Bu işe .Add()yarar çünkü karma dizini önceden artırmak, bu dizin yoksa, arka planda dolaylı olarak çağırır , çünkü etiketler değişkendir.

PS C:\Tools\Scripts\golfing> .\stretch-the-word.ps1 tessellatingheckler
tessseelllattingheeeckllleeeer

@TessellatingHeckler Gerçekten - teşekkürler!
AdmBorkBork

5

Dyalog APL , 6 bayt

∊,\∩¨⊢

TryAPL!

4 fonksiyon, bir çatalın (2 tren) üstüne (3 tren):

┌──┴──┐  
∊ ┌───┼─┐
  \   ¨ ⊢
┌─┘ ┌─┘  
,   ∩    

İlk (sağ - no-op) verilen dizgede, veren'bonobo'

Sonra ,\dize (birleştirme taraması), veren'b' 'bo' 'bon' 'bono' 'bonob' 'bonobo'

İki (hakkı olarak verilen ve bağımsız değişkenler sol) ile birlikte çatallı edilir ∩¨(kesişim her biri) örneğin ('b'∩'b') ('bo'∩'o') ('bon'∩'n') ('bono'∩'o') ('bonob'∩'b') ('bonobo'∩'o'), hangi'b' 'o' 'n' 'oo' 'bb' 'ooo'

Son olarak, (enlist) düzleştirmek için sonuca uygulanır,'bonoobbooo'

Hey, en azından Pyth ile aynı ! Açıkçası Jelly , APL'nin fonksiyon başına 2 karakterlik gelişmiş bir lehçesi olan J'nin golf versiyonu olduğundan daha kısadır.


4

Pyth, 11 bayt

s.e*b/<Qhkb

Burada dene!

açıklama

se * b / <Qhkb # Q = giriş

 .e # değeri b olarak, değer olarak b ile giriş üzerinde eşlenir (Q, sonuna kadar eklenir)
      <Qhk #, Q'nun ilk 1 + k karakterini alır
     / b # orada b sayısının oluşumları
   * b # b tekrarlayın
s # sonuç listesini bir dizgede birleştir

4

J, 11 bayt

#~+/@(={:)\

Bu monadik bir fiildir. Burada dene. Kullanımı:

   f =: #~+/@(={:)\
   f 'tutu'
'tuttuu'

açıklama

#~+/@(={:)\
     (   )\  For each non-empty prefix:
       {:      Take last element,
      =        compare for equality to the others and itself
  +/@          and take sum (number of matches).
#~           Replicate original elements wrt the resulting array.

4

05AB1E , 10 bayt

Kod:

$vy«Dy¢y×?

Açıklama:

$           # Push the number 1 and input
 v          # Map over the input string
  y«        # Concat the letter to the previous string (initial 1)
    D       # Duplicate this string
     y¢     # Count the occurences of the current character in the string
       y×   # Multiply this number with the current character
         ?  # Pop and print without a newline

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


3

CJam, 14

q:A,{)A<_)--}/

Çevrimiçi deneyin

Açıklama:

q:A      read the input and store in A
,        get the string length
{…}/     for each number from 0 to length-1
  )      increment the number
  A<     get the prefix of A with that length
  _      duplicate it
  )      separate the last character
  -      remove it from the rest of the prefix
  -      remove all the remaining characters (different from the last one)
          from the prefix

2

Perl 6, 37 bayt

{.split('').map({$_ x++%.{$_}}).join}

2

> <> , 52 bayt

i:0(?;&l:?!v1-$:&:&=?\}70.>
6f+0.00o:&~/         \:o

Her harfin okunmasını istifler, yığıntaki benzer her harf için bir kez ve tekrar basar.
Bu &kütüğü kullanır , çünkü yığında 3 değişken işlemek zorunda (mevcut okuma mektubu, yığındaki pozisyon, bu pozisyondaki harf) bir acıdır.

Burada deneyebilirsiniz !


2

Rust, 176 Bayt

fn s(w:&str)->String{let mut m=std::collections::HashMap::new();w.chars().map(|c|{let mut s=m.remove(&c).unwrap_or(String::new());s.push(c);m.insert(c,s.clone());s}).collect()}

Bu, girdideki her karakter için bir dize saklamak için bir harita kullanır. Her karakter için, karakter haritasından çıkarılır, karakter ile birleştirilir, tekrar haritaya eklenir ve çıktıya eklenir.

Bunun get(...)yerine kullanmak isterdim remove(...), ancak borç kontrolcüsü fikrimi değiştirmemi sağladı .


2

Mathcad, 66 bayt

Ne yazık ki, Mathcad özellikle iyi bir dize işlemine sahip değil, bu yüzden girdi dizesini bir vektöre dönüştürdüm ve daha sonra bir karakterin kaç kez karşılaştığını takip etmek için bir karakterle (indekslenmiş) bir vektör kullandım. sonuç vektörünün sayısı. Son olarak, sonuç vektörü tekrar bir dizgeye dönüştürülür. Maalesef oldukça uzun.

görüntü tanımını buraya girin

Mathcad'in normal metin ve operatörlerin bir karışımını içeren bir 2D "beyaz tahta" arayüzü kullandığını unutmayın; operatörler normal olarak bir araç çubuğu veya klavye kısayolu ile girilir; örneğin, ctl- #, yineleme değişkeni, aralık ve gövde ifadeleri için sırasıyla anahtar kelimesi ve sembol boşluğunu içeren 3 boş "yer tutucusu" olan for loop operatörüne girer. Yazma [bir değişken ismi dizi indeks moduna girdikten sonra, Typing 'eşleşen bir parantez çiftine girer ( çoğunlukla ... çevreleyen ifadede başka ne olduğuna bağlı olarak istisnalar vardır )


2

Javascript ES6 44 bayt

q=>q.replace(/./g,a=>x[a]=(x[a]||'')+a,x=[])

eski cevap

Javascript ES6 46 bayt

q=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``

//thanks user81655 for -1 byte

1
xGirdi dizisine hareket ederek bir byte kaydedebilirsiniz ->q=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``
user81655 4

2

Julia, 38 35 bayt

!s=[]==s?s:[!s[1:end-1];ss[end]]

G / Ç, karakter dizilerinden geliyor. Çevrimiçi deneyin!

Nasıl çalışır

Monadik operatörü (yeniden) tanımlıyoruz ! bizim amaçlarımız için.

Ne zaman ! denir, onun argümanı eğer denetler s boş. Öyleyse, argümanını döndürür.

Eğer s boş olmayan, biz kesişir s son karakteri (ile s[end]bu karakterin tüm oluşumlarını verir), s . Bu sonuç, özyinelemeli bir aramanın geri dönüş değeri ile birleştirilir ! ile s eksi son karakteri ( s[1:end-1]bağımsız değişken olarak).


2

PHP, 54 51 50 47 bayt

for(;$C=$argn[$X++];)echo str_repeat($C,++$$C);

Bu şekilde koş:

echo abracadabra | php -nR 'for(;$C=$argn[$X++];)echo str_repeat($C,++$$C); echo"\n";'

Düzenlemeler

  • Değişken değişkenleri kullanarak 3 bayt kaydedildi. Çarpışmayı önlemek için kullanılan değişkenler büyük harfe değiştirildi
  • Tipi döküm kaldırarak bir byte Kaydedilen nulliçin intofset dize zaten int döküm gibi, dize ofset için
  • $argnBunun yerine 3 bayt kaydedildi $argv(thx Titus)

Üç bayt daha kaydetmek için $argnile kullanın -R.
Titus

Oh, ve -nseninle aynı şeyi yapması gerekir -d error_reporting: nanlamına gelir no config fileve varsayılan yapılandırmada bildirimler kapalıdır; bu nedenle -nr(sırasıyla -nR) yeterli olmalıdır.
Titus

@Titus 2 yıllık cevap, ama yine de thx :)
9'da

1

Mathematica, 57 bayt

StringReplace[Clear@c;c@_=0;#,x_:>x~StringRepeat~++c[x]]&

c[x]Karakterin ne sıklıkta xgerçekleştiğine ilişkin bir arama tablosu olarak kullanıyoruz . Bu, her alındığında artırılır x~StringRepeat~++c[x]. Ne yazık ki, işlevi yeniden kullanılabilir hale getirmek için arama tablosunu her seferinde sıfırlamamız gerekiyor Clear@c;c@_=0;, bu oldukça pahalı.


1

awk, 72 bayt

BEGIN{FS=""}{for(i=1;i<=NF;i++){a[$i]++;for(j=0;j<a[$i];j++)printf $i}}

Fikir, ortaya çıkan karakterin sayısını ilişkisel bir dizide saklamak ve karakteri bu sayıya kadar yazdırmaktır.


1

Kiriş, 32 33 42 bayt

Bu daha küçük olmalıydı, ancak bellek yuvalarını 0'a ayarlayan bazı baytları kaybettim. Çok fazla boş alanı ortadan kaldıran bazı akış yönlerini değiştirmek.

 >+\
vus/
>rnH
  >g'\
(@v's/
^`<

Bu pasajda dene

Genel açıklama

  • Tüm bellek yuvalarını 0-255'ten 0'a ayarlayın
  • Giriş ascii değerini ışına okuyun
  • Kiriş 0 durursa (kiriş = saklama)
  • Hafıza [beam] değerini mağazaya yerleştirin, arttırın ve geri kazanın
  • Işın karakterini yazdırmak için mağazayı 0 değerine düşürün
  • Tekrar et

1

Python, 66 62 bayt

Burada dene

golfed

def s(w,o=[],n=""):
 for x in w:o+=x;n+=x*o.count(x)
 return n

Ungolfed

def stretch(word):
    occurrences = []
    newWord = ""
    for w in word:
        occurrences.append(w)
        newWord += w * occurrences.count(w)
    return newWord
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.