Analizuj zagnieżdżone ciągi znaków ołowiu

16

Zadanie

Ciąg Sjest konstruowany w następujący sposób:

  1. Zacznij od Sbycia pustym ciągiem.
  2. Wstaw w pewnej pozycji Sciągu formularza ds, gdzie djest niezerową cyfrą i sjest ciągiem dmałych liter ASCII. Mówimy dsto składnik stanowi S.
  3. Przejdź do kroku 2 lub zatrzymaj.

Twoim zadaniem jest pobranie takiego ciągu jako danych wejściowych i wyprowadzenie jego składników połączonych w jeden ciąg, w kolejności występowania ich wiodących cyfr. Dane wyjściowe muszą być pojedynczym łańcuchem i między elementami nie mogą znajdować się żadne separatory (w tym znaki nowej linii). Możesz wybrać, czy ciągi wejściowe i wyjściowe mają cudzysłowy. Zauważ, że wejście i wyjście nigdy nie będzie puste.

Przykład

Stwórzmy ciąg z powyższym procesem. Struktura składników jest podkreślona w wyniku końcowym.

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

Dane wyjściowe uzyskuje się przez połączenie składników w kolejności ich cyfr. W takim przypadku poprawne wyjście to

"1x3abc3tty2gh"

Zasady i punktacja

Możesz napisać pełny program lub funkcję. wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Przypadki testowe

1k -> 1k
4asdf -> 4asdf
111xyz -> 1z1y1x
8whatever3yes -> 8whatever3yes
8what3yesever -> 8whatever3yes
1x33ttya2ghbc -> 1x3abc3tty2gh
63252supernestedstrings2ok -> 6trings3eds2st5perne2su2ok
9long3yes4lo2ngwords11here -> 9longrdsre3yes4lowo2ng1e1h
9abc8de7fg6hi5jk4lm3o2pq1rstuvwxyzabcdefghijklmnopqrst -> 9abcopqrst8deijklmn7fgdefgh6hizabc5jkwxy4lmuv3ost2pq1r
Zgarb
źródło

Odpowiedzi:

2

JavaScript (ES6), 68 bajtów

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

Wyjaśnienie

Oparty na prostej koncepcji:

  • Dopasuj ostatnią cyfrę, na następnie nlitery w ciągu wejściowym
  • Usuń go z ciągu wejściowego i dodaj na początku ciągu wyjściowego
  • Powtarzaj, aż łańcuch wejściowy będzie pusty

Rekursja była najkrótszym sposobem na zrobienie tego w 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>

użytkownik 81655
źródło
0

Haskell , 89 bajtów

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)

Wypróbuj online! Przykładowe użycie: fst.p $ "1x33ttya2ghbc"daje "1x3abc3tty2gh".

Laikoni
źródło
0

Python 3 , 173 159 bajtów

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

Wypróbuj online!

Prawdopodobnie nie jest to najbardziej golfowa implementacja Pythona.

Logika jest prawie prosta: skanuje ciąg. Kiedy znajdzie cyfrę, zaczyna dodawać kolejne znaki, tyle, ile jest to wymagane (tj. Do momentu, gdy liczba odpowiada cyfrze). Jeśli napotka cyfry przed zakończeniem zadania, dodaje je do licznika odpowiadającego liczbie znaków do pominięcia. Kiedy licznik osiągnie zero, wraca do dodawania znaków (tj. Do momentu, gdy liczba odpowiada początkowej cyfrze).

Uwaga: Oszczędność 14 bajtów dzięki Wheat Wizard i HyperNeutrino

Nie dotyczy
źródło
1
Dla jednej linii, jeśli instrukcje nie wymagają na przykład podawania linii if z in k:m+=N(z)+1.
Post Rock Garf Hunter
1
Usunięcie N=intfaktycznie oszczędza 2 bajty. Zmiana nazwy intjest korzystna dopiero po 4 użyciach.
HyperNeutrino
0

Java 8, 152 bajty

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

Wyjaśnienie:

Wypróbuj tutaj.

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
Kevin Cruijssen
źródło
0

Python 2 , 151 147 135 bajtów

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)

Wypróbuj online!

Wyjaśnienie:

Kod przechowuje dwie listy grup składowych, d and D .

Następnie skanowany jest każdy znak ciągu:

  • Jeśli jest to cyfra, nowa grupa jest dodawana do obu list
  • W przeciwnym razie postać zostanie dodana do najnowszej grupy w d

Gdy grupa ma taką samą długość jak jej cyfra, grupa jest usuwana d .

Na koniec Dkonkatenowane, ponieważ grupy w Dsą w oryginalnej kolejności.

Przykład:

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'
TFeld
źródło