แยกสตริงนำไปสู่หลักที่ซ้อนกัน


16

งาน

สตริงSถูกสร้างขึ้นด้วยกระบวนการต่อไปนี้:

  1. เริ่มต้นด้วยSการเป็นสตริงว่าง
  2. แทรกที่ตำแหน่งบางส่วนของSสตริงของแบบฟอร์มdsโดยที่dเป็นตัวเลขที่ไม่ใช่ศูนย์และsเป็นสตริงdตัวอักษร ASCII ตัวพิมพ์เล็ก เราบอกว่าdsเป็นส่วนประกอบ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

JavaScript (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

ลองออนไลน์!

อาจไม่ใช่การนำ Python มาใช้มากที่สุด

ตรรกะค่อนข้างตรงไปตรงมา: มันจะสแกนสตริง เมื่อพบตัวเลขมันจะเริ่มเพิ่มตัวอักษรที่ตามมาให้มากที่สุดเท่าที่ต้องการ (เช่นจนกว่าจำนวนจะตรงกับหลัก) หากพบตัวเลขก่อนที่จะทำงานให้เสร็จจะเพิ่มลงในตัวนับที่สอดคล้องกับจำนวนอักขระที่จะข้าม เมื่อตัวนับถึงศูนย์มันจะกลับไปเพิ่มตัวอักษร (เช่นจนกว่าจำนวนจะสอดคล้องกับหลักเริ่มต้น)

หมายเหตุ: บันทึกแล้ว 14 ไบต์ขอบคุณ Wheat Wizard และ HyperNeutrino


1
if z in k:m+=N(z)+1สำหรับหนึ่งบรรทัดถ้างบคุณไม่จำเป็นต้องเลื่อนบรรทัดตัวอย่างเช่น
โพสต์ Rock Garf Hunter

1
การลบN=intอันที่จริงช่วยให้คุณประหยัด 2 ไบต์ การเปลี่ยนชื่อintจะมีประโยชน์หลังจากการใช้ 4 ครั้งเท่านั้น
HyperNeutrino

0

Java 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

Python 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.