Viết chương trình để co giãn chuỗi


33

Động từ đẹp ở đó, trong tiêu đề.

Viết chương trình đưa ra một chuỗi đầu vào, sẽ "co giãn" chuỗi này và đưa ra kết quả. Việc co giãn một chuỗi được thực hiện như sau:

Nhân vật đầu tiên được hiển thị một lần. Nhân vật thứ hai được hiển thị hai lần. Nhân vật thứ ba được hiển thị ba lần, và như vậy.

Như bạn có thể thấy, số lượng trùng lặp của một ký tự nhất định có liên quan đến chỉ mục của ký tự trái ngược với các lần xuất hiện trước đó trong chuỗi.

Bạn có thể mong đợi chỉ nhận được các ký tự ASCII có thể in được. Dựa trên liên kết sau , các ký tự này có giá trị thập phân 32-126.

Ví dụ:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (Lưu ý cách có 7 b 'kể từ b đầu tiên được hiển thị 3 lần và b thứ hai được hiển thị 4 lần, tổng cộng là 7 b').

A and B: A aaannnnddddd BBBBBBB

Các byte ngắn nhất sẽ thắng :)


2
Điều đó dường như không đồng ý với "không cần hỗ trợ cho khoảng trắng, ngoại trừ ký tự khoảng trắng". Có nên đầu ra giống như đầu vào không? (Hai chữ cái một chữ?) Cũng lưu ý rằng chúng tôi có một vị trí đẹp gọi là Sandbox nơi bạn có thể đặt thử thách cho mọi người để đưa ra phản hồi trước khi đăng chúng.
FryAmTheEggman

FryAmTheEggman giả định của bạn là hợp lệ. @TimmyD Tôi nhận ra nơi tôi không rõ ràng, bạn có thể kết thúc bằng các chuỗi phân tách nhiều khoảng trắng của tôi, như trong ví dụ FryAmTheEggman đã đăng.
Mario Ishac

Tôi đang giả sử rằng mã ngắn nhất sẽ thắng? ;)
Ad Nam

@Adnan Yep, mặc dù tôi không chắc mình có nên đánh dấu câu trả lời với chương trình rút gọn là được chấp nhận hay không, vì một số ngôn ngữ được tạo ra cho mục đích chơi gôn không giống như những ngôn ngữ khác.
Mario Ishac

2
Liên quan: 1 , 2
Sp3000

Câu trả lời:


34

Thạch , 3 byte

Mã số:

ĖP€

Giải trình:

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

Sử dụng mã hóa Jelly . Hãy thử trực tuyến! .


16
Rất hay lạm dụng thực tế là Python *nhân chuỗi. Điều đó không thực sự có ý định, nhưng nó hoạt động.
Dennis

1
@Dennis: cái *nào? Không có điều đó trong toàn bộ câu trả lời.
Thomas Weller

10
@Thomas: Jelly được viết bằng Python và Plệnh Jelly tính toán sản phẩm đằng sau hậu trường bằng *toán tử Python . Bài đăng này đang lạm dụng sự trừu tượng hóa rò rỉ của mã cơ bản thực sự có trong Python, do đó, thực hiện Plệnh (sản phẩm) trên chuỗi hoạt động như mong đợi.
mellamokb

16

J, 4 byte

#~#\

Sử dụng

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

Giải trình

#~#\  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 byte

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

Việc thực hiện khá đơn giản, thay đổi không gian bộ nhớ bằng 1 cho mỗi char đầu vào. Yêu cầu trình thông dịch cung cấp 0 trên EOF và các ô chính xác 32 bit / tùy ý cho các đầu vào dài hơn 255 ký tự.

Hãy thử trực tuyến! (Lưu ý: TIO sử dụng các ô 8 bit)


1
Ngoài ra, tôi nghĩ rằng điều này không hoạt động đối với các chuỗi dài hơn 255 ký tự.
Ismael Miguel

@IsmaelMiguel Điều đó phụ thuộc vào việc người phiên dịch trong câu hỏi có số nguyên chính xác tùy ý hay không (nhưng thực tế, đối với hầu hết các triển khai, nó sẽ giới hạn ở 255)
Sp3000

