문자열을 탄력있게하는 프로그램 작성


33

제목에 멋진 동사가 있습니다.

입력 문자열을 제공하는 프로그램을 작성하면이 문자열을 "탄력 화"하고 결과를 출력합니다. 문자열 탄력 화는 다음과 같이 수행됩니다.

첫 번째 문자가 한 번 표시됩니다. 두 번째 문자가 두 번 표시됩니다. 세 번째 문자는 세 번 표시됩니다.

보다시피, 특정 문자의 복제 량은 문자열에서 이전에 나타나는 것과 반대로 문자의 인덱스와 관련이 있습니다.

인쇄 가능한 ASCII 문자 만 수신 할 수 있습니다. 다음 링크 를 기준으로이 문자는 32-126의 10 진수 값을 갖습니다.

예 :

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (첫 번째 b가 3 번 표시되고 두 번째 b가 4 번 표시되어 총 7b가 생성되므로 7b가 어떻게 표시되는지 유의하십시오).

A and B: A aaannnnddddd BBBBBBB

최단 바이트 승리 :)


2
"공백 문자 이외의 공백은 지원할 필요가 없습니다"라는 의견에 동의하지 않는 것 같습니다. 그러면 출력이 입력과 같아야합니까? (두 글자로 된 단어?) 또한 사람들에게 게시하기 전에 피드백을 제공하는 데 어려움을 겪을 수 있는 샌드 박스 라는 멋진 장소가 있습니다.
FryAmTheEggman 2016 년

FryAmTheEggman 귀하의 가정은 유효합니다. @TimmyD 나는 어디에서 확실하지 않은지 알고, FryAmTheEggman이 게시 한 예에서 볼 수 있듯이 여러 공백으로 구분 된 문자열로 끝날 수 있습니다.
Mario Ishac

가장 짧은 코드가 이길 것이라고 가정합니까? ;)
Adnan 2016 년

@Adnan Yep, 다른 언어와 달리 특정 언어가 골프 목적으로 만들어지기 때문에 단축 프로그램으로 답을 표시해야하는지 확실하지 않습니다.
Mario Ishac 2016 년

2
관련 : 1 , 2
Sp3000

답변:


34

젤리 , 3 바이트

암호:

ĖP€

설명:

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

젤리 인코딩을 사용합니다 .온라인으로 사용해보십시오! .


16
파이썬 *이 문자열 곱셈을 한다는 사실을 남용 합니다. 그것은 실제로 의도 된 것은 아니지만 작동합니다.
Dennis

1
@ 데니스 : 어느 *? 전체 답변에는 그런 것이 없습니다.
Thomas Weller

10
@Thomas : Jelly는 Python으로 작성되었으며 Jelly P명령은 Python *연산자를 사용하여 배후에서 제품을 계산 합니다. 이 게시물은 실제로 파이썬에있는 기본 코드의 누출 추상화를 남용하므로 P문자열에서 (제품) 명령을 수행하면 예상대로 작동합니다.
mellamokb

16

J, 4 바이트

#~#\

용법

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

설명

#~#\  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 바이트

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

매우 간단한 구현으로 각 입력 문자마다 메모리 공간을 1 씩 이동합니다. EOF에 0을 제공하는 인터프리터와 255 자보다 긴 입력에 대해 32 비트 / 임의 정밀 셀이 필요합니다.

온라인으로 사용해보십시오! (참고 : TIO는 8 비트 셀을 사용합니다)


1
또한 255자를 초과하는 문자열에는 작동하지 않는다고 생각합니다.
Ismael Miguel

문제의 인터프리터가 임의 정밀도의 정수가 있는지 여부에 따라 달라집니다 (하지만 실제로, 대부분의 구현을 위해, 그것은 255에 모자 것) 그 @IsmaelMiguel
SP3000

컨벤션은 8 비트를 사용하는 것입니다. 1 자입니다. 그러나 일부는 실제로 32 비트 숫자로 구현 될 수 있습니다. EOF를 0으로 지정해야하므로 (컴파일러 / 인터프리터 특정 동작) 255 자보다 긴 문자열의 경우 32 비트 셀이있는 컴파일러 / 인터프리터가 필요합니다. 컴파일러 / 인터프리터 관련 동작이기도하기 때문에 답변에 추가해야한다고 생각합니다.
Ismael Miguel

1
@IsmaelMiguel 물론입니다.
Sp3000

8

자바, 158 바이트

Kevin Cruijssen 덕분에 무려 37 바이트가 절약되었습니다 !

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

보너스로,이 프로그램 은 Basic Multilingual Plane의 맨 끝에 위치한 제어 문자를 포함 하여 존재하는 모든 유니 코드 문자를 처리 할 수 ​​있습니다 .


3
허, 이것은 자바 코드에있어서 매우 짧다.
Ave

1
for(int C=c+1;C>0;C--)for(int C=c+2;--C>0;)
Kevin Cruijssen

2
심지어 짧은 ( 121 바이트 )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);}}
케빈 Cruijssen

글쎄, 그냥 람다 또는 방법을 만드십시오
Leaky Nun

2
와우, interface기본 public방법 으로 사용합니다. 똑똑합니다.
Justin

7

펄, 16 바이트

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

-p플래그의 경우 +1 바이트

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

하스켈, 29 바이트

