Dizeleri esnekleştirmek için bir program yaz


33

Başlığında güzel fiil var.

Bir giriş dizesi verilen, bu dizeyi "esnekleştirecek" ve bir sonuç çıktısı alacak bir program yazın. Bir ipin elastikleştirilmesi şu şekilde yapılır:

İlk karakter bir kez gösterilir. İkinci karakter iki kez gösterilir. Üçüncü karakter, üç kez gösterilir, vb.

Gördüğünüz gibi, belirli bir karakterin kopyalarının sayısı, dizedeki önceki oluşumlarının tersine karakterin endeksi ile ilgilidir.

Yalnızca yazdırılabilir ASCII karakterleri almayı bekleyebilirsiniz. Aşağıdaki bağlantıya dayanarak , bu karakterlerin ondalık değerleri 32-126'dır.

Örnekler:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (İlk b 3 kez gösterildiğinden ve ikinci b 4 kez gösterildiğinden, toplam 7 b olduğu için 7 b'nin nasıl olduğuna dikkat edin).

A and B: A aaannnnddddd BBBBBBB

En kısa bayt kazanır :)


2
Bu, "boşluk karakterinden başka boşluklara gerek yok" ile aynı fikirde görünmüyor. Çıkış, giriş ile aynı mı olmalı? (İki tane harfli kelime?) Ayrıca, Sandbox adında, insanların göndermeden önce size geri bildirimde bulunabilmeleri için zorluk çekebileceğiniz hoş bir yerimiz olduğunu unutmayın .
FryAmTheEggman

FryAmTheEggman varsayımınız geçerlidir. @TimmyD Nerede belirsiz olduğumu farkettim, yayınlanacak FryAmTheEggman örneğinde görüldüğü gibi, çoklu boşluklarımı ayrılmış dizelerle sona erdirebilirsiniz.
Mario Ishac

En kısa kodun kazanacağını farz ediyorum. ;)
Adnan

@Adnan Yep, bazı diller diğerlerinden farklı olarak golf amaçlı yapıldığı için cevabı kısa programla kabul edildi olarak işaretlemem gerekip gerekmediğinden emin değilim.
Mario Ishac

2
İlgili: 1 , 2
Sp3000

Yanıtlar:


34

Jöle , 3 bayt

Kod:

ĖP€

Açıklama:

Ė     # Enumerate.
 P€   # Product of each.
      # Implicit joining of everything.

Jelly kodlamasını kullanır . Çevrimiçi deneyin! .


16
Python's'ın *dize çarpımı yaptığı gerçeğinin hoş bir şekilde kötüye kullanılması . Bu gerçekten amaçlanmadı ama işe yarıyor.
Dennis,

1
@Dennis: hangisi *? Cevapta böyle bir şey yok.
Thomas Weller,

10
@Thomas: Jelly Python ile yazılmıştır ve Jelly Pkomutu Python *operatörünü kullanarak perde arkasındaki ürünü hesaplar . Bu gönderi, temelde Python'da bulunan kodun sızdıran soyutlamasını kötüye kullanıyor, bu nedenle Pbir dizgede bir (ürün) komutu yapılması beklendiği gibi çalışıyor.
mellamokb

16

J, 4 bayt

#~#\

kullanım

   f =: #~#\
   f 'Why'
Whhyyy
   f 'SKype'
SKKyyyppppeeeee
   f 'LobbY'
LoobbbbbbbYYYYY
   f 'A and B'
A  aaannnnddddd      BBBBBBB

açıklama

#~#\  Input: s
  #\  Computes the length of each prefix of s
      This forms the range [1, 2, ..., len(s)]
#~    For each value in the range, copy the character at the
      corresponding index that many times
      Return the created string

12

Brainfuck, 15 bayt

,[>+[->+<<.>],]

