Tulis sebuah program untuk melemaskan string

33

Kata kerja yang bagus di sana, dalam judul.

Tulis sebuah program yang diberi string input, akan "melenturkan" string ini dan menampilkan hasilnya. Elastisisasi string dilakukan sebagai berikut:

Karakter pertama ditampilkan sekali. Karakter kedua ditampilkan dua kali. Karakter ketiga ditampilkan tiga kali, dan seterusnya.

Seperti yang Anda lihat, jumlah duplikasi karakter tertentu terkait dengan indeks karakter yang bertentangan dengan kemunculan sebelumnya dalam string.

Anda hanya dapat menerima karakter ASCII yang dapat dicetak. Berdasarkan tautan berikut , karakter-karakter ini memiliki nilai desimal 32-126.

Contoh:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (Perhatikan bagaimana ada 7 b sejak b pertama ditampilkan 3 kali dan b kedua ditampilkan 4 kali, sehingga total 7 b).

A and B: A aaannnnddddd BBBBBBB

Bytes terpendek menang :)

Mario Ishac
sumber
2
Itu tampaknya tidak setuju dengan "tidak diperlukan dukungan untuk spasi putih, selain karakter ruang". Haruskah outputnya sama dengan inputnya? (Dua kata satu huruf?) Juga perhatikan kami memiliki tempat yang bagus bernama Sandbox tempat Anda dapat memberikan tantangan bagi orang-orang untuk memberi Anda umpan balik sebelum mempostingnya.
FryAmTheEggman
FryAmTheEggman asumsi Anda valid. @TimmyD Saya menyadari di mana saya tidak jelas, Anda mungkin berakhir dengan string memisahkan beberapa spasi saya, seperti yang terlihat pada contoh yang diposting FryAmTheEggman.
Mario Ishac
Saya berasumsi bahwa kode terpendek menang? ;)
Adnan
@ Adnan Yep, meskipun saya tidak yakin apakah saya harus menandai jawaban dengan program singkat yang diterima, karena bahasa tertentu dibuat untuk tujuan bermain golf tidak seperti yang lain.
Mario Ishac
2
Terkait: 1 , 2
Sp3000

Jawaban:

34

Jelly , 3 byte

Kode:

ĖP€

Penjelasan:

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

Menggunakan pengodean Jelly . Cobalah online! .

Adnan
sumber
16
Penyalahgunaan fakta bahwa Python *melakukan multiplikasi string. Itu tidak benar-benar dimaksudkan, tetapi berhasil.
Dennis
1
@ Dennis: yang mana *? Tidak ada hal seperti itu di seluruh jawaban.
Thomas Weller
10
@ Thomas: Jelly ditulis dengan Python, dan Pperintah Jelly menghitung produk di belakang layar menggunakan *operator Python . Posting ini menyalahgunakan abstraksi yang bocor dari kode yang mendasari sebenarnya berada di Python, sehingga melakukan perintah P(produk) pada sebuah string berfungsi seperti yang diharapkan.
mellamokb
16

J, 4 byte

#~#\

Pemakaian

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

Penjelasan

#~#\  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
mil
sumber
12

Brainfuck, 15 byte

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

Implementasi yang cukup mudah, menggeser ruang memori sebesar 1 untuk setiap karakter input. Membutuhkan interpreter yang memberikan 0 pada EOF, dan sel presisi 32-bit / arbitrary untuk input yang lebih panjang dari 255 karakter.

Cobalah online! (Catatan: TIO menggunakan sel 8-bit)

Sp3000
sumber
1
Juga, saya pikir ini tidak berfungsi untuk string yang lebih panjang dari 255 karakter.
Ismael Miguel
@IsmaelMiguel Itu akan tergantung pada apakah penerjemah yang dimaksud memiliki bilangan bulat presisi yang sewenang-wenang atau tidak (tetapi memang, untuk sebagian besar implementasi, itu akan mencapai batas 255)
Sp3000
Konvensi ini menggunakan 8-bit. Yaitu 1 karakter. Tetapi beberapa memang mungkin menerapkan dengan angka 32-bit. Karena Anda menentukan bahwa Anda membutuhkan EOF menjadi 0 (yang merupakan perilaku khusus penyusun / juru bahasa), harus dicatat bahwa untuk string yang lebih panjang dari 255 karakter, Anda memerlukan penyusun / juru bahasa dengan sel 32-bit. Saya hanya berpikir bahwa itu harus ditambahkan ke jawaban, karena itu juga merupakan perilaku khusus compiler / interpreter.
Ismael Miguel
1
@IsmaelMiguel Sure, catat.
Sp3000
8