concat.zipWith replicate[1..]

사용 예 : concat.zipWith replicate[1..] $ "SKype" -> "SKKyyyppppeeeee".

replicate n cc의 n 개의 복사본을 concat만들고 모든 하위 목록에서 단일 목록을 만듭니다.


id=<<좋은 터치입니다. :)
sudee

방금 시도하고 싶었지만 f = id=<<zipWith replicate[1..](파일로) 할당 하면 못생긴 오류가 발생했습니다. 내가 잘못한 것을 말할 수 있습니까?
flawr

이 (이름없는, 맞습니까?) 기능을 이름에 할당하여 함수로 사용할 수 없습니까? 그것이 기능 (id=<<zipWith replicate[1..] ) "SKype"이라면 여전히 작동해야합니까? 그렇지 않으면 스 니펫 으로 간주합니다 . 제공 한 전체 프로그램에 "SKype"하드 코드가 있습니다.
flawr

다른 기능처럼 사용할 수 없다면 기능이 아닙니다. 예를 들어 함수로 :t간주되지 않지만 id=<<zipWith replicate[1..](오류 만 발생) (id=<<).zipWith replicate[1..]함수로 간주됩니다. 첫 번째는 입력이 하드 코딩 된 경우 작동하지만, 단지 postet 인 두 번째 기능은 함수이며 :t동의한다고 말하고 싶습니다.
flawr

큰 확인! 내 "정의"에 동의하지 않으면이를 정리하기위한 메타 게시물을 시작해야한다고 생각합니다. 그 동안 나는 단지 견해 이기 때문에 이것에 대한 그들의 의견에 대해 다른 하스켈 리안을 찾으려고 노력하고 있습니다.
flawr

7

CJam, 9 8 7 바이트

1 바이트를 저장해 준 jimmy23013에게 감사합니다.

Sl+eee~

여기에서 테스트하십시오.

설명

LobbY예제를 사용하여 :

                                      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

자바 스크립트 ES6, 39 바이트

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

길이는 같지만 더 재미 있습니다.

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

스 니펫 데모 :

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>


작은 오류, 프로그램은 제출에 필요한 공백을 지원하지 않습니다 (OP 확인).
Mario Ishac 2016 년

@MarDev 나는 <pre>대신 스 니펫을 사용하도록 변경했다 <div>.
Neil

1
@Neil Ah, 결과가 올바르게 계산되었지만 HTML에 의해 출력이 잘못 렌더링되었습니다. <div>가 그 일을 잊어 버렸습니다.
Mario Ishac

... " 결과를 출력 "
지출 자

1
@spender returning은 함수에 대한 유효한 출력 형식입니다.
cat

4

APL (8)

{⍵/⍨⍳⍴⍵}

즉 :

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

설명:

  • ⍴⍵: 주어진 벡터의 길이
  • : 숫자 1..N
  • ⍵/⍨: 각 요소를 N 번 복제합니다 .

4

MATLAB, 45 바이트

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

설명 : 키는 hankel지정된 벡터의 Hankel 행렬을 생성합니다. 이 행렬에서 인덱스의 벡터를 추출 할 수 있습니다.이 벡터는 문자열의 어떤 문자가 출력에서 ​​어떤 위치에 있는지 정의합니다. 예 hankel(1:4)를 들어 다음 행렬을 생성합니다.

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

이 행렬에서 벡터를 추출 할 수 있습니다 1,2,2,3,3,3,4,4,4,4,4. 이 벡터는 출력 문자열의 첫 번째 문자 우리를 허용 한 번 , 두 번째 두 번


4

NARS2000 , 6 자 = 12 바이트

⍳∘⍴/⊙⊢

⍳∘⍴인수의 열거 ... (길이의 표시) 수정되지 않은 인수
/⊙의 요소를 복제합니다.


통역사 링크?
고양이

@cat 편집을 참조하십시오 (헤더에서).
Adám

@cat 편집 한 내용은 무엇입니까?
Adám

내가 직접 구글 검색했고 편집 내용을 제출하는 데 10 분이 걸렸기 때문에 캐릭터와 동일합니다.
cat

또한이 코드는 어느 코드 페이지에서 6 바이트입니까?
고양이

3

PowerShell v2 +, 36 바이트

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

입력을 취해 $args[0]명시 적으로 char배열 로 캐스트하고이를 루프로 보냅니다 |%{...}. 반복 할 때마다 현재 문자 / 문자 "$_"를 사용하고 *오버로드 된 연산자를 사용하여 미리 증가 된 문자열을 연결합니다 $i. 각 루프 반복의 결과는 parens으로 캡슐화되어 배열을 형성 한 다음 -join함께 연결되어 문자열을 형성합니다. 해당 문자열은 파이프 라인에 남아 있으며 출력은 암시 적입니다.

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 바이트

:ImC,0:Ie,Cw\

결과가에 인쇄됩니다 STDOUT.

설명

이것은 역 추적을 이용하여 반복하는 좋은 예입니다.

: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 바이트

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

다음을 ans사용하여 호출 할 수 있는 익명 함수 를 만듭니다.ans('stringtoelacticize')


어떤 버전을 사용하고 있습니까? repelem내 (상대적으로 오래된) 버전을 찾을 수 없음 = (
flawr

1
@flawr repelem은 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.