Oldukça basit uygulama, her bir giriş karakteri için bellek alanını 1'e kaydırmak. EOF'de 0 veren bir tercüman ve 255 karakterden daha uzun girişler için 32 bit / isteğe bağlı hassas hücreler gerektirir.

Çevrimiçi deneyin! (Not: TIO, 8 bit hücreler kullanır)


1
Ayrıca, bunun 255 karakterden uzun olan dizeler için çalışmadığını düşünüyorum.
Ismael Miguel,

@IsmaelMiguel Söz konusu tercümanın keyfi bir tamsayı olup olmamasına bağlı olacaktır (ancak çoğu uygulama için
255'te başlayacaktır

Kongre 8 bit kullanmaktır. 1 karakter. Ancak bazıları gerçekten 32 bit sayılarla uygulanabilir. EOF'nin 0 olması gerektiğini belirttiğinizden (bu bir derleyici / tercümana özel davranıştır), 255 karakterden uzun dizeler için, 32 bit hücreli bir derleyici / tercümana ihtiyaç duyduğunuz belirtilmelidir. Ben sadece derleyici / tercümana özgü bir davranış olduğu için cevaba eklenmesi gerektiğini düşünüyorum.
Ismael Miguel,

1
@ IsmaelMiguel Sure, kaydetti.
Sp3000,

8

Java, 158 121 bayt

Kevin Cruijssen sayesinde bir kuyruklu 37 byte kurtardı !

interface a{static void main(String[]A){int b=0,B;for(char c:A[0].toCharArray())for(B=b+++2;--B>0;)System.out.print(c);}}

Bir bonus olarak, bu program , Temel Çok Dilli Düzlem'in en sonunda bulunan kontrol karakterleri de dahil olmak üzere , var olan tüm Unicode karakterleri kullanabilir .


3
Huh, bu bir Java kodu için çok kısa.
Ave

1
Sen değiştirerek 1 bayt ile kısaltın olabilir for(int C=c+1;C>0;C--)ilefor(int C=c+2;--C>0;)
Kevin Cruijssen

2
Veya daha kısa ( 121 byte ):interface a{static void main(String[]A){int x=0,i;for(char c:A[0].toCharArray())for(i=x+++2;--i>0;)System.out.print(c);}}
Kevin Cruijssen,

Eh, sadece lambda veya bir yöntem yapın
Leaky Nun

2
Vay, interfacevarsayılan publicyöntemler için bir kullanarak . Bu akıllıca.
Justin

7

Perl, 16 bayt

s/./$&x$+[0]/ge

-pBayrak için +1 bayt .

s/./        /    find every character
             g   globally
              e  and replace with the eval'd result of
    $&           the matched string
      x          repeated
       $+[0]     by the index of the character after the match

7

Haskell, 29 bayt

concat.zipWith replicate[1..]

Kullanım örneği: concat.zipWith replicate[1..] $ "SKype"-> "SKKyyyppppeeeee".

replicate n cc nin n kopyasını concatçıkarır ve tüm alt listelerden tek bir liste çıkarır.


id=<<hoş bir dokunuş. :)
sudee

Sadece denemek istedim ama f = id=<<zipWith replicate[1..](bir dosyada) atamak çirkin bir hataya neden oldu, yanlış yaptığımı söyleyebilir misiniz?
kusur

Bu (isimlendirilmemiş, sağ?) İşlevini bir isime atamak mümkün olmaz mı, böylece işlev olarak kullanabiliriz? Yani, eğer bir fonksiyonsa, o zaman (id=<<zipWith replicate[1..] ) "SKype"hala çalışmalı mıyım? Aksi takdirde, pasajı olarak düşünürdüm . Tam bir program Sağladığınız "Skype" kodlanmış var.
kusur

