Розбираємо вкладені рядки з цифровим відведенням


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

Пітон 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 байт завдяки пшеничному майстру та 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.