Развернуть сокращенно увеличивающиеся целочисленные последовательности


18

При вводе списка чисел в формате сокращенно увеличивающейся последовательности целых чисел выведите последовательность полностью.

Сокращенно увеличивающий формат последовательности целых чисел работает, находя каждое число n с меньшим количеством цифр, чем число, предшествующее ему, m . С d в качестве количества цифр в n , последние d цифр m заменяются всеми цифрами n . Вот пример ввода:

123 45 6 7 89 200

Применяя правило замены, мы сначала превращаем 45 в 145, потому что 45 <123:

123 145 6 7 89 200

Повторно применяя то же правило, это становится:

123 145 146 7 89 200
123 145 146 147 89 200
123 145 146 147 189 200

Последовательность теперь отсортирована (нет чисел, к которым применяется правило), так что это окончательный результат.

Вы можете предположить, что

  • сокращенная запись всегда используется, когда это возможно. Например, ввод будет 12 3, никогда 12 13.

  • числа никогда не будут уменьшаться при сохранении того же количества цифр. Например, ввода никогда не будет 333 222.

  • применение правила сокращения никогда не приведет к числу, которое будет все еще меньше, чем предыдущее число в последовательности. Например, ввода никогда не будет 123 12.

  • числа всегда будут положительными целыми числами и никогда не будут содержать начальные 0 (если используется формат строки).

  • полная расширенная последовательность никогда не будет содержать повторяющихся чисел. (Тем не менее, сокращенная последовательность может быть; например, 10 1 20 1-> 10 11 20 21.)

  • на входе будет хотя бы одно число.

Ввод и вывод могут быть либо списками / массивами чисел / строк, либо одной строкой с элементами, разделенными любой нецифровой цифрой.

Поскольку это , победит самый короткий код в байтах.

Контрольные примеры с вводом и выводом на чередующихся строках:

1 2 3 10 1 2 20 5 100 200 10 3 5 26 9 99 999 9999
1 2 3 10 11 12 20 25 100 200 210 213 215 226 229 299 999 9999
223 1184 334 441 5 927 2073 589 3022 82 390 5 9
223 1184 1334 1441 1445 1927 2073 2589 3022 3082 3390 3395 3399
5 10 5 20 5 30 5 40 5 50 5
5 10 15 20 25 30 35 40 45 50 55
7 8 9 70 80 90 700 800 900 7000 8000 9000
7 8 9 70 80 90 700 800 900 7000 8000 9000
42
42

Задача довольно старая, но а) вход может быть пустым? б) может ли вход содержать только одно число?
Эрик Outgolfer

@EriktheOutgolfer Я пойду дальше и скажу, что на входе будет ≥1 числа.
Дверная ручка

Ответы:


7

Желе, 7 байт

DUṛ"\UḌ

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это устроено

DUṛ"\UḌ  Main link. Input: A (list of integers)

D        Convert each integer to a list of its base 10 digits.
 U       Reverse each digit list.
    \    Do a cumulative reduce, applying the dyadic link to the left:
   "       For each pair of corresponding digits:
  ṛ          Select the right one.
           Vectorization leaves digits that do not have a counterpart untouched.
     U   Reverse the resulting digit arrays.
      Ḍ  Convert from base 10 to integer.

5

Javascript, 45 42 байта

3 байта от спасибо @Neil .

a=>a.map(x=>z=z.slice(0,-x.length)+x,z='')

Вышеприведенная функция ожидает массив строк.


1
Сохраните 4 байта, используя z=z.slice(0,-x.length)+x,z=''(или имя переменной по вашему выбору).
Нил

@Neil. Хороший! Я знал, что должен быть способ сделать это
удалено

(Извините за неправильный подсчет сохранения.) Кроме того, строковая версия не нужна, поскольку оказывается, что s=>s.split` `.map(она на 2 байта (я дважды проверил на этот раз) короче, чем s=>s.replace(/\d+/g,.
Нил

@Neil. Действительная точка. Я просто оставил его там, потому что был моей первой целью при ответе ... но вы правы
удалено

1

Сетчатка, 45 байт

+`(?=(?<1>\d)+)(?<=(\d)(?(1)x)(?<-1>\d)+ )
$1

Использует балансировочные группы для подсчета цифр, которые стоят дорого. Лучшего подхода пока не нашел, но я заинтересован в нем.

Попробуйте это онлайн здесь.


0

Гема, 35 знаков

<D>=@set{p;@fill-right{${p;};$0}}$p

Ввод: строка с числами, разделенными чем-либо, выходная строка.

Образец прогона:

bash-4.3$ gema '<D>=@set{p;@fill-right{${p;};$0}}$p' <<< '123 45 6 7 89 200'
123 145 146 147 189 200

0

Рубин, 39 знаков

->a{l='';a.map{|c|l=l[0..-c.size-1]+c}}

Вход: массив строк, вывод: массив строк.

Образец прогона:

2.1.5 :001 > ->a{l='';a.map{|c|l=l[0..-c.size-1]+c}}[%w{123 45 6 7 89 200}]
 => ["123", "145", "146", "147", "189", "200"] 

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.