Başka bir işlev gibi kullanamazsanız, bunun bir işlev olmadığını söylerim. Örneğin :t, id=<<zipWith replicate[1..]bir işlev olarak düşünmüyor (sadece bir hata veriyor) ancak (id=<<).zipWith replicate[1..]bir işlev olarak kabul ediliyor. Birincisinin sadece bir koparma olduğunu söyleyebilirim, sadece girdiyi kodlarsanız işe yarar, fakat sadece gönderdiğiniz ikincisi bir işlevdir (ve :tkabul eder), buna katılıyor musunuz?
kusur

Tamam harika! Eğer benim "tanımım" ile aynı fikirde değilseniz, bunu silmek için bir meta gönderi başlatmalıyız. Bu sadece olduğu gibi arada Ben, bu onların görüş için başka haskellians bulmaya çalışıyorum benim görünümü.
kusur

7

CJam, 9 8 7 bayt

1 byte tasarruf için jimmy23013'e teşekkürler.

Sl+eee~

Burada test et.

açıklama

LobbYÖrnek kullanarak :

                                      Stack:
S    e# Push space.                   [" "]
l    e# Read input.                   [" " "LobbY"]
+    e# Append.                       [" LobbY"]
ee   e# Enumerate.                    [[[0 ' ] [1 'L] [2 'o] [3 'b] [4 'b] [5 'Y]]]
e~   e# Run-length decode.            ["LoobbbbbbbYYYYY"]


5

Javascript ES6, 39 bayt

x=>x.replace(/./g,(y,i)=>y+y.repeat(i))

Aynı uzunluk, ancak daha eğlenceli:

x=>x.replace(i=/./g,y=>y.repeat(i=-~i))

Snippet demosu:

f= x=>x.replace(/./g,(y,i)=>y+y.repeat(i))
run.onclick=_=>output.textContent=f(input.value)
<input id="input" value="SKype">
<button id="run">Go</button>
<pre id="output"></pre>


