Разобрать вложенные цепочки цифр

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
Zgarb
источник

Ответы:

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>

user81655
источник
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

NofP
источник
1
Например, для одной строки, если вы не нуждаетесь в переводе строки if z in k:m+=N(z)+1.
Пост Рок Гарф Хантер
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'
TFeld
источник