İç içe basamaklı satır dizelerini ayrıştırma


16

Görev

SAşağıdaki işlemle bir dize oluşturulur:

  1. SBoş dize olmakla başlayın .
  2. Bazı pozisyonda yerleştirin Sformun bir dize ds, dbir sıfırdan farklı rakamdır ve sdizesidir dküçük ASCII harfler. Biz demek dsbir olan kurucu ait S.
  3. 2. adıma gidin veya durun.

Göreviniz girdi olarak böyle bir dize almak ve bileşenlerini, önde gelen basamaklarının görünümü sırasına göre tek bir dize halinde birleştirmektir. Çıktı tek bir dize olmalıdır ve bileşenler arasında herhangi bir sınırlayıcı (yeni satırlar dahil) olamaz. Giriş ve çıkış dizgilerinde tırnak olup olmadığını seçebilirsiniz. Giriş ve çıkışın asla boş olmayacağını unutmayın.

Misal

Yukarıdaki işlemle bir dize oluşturalım. Bileşenlerin yapısı nihai sonuçta vurgulanmıştır.

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

Çıktı, bileşenlerin basamak sırasına göre birleştirilmesiyle elde edilir. Bu durumda, doğru çıktı

"1x3abc3tty2gh"

Kurallar ve puanlama

Tam bir program veya işlev yazabilirsiniz. en düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test senaryoları

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

Yanıtlar:


2

JavaScript (ES6), 68 bayt

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

açıklama

Basit bir konsepte dayanarak:

  • Son basamağı ve nardından ngiriş dizesindeki harfleri eşleştir
  • Giriş dizesinden kaldırın ve çıkış dizesinin başına ekleyin
  • Giriş dizesi boşalana kadar tekrarlayın

Yineleme, bunu JavaScript'te yapmanın en kısa yoluydu.

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 bayt

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)

Çevrimiçi deneyin! Örnek kullanım: fst.p $ "1x33ttya2ghbc"verim "1x3abc3tty2gh".


0

Python 3 , 173159 bayt

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

Çevrimiçi deneyin!

Muhtemelen en golf Python uygulaması değil.

Mantık neredeyse basittir: dizeyi tarar. Bir rakam bulduğunda, takip eden karakterleri gerektiği kadar eklemeye başlar (yani sayı basamağa karşılık gelene kadar). Görevi tamamlamadan önce rakamlarla karşılaşırsa, atlanacak karakter sayısına karşılık gelen bir sayaca ekler. Sayaç sıfıra ulaştığında, karakter eklemeye geri döner (yani, sayı ilk basamağa karşılık gelene kadar).

Not: Buğday Sihirbazı ve HyperNeutrino sayesinde 14 bayt tasarruf


1
Bir satırlık ifadelerde, örneğin bir satır beslemesine ihtiyacınız yoktur if z in k:m+=N(z)+1.
Rock Garf Hunter Post

1
Kaldırma işlemi N=int2 bayt tasarruf etmenizi sağlar. Yeniden adlandırma intyalnızca 4 kullanımdan sonra faydalıdır.
HyperNeutrino

0

Java 8, 152 bayt

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

Açıklama:

Burada deneyin.

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 bayt

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)

Çevrimiçi deneyin!

Açıklama:

Kod, kurucu grupların iki listesini tutar, d and D .

Daha sonra dizenin her karakteri taranır:

  • Rakamsa, her iki listeye de yeni bir grup eklenir
  • Aksi takdirde, karakter en son gruba eklenir. d

Bir grup, rakamıyla aynı uzunluğa sahip olduğunda, grup d .

Sonunda, Dgruptaki gibiD orijinal sırada .

Misal:

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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.