문자열 복제기


15

빔에서 숫자로 이전하여 명령을 반복 할 수 있습니다와 같은 3dd동일합니다 dd dd dd. 이 반복 패턴은 Vim 명령에만 국한되지 않습니다. 이런 식으로 문자열도 복제 할 수 있습니다.

사양:

숫자, 알파벳 문자 (대문자 및 소문자) 및 공백으로 구성되고 선택적으로 후행 줄 바꿈이 입력으로 제공되면 다음 작업을 수행하는 프로그램을 작성하십시오.

  • 각 "단어"는 숫자와 알파벳으로 구성됩니다. 문자 앞에 숫자가 있으면 (숫자에 두 자리 이상의 숫자가 있거나 숫자가 0 인 경우) 주어진 시간 동안 해당 문자를 반복하십시오. 예를 들면 다음과 같습니다.

    a2bc -> abbc
    3xx1yz -> xxxxyz
    10ab0c0d0e -> aaaaaaaaaab # No 'cde' because there's a zero
    2A2a2A2a -> AAaaAAaa
    
  • 단어는 공백으로 구분됩니다. 인접한 두 단어 사이에 최대 하나의 공백이 있습니다.

쉬워요? 추가 사항은 다음과 같습니다.

  • 공백 앞에 숫자가 있으면 주어진 시간에 대해 다음 단어를 반복하십시오. 숫자는 항상 이전 단어의 끝에 또는 문자열의 시작 부분에 첨부됩니다. 예:

    a2bc3 2d -> abbc dd dd dd
    3 3a -> aaa aaa aaa
    33a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    0 abcd0 efgh3 2x -> xx xx xx
    a3 0xc b -> a c c c b
    
  • 빈 단어를 반복해야하는 경우 한 행에 여러 공백을 출력하지 마십시오. 스쿼시 :

    a3 0x2 b -> a b b   # NOT 'a    b b'
    

    다시 말해, 프로그램은 두 개의 공백을 함께 출력해서는 안됩니다.

  • 입력이 비어 있지는 않지만 출력이 비어 있지 않아도됩니다.

    0 3x -> (empty)
    
  • 입력 및 출력은 원하는 방식으로 수행 할 수 있습니다. 인수에서 입력을 받고 리턴 값을 통해 출력하는 함수도 허용됩니다.

    프로그램 인 경우 오류로 종료되어서는 안됩니다 (예 : 리턴 값이 0 임).

  • 숫자는 항상 10 진수이며 숫자 자체가 0이 아닌 경우 0으로 시작하지 않는 한 0으로 시작하지 않습니다. 즉 , 입력 으로 고려 077a하거나 000a제공 할 필요가 없습니다 .

  • 모든 숫자는 2 ^ 31 (2,147,483,648) 미만입니다. 최대 출력 길이는 2 ^ 32 (4,294,967,296) 바이트 미만입니다.

  • 프로그램은 선택적으로 하나의 후행 공간 및 / 또는 하나의 후행 줄 바꿈을 출력 할 수 있습니다. 이러한 공간과 줄 바꿈은 출력의 유효성에 영향을 미치지 않습니다. 올바른 출력이 비어 있어도 공백과 그 뒤에 줄 바꿈이 출력됩니다.

간단히 말해서 유효한 입력은이 정규식과 일치합니다.

([0-9]+ )?([0-9A-Za-z]*[A-Za-z])([0-9]* [0-9A-Za-z]*[A-Za-z])*( ?\n?)

그리고 유효한 출력을 위해 :

([A-Za-z]+)( [A-Za-z]+)*( ?\n?)

샘플 테스트 사례 :

abcdefg -> abcdefg
a3bcd -> abbbcd
a3bbbc -> abbbbbc
3a0b -> aaa
abc 3d -> abc ddd
abc3 d -> abc d d d
5 1x5 1y0 z -> x x x x x y y y y y
a999 0x b -> a b
999 0s -> (empty)
0 999s -> (empty)
0 999s4 t -> t t t t
a3 0xc b -> a c c c b
ABC3 abc -> ABC abc abc abc

이것은 이므로 각 언어에서 가장 짧은 바이트 단위의 프로그램이 승리합니다!


