단어를 스트레칭


50

입력은 공백으로 분리되지 않은 소문자의 단어입니다. 마지막 줄 바꿈은 선택 사항입니다.

동일한 단어가 수정 된 버전으로 출력되어야합니다. 각 문자에 대해 원래 단어에서 두 번째로 나타날 때 두 배로, 세 번째로 세 번 등으로 두 배로합니다.

입력 예 :

bonobo

출력 예 :

bonoobbooo

표준 I / O 규칙이 적용됩니다. 바이트 단위의 가장 짧은 코드가 이깁니다.

@Neil에서 제공하는 테스트 :

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

답변:


36

젤리 , 4 바이트

;\f"

온라인으로 사용해보십시오!

작동 원리

;\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
그럼 ... 피스를 찢어
Adnan

2
이 사이트는 최고의 범용 골프 언어를위한 경쟁이되고 있습니다. 그것은 나쁜 것이 아닙니다.
Shelvacu

8
@shelvacu 후자는 논쟁의 여지가 있으며, PPCG에게 첫 번째 인상으로 "모든 최고의 답변은 골프 언어를 사용하고 있습니다."
Insane

@ 미쳤어 요 /있다. 코드 골프는 꽤 흔한 일입니다. 따라서 언어는 독점적으로 그 목적을 위해 모입니다.
Evan Carslake

이것은 어떻게 작동합니까?
Outgolfer Erik

21

Pyth, 6 바이트

1 바이트를 이륙 한 @Doorknob 에게 감사드립니다 .

5 바이트를 이륙 한 @Maltysen 에게 감사 합니다.

s@VQ._

온라인으로 사용해보십시오!

작동 원리


예를 들어, 문자열을 사용하십시오 "bonobo".

._ 목록을 만듭니다. ['b', 'bo', 'bon', 'bono', 'bonob', 'bonobo']

VQ._"이전 함수 벡터화 (병렬로 적용) " Q._" Q(평가 된 입력)가 목록으로 처리됨 을 의미 합니다. ['b', 'o', 'n', 'o', 'b', 'o']그러면 다음 @과 같이 쌍이됩니다 .

     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'

따라서을 @VQ._생성 ['b', 'o', 'n', 'oo', 'bb', 'ooo']합니다.

그런 s다음 그것들을 모두 결합하여 문자열을 만들고 'bonoobbooo'암시 적으로 출력되도록 bonoobbooo합니다.


2
케니, 네 설명이 틀렸어 함수 안에 있지 않을 VQ때만 의미 for N in Q합니다. 이 경우, 무엇을 실제로 일어나고 것은 즉 @V수단 @은 다음 두 개의 인수를 통해 (병렬로 적용) 벡터화 기능을 Q하고 ._. 이것은 문서에서 누락되었으므로 수정하겠습니다.
isaacg

14

망막 , 34 19 바이트

isaacg의 솔루션에서 영감을 얻어 15 바이트를 절약했습니다.

바이트 수는 ISO 8859-1 인코딩을 가정합니다.


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

선행 및 후행 빈 줄이 중요합니다.

온라인으로 사용해보십시오!

설명