Küçük hata, program bir gönderme olarak gerekli olan boşlukları desteklemiyor (OP'yi kontrol edin).
Mario Ishac

@MarDev Bunun <pre>yerine kullanmak için pasajı değiştirdim <div>, bu yardımcı olmalı.
Neil

1
@Neil Ah, sonuç doğru hesaplandı, ancak çıktı HTML tarafından yanlış bir şekilde görüntülendi. Unutmayın <div> bunu yapıyor.
Mario Ishac

... "ve sonuç çıktısı "
spender

1
@ spender return, işlevler için geçerli bir çıktı biçimidir
cat

4

APL (8)

{⍵/⍨⍳⍴⍵}

yani:

      {⍵/⍨⍳⍴⍵} ¨  'Why' 'SKype' 'LobbY'
┌──────┬───────────────┬───────────────┐
│Whhyyy│SKKyyyppppeeeee│LoobbbbbbbYYYYY│
└──────┴───────────────┴───────────────┘

Açıklama:

  • ⍴⍵: verilen vektörün uzunluğu
  • : sayılar 1.N
  • ⍵/⍨: her elemanı N kere kopyalar .

4

MATLAB, 45 bayt

g=@(m)sort(m(m>0));@(s)s(g(hankel(1:nnz(s))))

Açıklama: Anahtar, hankelverilen bir vektörün Hankel matrisini üreten anahtardır . Bu matristen, dizgenin hangi karakterinin çıktıda hangi konumda olduğunu tanımlayan bir indeks vektörü çıkarabiliriz. Örneğin hankel(1:4)aşağıdaki matrisi üretir:

 1  2  3  4
 2  3  4  0
 3  4  0  0
 4  0  0  0

Bu matristen vektörü çıkarabiliriz 1,2,2,3,3,3,4,4,4,4,4. Bu vektör çıkışına dizenin birinci karakteri bizi tanır kez , ikincisini iki kez vb


4

NARS2000 , 6 karakter = 12 bayt

⍳∘⍴/⊙⊢

⍳∘⍴argümanın numaralandırılması ... (uzunluğunun indeksleri) değiştirilmemiş argümanın
/⊙unsurlarını çoğaltır


tercümana bağlantı
kedi

@cat See edit (in header).
Adám

@cat What was your edit?
Adám

Karakterinin aynısı, çünkü kendim googledim ve düzenlemem 10 dakika sürdü
kedi

Ayrıca, hangi kod sayfasında bu 6 bayt?
kedi

3

PowerShell v2 +, 36 bayt

-join([char[]]$args[0]|%{"$_"*++$i})

Girdi alır $args[0], açıkça bir chardizi olarak yayınlar, onu bir döngüye gönderir |%{...}. Her yineleme, geçerli harfi / karakteri alır "$_"ve *önceden artan $izamanları dizgiyi birleştirmek için aşırı yüklenmiş operatörü kullanırız . Her döngü yinelemesinin sonucu, bir dizi oluşturmak için parenler içinde kapsüllenir ve daha sonra -joinbir dize oluşturmak için birlikte ed. Bu dize boru hattında bırakılır ve çıktı örtüktür.

Örnekler

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 Why
Whhyyy

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 SKype
SKKyyyppppeeeee

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 LobbY
LoobbbbbbbYYYYY

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 'a b'
a  bbb

3

Brachylog, 13 bytes

:ImC,0:Ie,Cw\

This prints the result to STDOUT.

Explanation

This is a good example of exploiting backtracking to loop.

:ImC            C is the Ith character of the Input
    ,
     0:Ie       Unify an implicit variable with an integer between 0 and I
         ,
          Cw    Write C to STDOUT
            \   False, trigger backtracking. It will go back to 0:Ie and unify the implicit
                variable with another integer, until all integers were used. After that, it
                will backtrack to :ImC and unify I and C with the next character.

3

MATLAB, 23 bytes

@(x)repelem(x,1:nnz(x))

Creates an anonymous function ans that can be called using ans('stringtoelacticize')


What version are you using? Cannot find repelem in my (relatively old) version =(
flawr

1
@flawr repelem was introduced in R2015a
Luis Mendo


3

Perl 6,  22 20  19 bytes

{S:g/(.)/{$0 x$/.to}/}
{S:g[(.)]=$0 x$/.to}
{[~] .comb Zx 1..*}

Explanation:

{          # implicit parameter $_
  [~]      # string concatenate the following list
    .comb  # the NFG characters from $_
    Z[x]   # zip combined using the string repetition operator
    1 .. * # 1 to infinity
}

3

VBA, 75 bytes

Function e(s):For a=1 To Len(s):e=e &String(a,Mid(s,a,1)):Next:End Function

Call as e.g. a user function in a spreadsheet.

=e(A1)

┌─────────┬───────────────┐
│   SKype │SKKyyyppppeeeee│
└─────────┴───────────────┘

It truncates if you feed it its own output a few times :-).


2
Welcome to the site! =)
DJMcMayhem

3

PHP, 68 bytes

<?php foreach(str_split($argv[1])as$i=>$a)echo str_repeat($a,$i+1);

Hi, and welcome to PPCG! Nice first post!
Rɪᴋᴇʀ

You can get it down to 47 bytes: for(;$a=$argv[1][$i++];)echo str_repeat($a,$i);.
insertusernamehere

3

Javascript ES6, 42 41 bytes

s=>[,...s].map((e,i)=>e.repeat(i)).join``

Example runs:

f=s=>[,...s].map((e,i)=>e.repeat(i)).join``

f("Why")   => "Whhyyy"
f("SKype") => "SKKyyyppppeeeee"
f("LobbY") => "LoobbbbbbbYYYYY"

Same length: s=>[...s].reduce((a,b,i)=>a+b.repeat(i+1))
Bassdrop Cumberwubwubwub

2
-1 byte: s=>[,...s].map((e,i)=>e.repeat(i)).join``
nderscore

@nderscore Aha, thats clever, thanks!
Dendrobium

3

