Mengurai string digit-lead bersarang


16

Tugas

Sebuah string Sdibangun dengan proses berikut:

  1. Mulailah dengan Smenjadi string kosong.
  2. Masukkan pada beberapa posisi Sstring bentuk ds, di mana dadalah digit bukan nol dan sstring dhuruf ASCII huruf kecil. Kami katakan dsadalah konstituen dari S.
  3. Lanjutkan ke langkah 2 atau berhenti.

Tugas Anda adalah untuk mengambil string seperti input, dan output konstituennya digabungkan menjadi satu string, dalam urutan penampilan digit utama mereka. Output harus berupa string tunggal, dan tidak boleh ada pembatas (termasuk baris baru) di antara konstituen. Anda dapat memilih apakah string input dan output memiliki kutipan. Perhatikan bahwa input dan output tidak akan pernah kosong.

Contoh

Mari kita membangun string dengan proses di atas. Struktur konstituen disorot dalam hasil akhir.

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

Output diperoleh dengan menggabungkan konstituen dalam urutan digit mereka. Dalam hal ini, output yang benar adalah

"1x3abc3tty2gh"

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. jumlah byte terendah menang, dan celah standar tidak diizinkan.

Uji kasus

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

Jawaban:


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

Penjelasan

Berdasarkan konsep sederhana:

  • Cocokkan digit terakhir ndiikuti dengan nhuruf dalam string input
  • Hapus dari string input dan tambahkan ke awal string output
  • Ulangi sampai string input kosong

Rekursi adalah cara terpendek untuk melakukan ini dalam 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

Haskell , 89 byte

fst.p
p(d:s)|(h,(g,r))<-p<$>span('9'<)s,(a,b)<-splitAt(read[d])$h++r=(d:a++g,b)
p e=(e,e)

Cobalah online! Contoh penggunaan: fst.p $ "1x33ttya2ghbc"hasil "1x3abc3tty2gh".


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

Cobalah online!

Mungkin bukan implementasi Python golf.

Logikanya hampir langsung: ia memindai string. Ketika menemukan angka itu mulai menambahkan karakter yang mengikuti, sebanyak yang diperlukan (yaitu sampai hitungan sesuai dengan digit). Jika bertemu digit sebelum menyelesaikan tugas, itu menambahkannya ke penghitung yang sesuai dengan jumlah karakter untuk dilewati. Ketika penghitung mencapai nol, itu kembali ke menambahkan karakter (yaitu sampai hitungan sesuai dengan digit awal).

Catatan: Disimpan 14 byte berkat Wheat Wizard dan HyperNeutrino


1
Untuk satu baris jika pernyataan, Anda tidak memerlukan umpan baris misalnya if z in k:m+=N(z)+1.
Post Rock Garf Hunter

1
Menghapus yang N=intsebenarnya menghemat 2 byte. Mengganti nama inthanya bermanfaat setelah 4 penggunaan.
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;}

Penjelasan:

Coba di sini.

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)

Cobalah online!

Penjelasan:

Kode menyimpan dua daftar kelompok konstituen d and D,.

Setiap karakter string kemudian dipindai:

  • Jika ini digit, grup baru ditambahkan ke kedua daftar
  • Jika tidak, karakter ditambahkan ke grup terbaru di d

Ketika grup memiliki panjang yang sama dengan digitnya, grup tersebut dihapus dari d.

Pada akhirnya, Ddigabungkan, karena kelompok-kelompok di Dberada dalam urutan asli.

Contoh:

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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.