$`¶

이것은 빈 정규식 (즉, 문자열의 모든 너비가 0 인 위치)과 일치하는 대체 단계이며이를 대체 $`¶합니다. 여기서 $`일치 접두어 는 줄 바꿈을 삽입합니다. 기본적으로 모든 접두사를 계산하고 해당 접두사의 마지막 문자와 함께 별도의 줄에 배치합니다.

bb
obo
oboo
kbook
kbookk
ebookke
ebookkee
pbookkeep
ebookkeepe
rbookkeeper

선행 및 후행 줄 바꿈이 있지만 무시할 수 있습니다.

이 접두사 각각에서 마지막 문자와 같은 문자를 유지하려고합니다. 이를 위해 다른 교체 단계를 사용합니다.

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

이것은 우리 유지하고 싶지 않은 것과 일치하고 아무것도 아닌 것으로 대체합니다. \D입력에 숫자가 없다는 것을 알고 있기 때문에 모든 문자를 일치 시킨 다음 줄 끝에 해당 문자의 다른 사본 없는지 확인하십시오 .


11

파이썬, 56 바이트

나는 같은 길이의 두 가지 대답에 갇혀있는 것처럼 보입니다.

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)

편집 : 더 짧은 대안적인 파이썬 접근법에 대해서는 @pacholik의 답변 을 참조하십시오 .


나는 내> <> 답변으로 당신을 때리는 데 익숙하지 않습니다. 나는 그것을 고치기 위해 Gol> <> 답변을 기다리고 있습니다.)
Aaron

너무 나쁜 @Aaron, 사실은 당신이 이길 거라고 다시 와> <> : P
SP3000

파이썬에서 라인 노이즈? 무슨 이단 !
cat

무엇을합니까? 비트 단위로 부정이 아니라는 것을 알고 있지만 몇 바이트를 절약하기 위해 무엇을하려고합니까?
Nic Hartley

2
@QPaysTaxes 파렌이 +1필요하지 않도록 충분히 높은 우선 순위로 증가 합니다
Sp3000

10

하스켈, 39 바이트

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

사용 예 : f "bonobo"-> "bonoobbooo".

@Damien의 답변과 는 다릅니다 . 문자열에서 마지막 문자를 모두 추출하고 마지막 문자를 제외한 모든 문자를 재귀 호출 앞에 추가하여 오른쪽에서 문자열을 작성합니다.


9

> <> , 27 바이트

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

코드 포인트 -1을 인쇄하려고 할 때 오류와 함께 종료되는 공식 인터프리터가 필요합니다. 온라인으로 사용해보십시오!

이 코드는 한 번에 하나의 문자를 읽고 코드 상자의 첫 번째 행을 각 배열이 지금까지 본 횟수를 저장하는 큰 배열로 사용합니다 (> <>는 비 프로그램 셀을 0으로 초기화합니다). 두 번째 행은 문자를 여러 번 출력하기위한 루프입니다.

또는 다음은 깔끔하게 종료되는 버전입니다 (37 바이트, 제대로 골프되지 않음).

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

젠장, 좋아! 나는 온라인 통역사에 크게 의존하지 말아야한다. 나는 단순히 그러한 거대한 코드 박스를 사용하는 것에 대해 전혀 생각하지 않았을 것이다. 그리고 공식 통역사가 -1 인쇄로 끝나는 것을 몰랐다.
Aaron

2
@Aaron 그래, 할 때 파이썬 오류의 추론이다 chr(-1). 애니메이션 인터프리터는 시각화에 적합하지만 불행히도 공식 인터프리터와의 일부 불일치는 약간 성가시다 : /
Sp3000

9

자바 스크립트 (ES6), 48 45 바이트

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

편집 : @ user81655 덕분에 3 바이트가 절약되었습니다.


8

하스켈, 50 42 41 바이트

Lynn 덕분에 8 바이트 절약

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

1
어떻습니까 :f t=[c|(i,c)<-zip[0..]t,j<-[0..i],c==t!!j]
Lynn

8

MATL , 8 바이트

tt!=RsY"

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 한 번에 확인하십시오 .

설명

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

미로 , 54 25 바이트

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

실제로 한 @의 MartinBüttner, 또 다른도 공동 대부분 이 하나 거의 골프의 모든. 알고리즘을 개선하여 프로그램 크기를 약간 줄였습니다!

온라인으로 사용해보십시오!

설명

빠른 랩 린스 프라이머 :

  • Labyrinth는 스택 기반 2D 언어입니다. 주 스택과 보조 스택의 두 스택이 있으며 빈 스택에서 터지는 경우 0이됩니다.

  • 명령 포인터가 아래로 이동할 여러 경로가있는 각 접점에서 메인 스택의 상단을 확인하여 다음에 어디로 가야하는지 확인합니다. 음수는 좌회전, 0은 직진, 양수는 우회전입니다.

임의 정밀도 정수의 두 스택은 메모리 옵션 측면에서 유연성이별로 없습니다. 카운팅을 수행하기 위해이 프로그램은 실제로 두 스택을 테이프로 사용하며 한 스택에서 다른 스택으로 값을 이동 시키면 메모리 포인터가 셀에 의해 왼쪽 / 오른쪽으로 이동합니다. 우리와 함께 루프 카운터를 드래그해야하기 때문에 그렇게하는 것은 아닙니다.

여기에 이미지 설명을 입력하십시오

첫째, 오프 <>양쪽 끝에서는 오프셋 팝업 멀리 왼쪽 또는 오른쪽 중 하나 오프셋 코드의 행을 돌립니다. 이 메커니즘은 코드를 루프에서 실행하는 데 사용됩니다. <팝은 0이고 현재 행은 왼쪽으로 회전하여 IP를 코드 오른쪽에 놓고 >팝은 다른 0을 돌려 행을 수정합니다.

위의 다이어그램과 관련하여 각 반복 작업은 다음과 같습니다.

[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

펄, 17

(16 바이트 코드, -p의 경우 +1)

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

용법:

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

7

Pyth, 7 바이트

s@Led._

테스트 스위트

DenkerAffe 덕분에 테스트 스위트

설명:

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.

6

파이썬 3, 52

def f(s):*s,x=s;return s and f(s)+x+x*s.count(x)or x

4
아, 끝에서가는 것이 훨씬 더 의미가 있습니다! 구체적으로 파이썬 3이 필요없이 람다에서이 작업을 더 짧게 할 수 있습니다.f=lambda s:s and f(s[:-1])+s[-1]*s.count(s[-1])
Sp3000

나는 그렇게 할 수 있었지만. 그러나 저는 파이썬에서 첨자를 좋아하지 않습니다 : P
pacholik

5

PowerShell v2 +, 52 47 바이트

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

빈 해시 테이블을 생성하여에 저장합니다 $b. 이것은 우리가 본 편지의 "카운터"입니다. 그런 다음 input을 가져 와서 $args[0]char-array로 캐스팅하고 루프를 통해 보냅니다. 각 반복마다 현재 문자를 가져 와서 "$_"주어진 값에서 사전 증분 카운터에 곱하면 첫 번째 발생에 1, 두 번째 등 이 곱해 2집니다. 우리는 -join그것을 한 단어로 출력하도록 캡슐화합니다 .

TessellatingHeckler 덕분에 배열 대신 해시 테이블을 사용하여 5 바이트를 절약 97할 수 있으므로 적절한 색인에 도달하기 위해 ASCII 문자를 줄일 필요가 없었습니다 . .Add()해시 테이블을 변경할 수 있기 때문에 해시 인덱스를 사전 증분 하면 해당 인덱스가 존재하지 않는 경우 암시 적으로 백그라운드에서 호출하기 때문에 작동합니다 .

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

@TessellatingHeckler Indeed-감사합니다!
AdmBorkBork

5

Dyalog APL , 6 바이트

∊,\∩¨⊢

TryAPL!

4 가지 기능은 포크 (3 트레인)의 꼭대기 (2 트레인)입니다.

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

주어진 문자열에서 먼저 (오른쪽 – no-op)'bonobo'

그런 다음 ,\문자열에서 (연쇄 스캔)'b' 'bo' 'bon' 'bono' 'bonob' 'bonobo'

두가 (우측으로 주어와 인수를 왼쪽)과 함께 두 갈래된다 ∩¨(교차 각), 즉 ('b'∩'b') ('bo'∩'o') ('bon'∩'n') ('bono'∩'o') ('bonob'∩'b') ('bonobo'∩'o'), 어느'b' 'o' 'n' 'oo' 'bb' 'ooo'

마지막으로 (들)이 결과에 적용되어 평평하게됩니다.'bonoobbooo'

이봐, 적어도 Pyth 와 일치 ! 분명히 젤리 가 차례로 APL의 고급 2 문자 당 기능 방언 J의 골프 버전으로 짧습니다.


4

Pyth, 11 바이트

s.e*b/<Qhkb

여기 사용해보십시오!

설명

se * b / <Qhkb # Q = 입력

 .e # b를 값으로, k를 인덱스로 사용하여 입력을 매핑합니다 (Q는 암묵적으로 끝에 추가됩니다)
      <Qhk # Q의 첫 k + 1 문자를 가져옵니다
     / b # 거기에 b의 발생 횟수
   * b # 반복 여러 번 b
s # 결과 목록을 하나의 문자열로 결합

4

J, 11 바이트

#~+/@(={:)\

이것은 동사입니다. 여기에서 시도하십시오. 용법:

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

설명

#~+/@(={:)\
     (   )\  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 바이트

암호:

$vy«Dy¢y×?

설명:

$           # 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 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


3

CJam, 14

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

온라인으로 사용해보십시오

설명:

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

펄 6, 37 바이트

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

2

> <> , 52 바이트

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

읽은 모든 문자를 쌓아 스택에있는 모든 비슷한 문자에 대해 한 번씩 인쇄합니다.
그것은&스택에서 3 개의 변수 (현재 읽은 문자, 스택의 위치,이 위치의 문자)를 처리해야하기 때문에 레지스터를 .

여기서 시도해보십시오 !


2

녹, 176 바이트

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

이것은 맵을 사용하여 입력의 모든 문자에 대한 문자열을 저장합니다. 각 문자에 대해 문자열이 맵에서 제거되고 문자와 연결되어 다시 맵에 삽입되어 출력에 추가됩니다.

get(...)대신에 사용 remove(...)하고 싶었지만 빌린 체커가 마음을 바꿨습니다.


2

Mathcad, 66 바이트

불행히도 Mathcad는 특히 문자열 처리가 좋지 않으므로 입력 문자열을 벡터로 변환 한 다음 (문자 코드 색인) 벡터를 사용하여 문자가 발견되는 횟수를 추적하여 문자를 추가합니다. 결과 벡터에 대한 횟수 마지막으로 결과 벡터가 다시 문자열로 변환됩니다. 불행히도 상당히 길다.

여기에 이미지 설명을 입력하십시오

Mathcad는 일반 텍스트와 연산자가 혼합 된 2D "화이트 보드"인터페이스를 사용합니다. 연산자는 일반적으로 툴바 또는 키보드 단축키를 통해 입력됩니다. 예를 들어, ctl- #은 for 루프 연산자를 입력합니다. for 루프 연산자는 각각 반복 변수, 범위 및 본문 표현식에 대해 키워드 for 요소 및 3 개의 빈 "자리 표시 자"로 구성됩니다. 입력 [변수 이름이 배열 인덱스 모드에 들어간 후, 입력 '은 일치하는 괄호 쌍을 입력합니다 ( 주로 ... 주변 표현식에 무엇이 있는지에 따라 예외가 있습니다 )


2

자바 스크립트 ES6 44 바이트

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

오래된 대답

자바 스크립트 ES6 46 바이트

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

//thanks user81655 for -1 byte

1
x입력 배열 로 이동 하여 바이트를 절약 할 수 있습니다 .->q=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``
user81655

2

줄리아, 38 35 바이트

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

I / O는 문자 배열에서 시작됩니다. 온라인으로 사용해보십시오!

작동 원리

우리는 monadic 연산자를 재정의합니다 ! 우리의 목적을 위해.

언제 ! 호출되면 인수 s 가 비어 있는지 확인합니다 . 그렇다면 인수를 반환합니다.

경우 의가 비어 있지 않은, 우리는 교차 마지막 문자 (과 s[end]에서 해당 문자의 모든 항목 산출) . 이 결과는 ! 에 대한 재귀 호출의 반환 값과 연결됩니다 . 마이너스의 마지막 문자 ( s[1:end-1]인수).


2

PHP, 54 51 50 47 바이트

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

다음과 같이 실행하십시오.

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

조정

  • 변수 변수를 사용하여 3 바이트를 절약했습니다. 충돌을 방지하기 위해 사용 된 변수를 대문자로 변경
  • 문자열 오프셋이 어쨌든 int로 캐스팅되므로 문자열 오프셋 nullint대한 유형 캐스트 를 제거하여 바이트를 저장했습니다.
  • (thx Titus) $argn대신 3 바이트를 절약했습니다.$argv

3 바이트를 더 절약 하려면 $argnwith -R를 사용하십시오 .
Titus

아, 그리고 -n당신과 똑같이해야합니다 -d error_reporting: n은 약자이며 no config file기본 구성에서는 통지가 꺼져 있습니다. 따라서 -nr(각각 -nR) 충분합니다.
Titus

@Titus 2 살 대답하지만, THX 어쨌든 :)
aross

1

매스 매 티카, 57 바이트

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

우리가 사용하는 c[x]캐릭터가 얼마나 자주의 조회 테이블로 x이미 발생했습니다. 에서 검색 할 때마다 증가합니다 x~StringRepeat~++c[x]. 불행히도, 함수를 재사용 할 수있게하려면마다 룩업 테이블을 재설정해야합니다 Clear@c;c@_=0;.


1

awk, 72 바이트

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

아이디어는 나타나는 문자의 개수를 연관 배열에 저장하고이 횟수만큼 문자를 인쇄하는 것입니다.


1

빔, 32 33 42 바이트

이것은 더 작아야했지만 메모리 슬롯을 0으로 초기화하는 바이트를 잃었습니다. 흐름 방향을 바꾸면 많은 빈 공간이 제거되었습니다.

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

이 스 니펫에서 사용해보십시오

일반적인 설명.

  • 모든 메모리 슬롯을 0-255에서 0으로 설정
  • 입력 ASCII 값을 빔으로 읽습니다.
  • 빔이 0으로 정지 된 경우 (빔 = 저장)
  • 메모리 [빔] 값을 저장소로 가져 와서 증가시키고 다시 저장하십시오.
  • 빔 문자를 인쇄하여 상점을 0으로 줄입니다.
  • 반복

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