3
.... "오류와 함께 프로그램을 종료하면 안됩니다" "입력 목록을 문자 목록으로 제공해서는 안됩니다 ..."특별한 이유가 있습니까? (이미 알고 있듯이) 일반적으로 유연한 I / O 형식을 허용합니다.
user202729

@ user202729 후자를 제거하는 것을 고려하고 있습니다. 프로그램 종료 결과를 위해 유지하고 싶습니다. 편집 : 완료
iBug

1
비슷 합니다.
cole


원래 위의 모든 테스트 사례에서 작동하는 코드가 있었지만 제대로 작동하지 않았기 때문에 a3 0xc b-> 와 같은 테스트를 a c c c b추가해야 한다고 생각 합니다.
브래드 길버트 b2gills

답변:



2

펄 6, 88 바이트

{$_=$^a;s:g/(\d+):(\w)/{$1 x$0||'_'}/;s:g/(\d+)\s([\w& \D]+)/ {$1 xx$0}/;~S:g/_//.words}

그것을 테스트

넓히는:

{ # bare block lambda with placeholder parameter 「$a」

  # store a copy of the argument in 「$_」
  # (shorter than 「-> $_ is copy {…}」)
  $_ = $^a;
  # note that 「$_」 is the default scalar,
  # and many things operate on it by default (like 「s///」)


  # do the character repeats
  s :global
  /

    (\d+)           # repeat count
    :               # don't backtrack (prevents it from matching word repeats)
    (\w)            # character to repeat

  /{

    $1 x $0         # do the repeat

    || '_'          # replace with 「_」 if the repeat was 0 (matched by [\w & \D])
                    # this is so “words” don't get removed yet

  }/;


  # do the word repeats
  s :global
  /

    (\d+)           # repeat count

    \s              # shortest way to match a space

    ([
      \w & \D       # word character and not a digit (doesn't match next repeat)
    ]+)             # match that at least once

  / {               # add a space (as we removed it by matching it)

    $1 xx $0        # list repeat (adds a space between values when stringified)

  }/;


  # the following is the result
  ~                 # stringify (adds spaces between values in a list) # (3)
    S :global /_//  # remove all _ not in-place                        # (1)
    .words          # get a list of words                              # (2)
}

~(…).words조합은 불필요한 공백을 제거하며 "단어"가 제거 될 때 유용합니다.


1

파이썬 2, 286 275 260 257 238 바이트

ovs 덕분에 -19 바이트

def f(s,j=' '.join):exec"s=s.split(%s[-1]):s[i]=s[i][:-1];s[i-1]=j([s[i-1]]*int(w[-1]))\ns=list(j(s[::-1])%s):s[i]='';s[i-1]*=int(w)\nprint j(''.join(s[::-1]).strip().split())"%((')[::-1]\nfor i,w in enumerate(s):\n if str.isdigit(w',)*2)

f 문자열을 인수로 사용하고 형식화 된 문자열을 인쇄합니다.

다음 은 테스트 사례와 함께 제공됩니다.

Ungolfed 코드 :

def f(s, j=' '.join):
    s = s.split()[::-1]
    for i, w in enumerate(s):
        if str.isdigit(w[-1]):
            s[i] = s[i][:-1]
            s[i - 1] = j([s[i - 1]] * int(w[-1]))
    s = list(j(s[::-1]))[::-1]
    for i, w in enumerate(s):
        if str.isdigit(w):
            s[i] = ''
            s[i - 1] *= int(w)
    print j(''.join(s[::-1]).strip().split())

여전히 개선 작업 중입니다.



@ovs 감사합니다. 줄 바꿈을 제거 exec하고 함수에 대한 유일한 줄이므로 줄 바꿈을 생각하지 않았다고 믿을 수 없습니다 .
nog642


0

클린 , 443 ... 306 바이트

import StdEnv,StdLib
^ =last
$n|n>"9"=1=toInt n
?v c| ^v<c=init v=v
q=groupBy
f[a:t]|a<"a"=repeatn($a)(hd t)++f(tl t)|t>[]=[a:f t]=[a," "]
f e=e
@l#[h:t]=[[toString[c:if(c<'1')[]k]\\[c:k]<-q(\a b=max a b<'a')s]\\s<-q(\a b=min a b>' ')l|s>[' ']]
=flatten(map f[?h"a":[?u":"\\u<-t&v<-map^[h:t],_<-[1.. $v]]])

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


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