Java, 158 121 byte

Menyimpan 37 byte kekalahan berkat Kevin Cruijssen !

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);}}

Sebagai bonus, program ini dapat menangani semua karakter Unicode yang ada, termasuk karakter kontrol yang terletak di bagian paling bawah Basic Multilingual Plane .

dorukayhan ingin Monica kembali
sumber
3
Huh, ini sangat singkat untuk kode Java.
Ave
1
Anda dapat mempersingkatnya dengan 1 byte dengan menggantinya for(int C=c+1;C>0;C--)denganfor(int C=c+2;--C>0;)
Kevin Cruijssen
2
Atau bahkan lebih pendek ( 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
Yah, buat saja lambda atau metode
Leaky Nun
2
Wow, menggunakan metode interfacedefault public. Itu pintar.
Justin
7

Perl, 16 byte

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

+1 byte untuk -pbendera.

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
Gagang pintu
sumber
7

Haskell, 29 byte

concat.zipWith replicate[1..]

Contoh penggunaan: concat.zipWith replicate[1..] $ "SKype"-> "SKKyyyppppeeeee".

replicate n cmembuat n salinan c dan concatmembuat daftar tunggal dari semua sublists.

nimi
sumber
id=<<adalah sentuhan yang bagus. :)
sudee
Saya hanya ingin mencobanya, tetapi menetapkan f = id=<<zipWith replicate[1..](dalam file) memang menghasilkan kesalahan yang buruk, bisakah Anda mengatakan apa yang saya lakukan salah?
flawr
Tidakkah mungkin untuk menetapkan fungsi ini (tanpa nama, kan?) Ke nama, sehingga kita dapat menggunakannya sebagai fungsi? Maksud saya jika itu adalah suatu fungsi, maka (id=<<zipWith replicate[1..] ) "SKype"apakah masih harus bekerja? Kalau tidak, saya akan menganggapnya sebagai cuplikan . Program lengkap yang Anda berikan memang memiliki "SKype" hardcoded.
flawr
Saya akan mengatakan jika Anda tidak dapat menggunakannya seperti fungsi lainnya, itu bukan fungsi. Misalnya :ttidak menganggap id=<<zipWith replicate[1..]sebagai fungsi (hanya melempar kesalahan) namun (id=<<).zipWith replicate[1..]dianggap sebagai fungsi. Saya akan mengatakan yang pertama hanya potongan, yang hanya berfungsi jika Anda memasukkan hardcode input, tetapi yang kedua yang baru saja diposkan adalah fungsi (dan :tsetuju), apakah Anda setuju akan hal itu?
flawr
OK bagus! Jika Anda tidak setuju dengan "definisi" saya, saya pikir kita harus memulai sebuah posting meta untuk menyelesaikan ini. Sementara itu saya mencoba mencari beberapa haskellian lain untuk pendapat mereka tentang ini, karena ini hanya pandangan saya .
flawr
7

CJam, 9 8 7 byte

Terima kasih kepada jimmy23013 untuk menghemat 1 byte.

Sl+eee~

Uji di sini.

Penjelasan

Menggunakan LobbYcontoh:

                                      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"]
Martin Ender
sumber
6

Python, 39 byte

f=lambda s:s and f(s[:-1])+s[-1]*len(s)

Uji di Ideone .

Dennis
sumber
5

Javascript ES6, 39 byte

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

Panjangnya sama, tetapi lebih menyenangkan:

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

Demo cuplikan:

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>