Quy ước là sử dụng 8 bit. Đó là 1 ký tự. Nhưng một số thực sự có thể thực hiện với các số 32 bit. Vì bạn chỉ định rằng bạn cần EOF là 0 (là hành vi dành riêng cho trình biên dịch / trình thông dịch), nên lưu ý rằng đối với các chuỗi dài hơn 255 ký tự, bạn cần một trình biên dịch / trình thông dịch có các ô 32 bit. Tôi chỉ mặc dù rằng nó nên được thêm vào câu trả lời, vì nó cũng là một hành vi dành riêng cho trình biên dịch / trình thông dịch.
Ismael Miguel

1
@IsmaelMiguel Chắc chắn, lưu ý.
Sp3000

8

Java, 158 121 byte

Đã tiết kiệm được 37 byte nhờ 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);}}

Như một phần thưởng, chương trình này có thể xử lý tất cả các ký tự Unicode trong sự tồn tại, bao gồm các ký tự điều khiển nằm ở cuối Mặt phẳng đa ngôn ngữ cơ bản .


3
Huh, cái này rất ngắn đối với mã Java.
Ave

1
Bạn có thể rút ngắn nó thêm 1 byte bằng cách thay thế for(int C=c+1;C>0;C--)bằngfor(int C=c+2;--C>0;)
Kevin Cruijssen

2
Hoặc thậm chí ngắn hơn ( 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

Chà, cứ biến nó thành lambda hoặc một phương pháp
Leaky Nun

2
Wow, sử dụng một interfacecho các publicphương thức mặc định . Thật thông minh.
Justin

7

Perl, 16 byte

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

+1 byte cho -pcờ.

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 byte

concat.zipWith replicate[1..]

Ví dụ sử dụng: concat.zipWith replicate[1..] $ "SKype"-> "SKKyyyppppeeeee".

replicate n ctạo n bản sao của c và concattạo một danh sách trong số tất cả các danh sách phụ.


id=<<là một liên lạc tốt đẹp. :)
sudee

Tôi chỉ muốn thử nó, nhưng việc gán f = id=<<zipWith replicate[1..](trong một tệp) đã dẫn đến một lỗi xấu, bạn có thể nói tôi đang làm gì sai không?
flawr

Không nên gán hàm này (chưa được đặt tên, phải không?) Cho một tên, sao cho chúng ta có thể sử dụng nó làm hàm? Ý tôi là nếu nó là một chức năng, thì (id=<<zipWith replicate[1..] ) "SKype"vẫn nên làm việc? Nếu không, tôi sẽ coi nó như một đoạn trích . Các chương trình đầy đủ mà bạn cung cấp không có "Skype" hardcoded.
flawr

Tôi muốn nói nếu bạn không thể sử dụng nó như bất kỳ chức năng nào khác, thì đó không phải là chức năng. Ví dụ :t, không coi id=<<zipWith replicate[1..]là một chức năng (nó chỉ đưa ra một lỗi) tuy nhiên (id=<<).zipWith replicate[1..]được coi là một chức năng. Tôi muốn nói rằng cái đầu tiên chỉ là một snipped, nó chỉ hoạt động nếu bạn mã hóa đầu vào, nhưng cái thứ hai mà bạn vừa đăng là một chức năng (và :tđồng ý), bạn có đồng ý không?
flawr

Tuyệt! Nếu bạn không đồng ý với "định nghĩa" của tôi, tôi nghĩ chúng ta nên bắt đầu một bài đăng meta để làm rõ điều này. Trong thời gian đó, tôi đang cố gắng tìm một số người haskellian khác cho ý kiến ​​của họ về điều này, vì đây chỉ là quan điểm của tôi .
flawr

7

CJam, 9 8 7 byte

Cảm ơn jimmy23013 vì đã tiết kiệm 1 byte.

Sl+eee~

Kiểm tra nó ở đây.

Giải trình

Sử dụng LobbYví dụ:

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

6

Python, 39 byte

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