Retina, 22 bytes

Byte count assumes ISO 8859-1 encoding.

.
$&$.`$*·
+`(.)·
$1$1

Try it online!

Basically, we insert the right amount of · as placeholders between the characters (since these extended ASCII characters can't appear in the input), then fill them up with the adjacent character in the second stage.


3

R, 83 50 bytes

-23 Thanks to Giuseppe, though he used essentially an entire new method altogether

function(s)intToUtf8(rep(utf8ToInt(s),1:nchar(s)))

My original post:

function(s){r="";for(i in 1:nchar(s))r=paste0(r,strrep(el(strsplit(s,""))[i],i));r}

Try it online!

I feel like there's definitely a better way to do this, but with my new knowledge of a few functions in R, this is my approach.


1
Not a golfing tip, but your code link output was messed up. Here
Robert S.

Ah, I see. I'm new to TIO, so I didn't quite understand the header/footer portions. Thank You!
Sumner18


1
Very nice! However, using rep and the argument collapse="" to paste is shorter, and utf8ToInt is shorter still! TIO
Giuseppe

2

Actually, 7 bytes

' +ñ♂πΣ

Try it online!

Explanation:

' +ñ♂πΣ
' +      prepend a space
   ñ     enumerate ("abc" -> [[0, 'a'], [1, 'b'], [2, 'c']])
    ♂π   map: for each character, repeat it n times
      Σ  concatenate


2

Python 3, 48 47 bytes

Thanks to mego for saving a byte with the -~i trick.

lambda s:''.join(c*-~i for i,c in enumerate(s))

This is mostly self-explanatory. One thing for those not versed in Python: The * operator is overloaded to act like Perl's x operator, repeating its string argument the number of times specified by its numeric argument. E.g. 'foo' * 3 == 'foofoofoo'


c*-~i is shorter than c*(i+1).
Mego

2

C#, 81 Bytes

void f(string s){for(int i=0;i<s.Length;i++)Console.Write(new String(s[i],i+1));}

you can save 1 byte by changing to a foreach loop, e.g. foreach(var a in s)Console.Write(new C(a,1*i++));
Abbath

but if its a foreach we don't have the i variable so you'd need to declare it.
ScifiDeath

It seems you're missing a using System or a System. in front of the Console.
Martin Ender

@ScifiDeath That's true - but the end result is still one byte shorter. Sorry for omitting it and causing confusion int i=1;
Abbath

Also one byte shorter using Linq: void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}. The need for a (unused) return value is ugly though. Edit: just found similar snippets in other answers further back.
linac

2

MATL, 5 bytes

tn:Y"

Try it Online

Explanation

    % Implictly grab input as a string
tn  % Duplicate and compute the length (N)
:   % Create an array from [1...N]
Y"  % Perform run-length decoding to elacticize the string
    % Implicitly display the result

2

Python, 40 bytes

f=lambda s,i=1:s and s[0]*i+f(s[1:],i+1)

2

Julia, 34 bytes

!s=s>""?!s[1:(e=end)-1]*s[e:e]^e:s

Try it online!


Your solution was good. But I managed to beat it.
Glen O

I saw. I had c%n="$c"^n;~s=join([s[r=1:end]...].%r), but that's actually longer. split was the missing piece of the puzzle.
Dennis

2

TSQL, 97 bytes

Golfed:

DECLARE @x varchar(max)='Lobby'
DECLARE @ int=LEN(@x)WHILE @>0SELECT
@x=STUFF(@x,@,1,REPLICATE(SUBSTRING(@x,@,1),@)),@-=1PRINT @x

Ungolfed:

DECLARE @x varchar(max)='Lobby'

DECLARE @ int=LEN(@x)
WHILE @>0
  SELECT 
    @x=STUFF(@x,@,1,REPLICATE(SUBSTRING(@x,@,1),@)),
    @-=1

PRINT @x

Try it online

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.