중첩 된 숫자 형 문자열 구문 분석


16

작업

문자열 S은 다음 프로세스로 구성됩니다.

  1. 로 시작 S빈 문자열로 .
  2. 어떤 위치에 삽입 S형식의 문자열 ds, d제로가 아닌 숫자이며 s문자열이다 d소문자 ASCII 문자. 우리는 말할 dsA는 구성S .
  3. 2 단계로 이동하거나 중지하십시오.

당신의 임무는 입력과 같은 문자열을 가져 와서 구성 요소를 하나의 문자열로 연결하여 선행 자릿수 순서로 출력하는 것입니다. 출력은 단일 문자열이어야하며 구성 요소 사이에 구분 기호 (줄 바꾸기 포함)는있을 수 없습니다. 입력 및 출력 문자열에 따옴표가 있는지 여부를 선택할 수 있습니다. 입력과 출력은 절대로 비어 있지 않습니다.

위의 과정으로 문자열을 만들어 봅시다. 구성 요소의 구조가 최종 결과에서 강조 표시됩니다.

S = ""              // Insert "3abc"
S = "3abc"          // Insert "2gh" after 'a'
S = "3a2ghbc"       // Insert "1x" before '3'
S = "1x3a2ghbc"     // Insert "3tty" after '3'
S = "1x33ttya2ghbc" // Final result
     └┘│└┴┴┘│└┴┘││
       └────┴───┴┘

출력은 숫자의 순서로 구성 요소를 연결하여 얻습니다. 이 경우 올바른 출력은

"1x3abc3tty2gh"

규칙과 득점

전체 프로그램 또는 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점은 허용되지 않습니다.

테스트 사례

1k -> 1k
4asdf -> 4asdf
111xyz -> 1z1y1x
8whatever3yes -> 8whatever3yes
8what3yesever -> 8whatever3yes
1x33ttya2ghbc -> 1x3abc3tty2gh
63252supernestedstrings2ok -> 6trings3eds2st5perne2su2ok
9long3yes4lo2ngwords11here -> 9longrdsre3yes4lowo2ng1e1h
9abc8de7fg6hi5jk4lm3o2pq1rstuvwxyzabcdefghijklmnopqrst -> 9abcopqrst8deijklmn7fgdefgh6hizabc5jkwxy4lmuv3ost2pq1r

답변:


2

자바 스크립트 (ES6), 68 바이트

f=s=>s&&f(s.replace(/\d\D+$/,m=>(s=m.slice(0,i=++m[0]),m.slice(i))))+s

설명

간단한 개념을 기반으로 :

  • 마지막 숫자 n와 일치n입력 문자열에서 문자를
  • 입력 문자열에서 제거하고 출력 문자열의 시작 부분에 추가하십시오.
  • 입력 문자열이 비워 질 때까지 반복

재귀는 JavaScript에서 가장 짧은 방법이었습니다.

f=s=>
  s&&                        // if the input string is empty, return the empty string
  f(                         // prepend the constituent before it
    s.replace(/\d\D+$/,m=>(  // match the last digit followed by every remaining letter
      s=m.slice(0,n=++m[0]), // set s to the constituent (n followed by n letters)
                             // (we must use s because it is our only local variable)
      m.slice(n)             // replace the match with only the letters after it
    ))
  )+s                        // append the constituent
<input type="text" id="input" value="9long3yes4lo2ngwords11here" />
<button onclick="result.textContent=f(input.value)">Go</button>
<pre id="result"></pre>



0

Python 3 , 173 159 바이트

k='123456789';y='';i=0
for t in x:
 i+=1
 if t in k:
  y+=t;n=int(t);m=0
  for z in x[i:]:
   if n:  
    if z in k:m+=int(z)+1
    if m<1:y+=z;n-=1
    m-=m>0

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

아마도 가장 골치 아픈 파이썬 구현은 아닙니다.