nderscore
sumber
Kesalahan kecil, program tidak mendukung spasi, yang diperlukan sebagai kiriman (periksa OP).
Mario Ishac
@MarDev Saya mengubah cuplikan untuk digunakan <pre> sebagai gantinya <div>, itu akan membantu.
Neil
1
@Neil Ah, jadi hasilnya dihitung dengan benar, tetapi hasilnya tidak benar oleh HTML. Lupa bahwa <div> melakukan itu.
Mario Ishac
... "dan keluaran hasilnya"
pemboros
1
Pengembalian @spender adalah bentuk output yang valid untuk berbagai fungsi
cat
4

APL (8)

{⍵/⍨⍳⍴⍵}

Yaitu:

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

Penjelasan:

  • ⍴⍵: panjang vektor yang diberikan
  • : angka 1..N
  • ⍵/⍨: mereplikasi setiap elemen dalam N kali.
marinus
sumber
4

MATLAB, 45 byte

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

Penjelasan: Kuncinya adalah hankel, yang menghasilkan matriks Hankel dari vektor yang diberikan. Dari matriks ini, kita dapat mengekstraksi vektor indeks, yang menentukan karakter string mana yang berada di posisi mana dalam output. Misalnya hankel(1:4)menghasilkan matriks berikut:

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

Dari matriks ini kita dapat mengekstrak vektor 1,2,2,3,3,3,4,4,4,4,4. Vektor ini memungkinkan kita untuk mengeluarkan karakter pertama dari string sekali , yang kedua dua kali dll

cacat
sumber
4

NARS2000 , 6 karakter = 12 byte

⍳∘⍴/⊙⊢

⍳∘⍴enumerasi argumen ... (indeks panjangnya)
/⊙mereplikasi elemen ...
argumen yang tidak dimodifikasi

Adm
sumber
tautan ke juru bahasa?
kucing
@cat Lihat edit (di tajuk).
Adám
@ kucing Apa hasil edit Anda?
Adám
Identik dengan karakter Anda hingga ke karakternya, karena saya googled sendiri dan hasil edit saya butuh 10 menit untuk dikirim
cat
Juga, di mana codepage ini 6 byte?
kucing
3

PowerShell v2 +, 36 byte

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

Mengambil input $args[0], secara eksplisit melemparkannya sebagai chararray, mengirimkannya ke dalam satu lingkaran |%{...}. Setiap iterasi, kami mengambil huruf / karakter saat ini "$_"dan menggunakan *operator kelebihan beban untuk menggabungkan string pra-kenaikan $ikali. Hasil dari setiap iterasi loop diringkas dalam parens untuk membentuk array dan kemudian -joindiedit bersama untuk membentuk string. String itu ditinggalkan di pipeline dan outputnya implisit.

Contohnya

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
AdmBorkBork
sumber
3

Brachylog , 13 byte

:ImC,0:Ie,Cw\

Ini mencetak hasilnya ke STDOUT .

Penjelasan

Ini adalah contoh yang baik untuk mengeksploitasi backtracking ke 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.
Fatalisasi
sumber
3

MATLAB, 23 byte

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

Menciptakan fungsi anonim ansyang bisa disebut menggunakanans('stringtoelacticize')

