Phân tích cú pháp chuỗi chữ số lồng nhau


16

Nhiệm vụ

Một chuỗi Sđược xây dựng theo quy trình sau:

  1. Bắt đầu với Schuỗi trống.
  2. Chèn tại một số vị trí của Smột chuỗi của biểu mẫu ds, trong đó dlà một chữ số khác và slà một chuỗi các dchữ cái ASCII viết thường. Chúng tôi nói dslà một thành phần của S.
  3. Chuyển đến bước 2 hoặc dừng lại.

Nhiệm vụ của bạn là lấy một chuỗi như vậy làm đầu vào và xuất các thành phần của nó được nối thành một chuỗi, theo thứ tự xuất hiện các chữ số hàng đầu của chúng. Đầu ra phải là một chuỗi đơn và không thể có bất kỳ dấu phân cách nào (bao gồm cả dòng mới) giữa các thành phần. Bạn có thể chọn xem chuỗi đầu vào và đầu ra có dấu ngoặc kép hay không. Lưu ý rằng đầu vào và đầu ra sẽ không bao giờ trống.

Thí dụ

Hãy xây dựng một chuỗi với quy trình trên. Cấu trúc của các thành phần được nêu bật trong kết quả cuối cùng.

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
     └┘│└┴┴┘│└┴┘││
       └────┴───┴┘

Đầu ra thu được bằng cách ghép các thành phần theo thứ tự các chữ số của chúng. Trong trường hợp này, đầu ra chính xác là

"1x3abc3tty2gh"

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

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

Câu trả lời:


2

JavaScript (ES6), 68 byte

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

Giải trình

Dựa trên một khái niệm đơn giản:

  • Khớp chữ số cuối cùng ntheo sau bởi ncác chữ cái trong chuỗi đầu vào
  • Xóa nó khỏi chuỗi đầu vào và thêm nó vào đầu chuỗi đầu ra
  • Lặp lại cho đến khi chuỗi đầu vào trống

Đệ quy là cách ngắn nhất để làm điều này trong 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 byte

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

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

Có lẽ không phải là triển khai Python tốt nhất.

Logic gần như đơn giản: nó quét chuỗi. Khi tìm thấy một chữ số, nó bắt đầu thêm các ký tự theo sau, bao nhiêu là bắt buộc (nghĩa là cho đến khi số tương ứng với chữ số). Nếu nó gặp các chữ số trước khi hoàn thành nhiệm vụ, nó sẽ thêm chúng vào một bộ đếm tương ứng với số lượng ký tự cần bỏ qua. Khi bộ đếm về 0, nó sẽ quay trở lại để thêm các ký tự (nghĩa là cho đến khi số đếm tương ứng với chữ số ban đầu).

Lưu ý: Đã lưu 14 byte nhờ Wheat Wizard và HyperNeutrino


1
Ví dụ, đối với một dòng nếu bạn không cần một nguồn cấp dữ liệu if z in k:m+=N(z)+1.
Phù thủy lúa mì

1
Loại bỏ N=intthực sự giúp bạn tiết kiệm 2 byte. Đổi tên intchỉ có lợi sau 4 lần sử dụng.
HyperNeutrino

0

Java 8, 152 byte

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

Giải trình:

Hãy thử nó ở đây.

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

Python 2 , 151 147 135 byte

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)

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

Giải trình:

Mã giữ hai danh sách các nhóm cấu thành , d and D.

Mỗi ký tự của chuỗi sau đó được quét:

  • Nếu là chữ số, một nhóm mới sẽ được thêm vào cả hai danh sách
  • Mặt khác, nhân vật được thêm vào nhóm mới nhất trong d

Khi một nhóm có cùng độ dài với chữ số của nó, nhóm sẽ bị xóa khỏi d.

Cuối cùng, phần Dđược nối, vì các nhóm theo Dthứ tự ban đầu.

Thí 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'
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.