논리는 거의 간단합니다. 문자열을 스캔합니다. 숫자를 찾으면 필요한만큼 (즉, 숫자가 숫자에 해당 할 때까지) 뒤에 오는 문자를 추가하기 시작합니다. 작업을 완료하기 전에 숫자가 발생하면 건너 뛸 문자 수에 해당하는 카운터에 해당 숫자를 추가합니다. 카운터가 0에 도달하면 문자 추가로 돌아갑니다 (예 : 카운트가 초기 숫자에 해당 할 때까지).

참고 : Wheat Wizard 및 HyperNeutrino 덕분에 14 바이트 절약


1
한 줄 if 문의 경우 예를 들어 줄 바꿈이 필요하지 않습니다 if z in k:m+=N(z)+1.
Post Rock Garf Hunter

1
N=int실제로 제거 하면 2 바이트가 절약됩니다. 이름 변경 int은 4 번 사용한 후에 만 ​​유용합니다.
HyperNeutrino

0

자바 8, 152 바이트

s->{String t=s,r="";for(char c;!s.isEmpty();c=t.charAt(0),s=s.replace(t=c+(t.substring(1,c-47)),""),r=t+r)t=s.replaceAll(".*(\\d\\D+$)","$1");return r;}

설명:

여기에서 시도하십시오.

s->{                        // Method with String as both parameter and return-type
  String t=s,               //  Temp-String, starting at the input-String
         r="";              //  Result-String, starting empty
  for(char c;!s.isEmpty();  //  Loop as long as the input-String `s` is not empty
                            //    After every iteration:
      c=t.charAt(0),        //     Get the leading digit from `t` as character
      s=s.replace(t=c+(t.substring(1,c-47))
                            //     Set `t` to the last substring (digit + `c` letters),
                  ,""),     //     and remove that sub-string from String `s`
      r=t+r)                //     And add the substring at the start of result-String `r`
    t=s.replaceAll(".*(\\d\\D+$)","$1");
                            //   Get the last digit + everything after it,
                            //   and set this substring to `t`
                            //  End of loop (implicit / single-line body)
  return r;                 //  Return result-String
}                           // End of method

0

파이썬 (2) , 151 (147) 135 바이트

d,D=[],[]
for c in input():
 if'/'<c<':':x=[[c]];d=x+d;D+=x
 else:y=d[0];y+=c;d=d[len(y)>int(y[0]):]
print''.join(''.join(w)for w in D)

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

설명:

이 코드는 두 개의 구성 그룹 목록을 유지합니다. d and D .

그런 다음 문자열의 각 문자가 스캔됩니다.

  • 숫자 인 경우 새 그룹이 두 목록에 모두 추가됩니다.
  • 그렇지 않으면 캐릭터가 최신 그룹에 추가됩니다. d

그룹과 숫자의 길이가 같으면 그룹이에서 제거됩니다 d.

끝에 D있는 그룹 D은 원래 순서대로 연결되어 있습니다.

예:

Input = '1121xwyzv'
d = [], D = []
Loop each character in the input

c='1'
    d=[[1]], D=[[1]]
c='1'
    d=[[1], [1]], D=[[1], [1]]
c='2'
    d=[[2], [1], [1]], D=[[1], [1], [2]]
c='1'
    d=[[1], [2], [1], [1]], D=[[1], [1], [2], [1]]
c='x'
    d=[[1x], [2], [1], [1]], D=[[1], [1], [2], [1x]]
latest group in d is full:
    d=[[2], [1], [1]], D=[[1], [1], [2], [1x]]
c='w'
    d=[[2w], [1], [1]], D=[[1], [1], [2w], [1x]]
c='y'
    d=[[2wy], [1], [1]], D=[[1], [1], [2wy], [1x]]
latest group in d is full:
    d=[[1]], D=[[1], [1], [2wy], [1x]]
c='z'
    d=[[1z], [1]], D=[[1], [1z], [2wy], [1x]]
latest group in d is full:
    d=[[1]], D=[[1], [1z], [2wy], [1x]]
c='v'
    d=[[1v]], D=[[1v], [1z], [2wy], [1x]]
latest group in d is full:
    d=[], D=[[1v], [1z], [2wy], [1x]]
print D in order:
    '1v1z2wy1x'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.