Suever
sumber
Versi apa yang Anda gunakan? Tidak dapat menemukan repelemdalam versi saya (relatif lama) = (
flawr
1
@ flawr repelemdiperkenalkan di R2015a
Luis Mendo
3

K / Kona , 14 byte

{,/(1+!#x)#'x}

Pemakaian:

k){,/(1+!#x)#'x}"A and B"
"A  aaannnnddddd      BBBBBBB"
Simon Major
sumber
3

Perl 6 ,  22 20  19 byte

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

Penjelasan:

{          # 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
}
Brad Gilbert b2gills
sumber
3

VBA, 75 byte

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

Sebut sebagai misalnya fungsi pengguna dalam spreadsheet.

= e (A1)

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

Ini terpotong jika Anda memberinya output sendiri beberapa kali :-).

Joffan
sumber
2
Selamat datang di situs ini! =)
DJMcMayhem
3

PHP, 68 byte

<?php foreach(str_split($argv[1])as$i=>$a)echo str_repeat($a,$i+1);
Simon
sumber
Hai, dan selamat datang di PPCG! Posting pertama yang bagus!
R
Anda bisa mendapatkannya turun ke 47 bytes : for(;$a=$argv[1][$i++];)echo str_repeat($a,$i);.
masukkan nama pengguna di sini
3

Javascript ES6, 42 41 byte

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

Contoh berjalan:

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

f("Why")   => "Whhyyy"
f("SKype") => "SKKyyyppppeeeee"
f("LobbY") => "LoobbbbbbbYYYYY"
Dendrobium
sumber
Panjang yang sama: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, itu pintar, terima kasih!
Dendrobium
3

Retina , 22 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Cobalah online!

Pada dasarnya, kami menyisipkan jumlah yang tepat ·sebagai placeholder di antara karakter (karena karakter ASCII yang diperluas ini tidak dapat muncul di input), lalu mengisinya dengan karakter yang berdekatan di tahap kedua.

Martin Ender
sumber
3

R , 83 50 byte

-23 Terima kasih kepada Giuseppe, meskipun pada dasarnya dia menggunakan seluruh metode baru

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

Posting asli saya:

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

Cobalah online!

Saya merasa pasti ada cara yang lebih baik untuk melakukan ini, tetapi dengan pengetahuan baru saya tentang beberapa fungsi dalam R, ini adalah pendekatan saya.

Sumner18
sumber
1
Bukan tip golf, tetapi output tautan kode Anda kacau. Di sini
Robert S.
Ah, begitu. Saya baru mengenal TIO, jadi saya tidak begitu mengerti bagian header / footer. Terima kasih!
Sumner18
1
Sangat bagus! Namun, menggunakan repdan argumen collapse=""untuk pastelebih pendek, dan utf8ToIntmasih lebih pendek! TIO
Giuseppe
2

Sebenarnya, 7 byte

' +ñ♂πΣ

Cobalah online!

Penjelasan:

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

Pyth - 5 byte

1 byte disimpan berkat @FryAmTheEggman.

s*VSl

Test Suite .

Maltysen
sumber
@FryAmTheEggman ah, bagus.
Maltysen
2

Python 3, 48 47 byte

Terima kasih kepada mego karena telah menghemat satu byte dengan -~itriknya.

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

Ini sebagian besar sudah jelas. Satu hal untuk mereka yang tidak berpengalaman dalam Python: *Operator kelebihan beban untuk bertindak seperti xoperator Perl , mengulangi argumen stringnya berapa kali ditentukan oleh argumen numeriknya. Misalnya'foo' * 3 == 'foofoofoo'

bkul
sumber
c*-~ilebih pendek dari 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));}
ScifiDeath
sumber
Anda dapat menyimpan 1 byte dengan mengubah ke loop foreach, misalnyaforeach(var a in s)Console.Write(new C(a,1*i++));
Abbath
tetapi jika ini merupakan pendahuluan kami tidak memiliki variabel i jadi Anda harus mendeklarasikannya.
ScifiDeath
Tampaknya Anda melewatkan satu using Systematau beberapa System.di depan Console.
Martin Ender
@ ScifiDeath Itu benar - tetapi hasil akhirnya masih satu byte lebih pendek. Maaf karena mengabaikannya dan menyebabkan kebingunganint i=1;
Abbath
Juga satu byte pendek menggunakan Linq: void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}. Kebutuhan untuk nilai pengembalian (tidak digunakan) jelek. Sunting: baru saja menemukan cuplikan serupa di jawaban lain di bagian belakang.
linac
2

MATL, 5 byte

tn:Y"

Cobalah secara Online

Penjelasan

    % 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
Suever
sumber
2

Python, 40 byte

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

Julia, 34 byte

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

Cobalah online!

Dennis
sumber
Solusi Anda baik. Tetapi saya berhasil mengalahkannya.
Glen O
Saya melihat. Sudah c%n="$c"^n;~s=join([s[r=1:end]...].%r), tapi itu sebenarnya lebih lama. splitadalah potongan puzzle yang hilang.
Dennis
2

TSQL, 97 byte

Golf:

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

Tidak Disatukan:

DECLARE @x varchar(max)='Lobby'

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

PRINT @x

Cobalah online

t-clausen.dk
sumber