Kiểm tra nó trên Ideone .


5

Javascript ES6, 39 byte

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

Cùng chiều dài, nhưng thú vị hơn:

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

Đoạn giới thiệu đoạn trích:

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>


Lỗi nhỏ, chương trình không hỗ trợ các khoảng trắng, được yêu cầu dưới dạng đệ trình (kiểm tra OP).
Mario Ishac

@MarDev Tôi đã thay đổi đoạn mã để sử dụng <pre>thay vì <div>, điều đó sẽ giúp ích.
Neil

1
@Neil Ah, do đó, kết quả đã được tính toán chính xác, nhưng đầu ra được hiển thị không chính xác bởi HTML. Quên rằng <div> làm điều đó.
Mario Ishac

... "Và đưa ra kết quả"
tiêu

1
@spender return là một dạng đầu ra hợp lệ cho các hàm
cat

4

APL (8)

{⍵/⍨⍳⍴⍵}

I E:

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

Giải trình:

  • ⍴⍵: chiều dài của vectơ đã cho
  • : số 1..N
  • ⍵/⍨: sao chép từng phần tử trong N lần.

4

MATLAB, 45 byte

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

Giải thích: Chìa khóa là hankel, tạo ra ma trận Hankel của một vectơ đã cho. Từ ma trận này, chúng ta có thể trích xuất một vectơ chỉ mục, xác định ký tự nào của chuỗi ở vị trí nào trong đầu ra. Ví dụ: hankel(1:4)tạo ra ma trận sau:

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

Từ ma trận này, chúng ta có thể ngoại trừ vectơ 1,2,2,3,3,3,4,4,4,4,4. Vectơ này cho phép chúng ta xuất ký tự đầu tiên của chuỗi một lần , ký tự thứ hai hai lần, v.v.


4

NARS2000 , 6 ký tự = 12 byte

⍳∘⍴/⊙⊢

⍳∘⍴liệt kê đối số ... (chỉ số độ dài của nó)
/⊙sao chép các phần tử của ...
đối số chưa sửa đổi


liên kết đến thông dịch viên?
mèo

@cat Xem chỉnh sửa (trong tiêu đề).
Adám

@cat Chỉnh sửa của bạn là gì?
Adám

Giống hệt với nhân vật của bạn, bởi vì tôi đã tự mình googled nó và bản chỉnh sửa của tôi mất 10 phút để gửi
mèo

Ngoài ra, trong codepage này là 6 byte?
con mèo

3

PowerShell v2 +, 36 byte

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

Đưa đầu vào $args[0], rõ ràng biến nó thành một charmảng, gửi nó vào một vòng lặp |%{...}. Mỗi lần lặp chúng ta lấy chữ cái / ký tự hiện tại "$_"và sử dụng *toán tử quá tải để nối chuỗi $ilần tăng trước . Kết quả của mỗi lần lặp vòng lặp được gói gọn trong parens để tạo thành một mảng và sau đó -joined lại với nhau để tạo thành một chuỗi. Chuỗi đó được để lại trên đường ống và đầu ra là ẩn.

Ví dụ

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 byte

:ImC,0:Ie,Cw\

Điều này in kết quả đến STDOUT.

Giải trình

Đây là một ví dụ tốt về khai thác quay lui để lặp.

: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 byte

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

Tạo một hàm ẩn danh anscó thể được gọi bằng cách sử dụngans('stringtoelacticize')


Phiên bản nào bạn đang sử dụng? Không thể tìm thấy repelemtrong phiên bản (tương đối cũ) của tôi = (
flawr

1
@flawr repelemđược giới thiệu vào R2015a
Luis Mendo


3

Perl 6 ,  22 20  19 byte

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

Giải trình:

{          # 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 byte

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

Gọi như một chức năng người dùng trong bảng tính.

= e (A1)

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

Nó cắt bớt nếu bạn cung cấp cho đầu ra của chính nó một vài lần :-).


2
Chào mừng đến với trang web! =)
DJMcMayhem

3

PHP, 68 byte

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

Xin chào, và chào mừng đến với PPCG! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ

Bạn có thể lấy nó xuống còn 47 byte : for(;$a=$argv[1][$i++];)echo str_repeat($a,$i);.
insertusernamehere

3

Javascript ES6, 42 41 byte

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

Ví dụ chạy:

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

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

Cùng chiều dài: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, thật thông minh, cảm ơn!
Dendrobium

3

Võng mạc , 22 byte

Số lượng byte giả định mã hóa ISO 8859-1.

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

Hãy thử trực tuyến!

Về cơ bản, chúng tôi chèn đúng số lượng ·giữ chỗ giữa các ký tự (vì các ký tự ASCII mở rộng này không thể xuất hiện trong đầu vào), sau đó điền chúng với ký tự liền kề trong giai đoạn thứ hai.


3

R , 83 50 byte

-23 Cảm ơn Giuseppe, mặc dù về cơ bản anh ấy đã sử dụng toàn bộ một phương pháp mới

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

Bài viết gốc của tôi:

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

Hãy thử trực tuyến!

Tôi cảm thấy như chắc chắn có một cách tốt hơn để làm điều này, nhưng với kiến ​​thức mới của tôi về một vài chức năng trong R, đây là cách tiếp cận của tôi.


1
Không phải là một mẹo chơi gôn, nhưng đầu ra liên kết mã của bạn đã bị rối tung. Đây
Robert S.

Ah tôi thấy. Tôi chưa quen với TIO, vì vậy tôi không hiểu lắm về phần đầu trang / chân trang. Cảm ơn bạn!
Sumner18


1
Rất đẹp! Tuy nhiên, sử dụng repvà lập luận collapse=""để pastelà ngắn hơn, và utf8ToIntngắn vẫn còn! TIO
Giuseppe

2

Trên thực tế, 7 byte

' +ñ♂πΣ

Hãy thử trực tuyến!

Giải trình:

' +ñ♂πΣ
' +      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 byte

Cảm ơn mego đã lưu một byte với -~ithủ thuật.

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

Điều này chủ yếu là tự giải thích. Một điều cho những người không thành thạo Python: *Toán tử bị quá tải để hoạt động như xtoán tử của Perl , lặp lại đối số chuỗi của nó số lần được chỉ định bởi đối số số của nó. Ví dụ'foo' * 3 == 'foofoofoo'


c*-~ingắn hơn c*(i+1).
Mego

2

C #, 81 byte

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

bạn có thể lưu 1 byte bằng cách thay đổi vào một vòng lặp foreach, ví dụ:foreach(var a in s)Console.Write(new C(a,1*i++));
Abbath

nhưng nếu đó là một thông báo thì chúng ta không có biến i nên bạn cần khai báo nó.
ScifiDeath

Có vẻ như bạn đang thiếu một using Systemhoặc một System.ở phía trước Console.
Martin Ender

@ScifiDeath Điều đó đúng - nhưng kết quả cuối cùng vẫn ngắn hơn một byte. Xin lỗi vì đã bỏ qua nó và gây nhầm lẫnint i=1;
Abbath

Cũng ngắn hơn một byte khi sử dụng Linq : void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}. Nhu cầu về một giá trị trả lại (không sử dụng) là xấu mặc dù. Chỉnh sửa: chỉ tìm thấy đoạn trích tương tự trong các câu trả lời khác trở lại.
linac

2

MATL, 5 byte

tn:Y"

Dùng thử trực tuyến

Giải trình

    % 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 byte

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

2

Julia, 34 byte

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

Hãy thử trực tuyến!


Giải pháp của bạn rất tốt Nhưng tôi đã xoay sở để đánh bại nó.
Glen O

Tôi đã thấy. Tôi đã có c%n="$c"^n;~s=join([s[r=1:end]...].%r), nhưng điều đó thực sự lâu hơn. splitlà mảnh ghép còn thiếu của câu đố.
Dennis

2

TSQL, 97 byte

Chơi gôn

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

Ung dung:

DECLARE @x varchar(max)='Lobby'

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

PRINT @x

Dùng thử trực tuyến

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.